在minhashlsh的spark实现中,每个频带中的行数始终为1

20jt8wwn  于 2021-05-26  发布在  Spark
关注(0)|答案(1)|浏览(851)

我试图理解spark中的minhash lsh实现, org.apache.spark.ml.feature.MinHashLSH .
这两个文件似乎最相关:minhashlsh.scala和lsh.scala。
要使用minhashlsh,医生说需要 numHashTables 参数,它是
param表示lsh或放大中使用的哈希表数。
我的理解是hashfunction方法为每个输入示例计算minhash签名(例如,表示文档的单个/标记的集合),例如。

data = [
    (0, Vectors.sparse(6, [0, 1, 2], [1.0, 1.0, 1.0])),
    (1, Vectors.sparse(6, [2, 3, 4], [1.0, 1.0, 1.0])),
]

df = spark.createDataFrame(data, ["id", "features"])

mh = MinHashLSH(inputCol='features', outputCol='hashes', numHashTables=5)
mh_model = mh.fit(df)
mh_model.transform(df).show(truncate=False)

输出:

+---+-------------------------+---------------------------------------------------------------------------------+
|id |features                 |hashes                                                                           |
+---+-------------------------+---------------------------------------------------------------------------------+
|0  |(6,[0,1,2],[1.0,1.0,1.0])|[[3.84540858E8], [5.873031E8], [6.9646868E8], [3.95377821E8], [1.050129459E9]]   |
|1  |(6,[2,3,4],[1.0,1.0,1.0])|[[3.19950681E8], [1.87323383E8], [1.237542508E9], [6.11223988E8], [2.07958525E8]]|
+---+-------------------------+---------------------------------------------------------------------------------+

所以呢 numHashTables 使用的哈希函数数/每个输入示例的minhash签名长度。
但我还没有看到任何与代码中的“海量数据集挖掘”一书第3章介绍的绑定技术相关的内容。带状技术基本上将每个示例的所有minhash值划分为 br 在每个波段中的行,因此 r 以及 b 应等于使用的哈希函数数。调谐 b 以及 r 在计算候选对时包含假阳性或假阴性具有重要意义。
从我看到同一个孩子 approxNearestNeighbors 两个数据集加入 approxSimilarityJoin 实现时,看起来行数总是假设为一,那么带数等于散列函数的个数,即。 numHashTables ,这也与 numHashTables 用于lsh或放大。
但是,如果 r 总是一个,假设 numHashTables=10 ,我们可以计算jarccard距离(aka。 keyDistanceMinHashLSH )对于更多的对(假阳性,相关代码在这里)比我们需要基于方程 Pr = 1 - (1 - s^r)^b 哪里 Pr 是一对相似性(不是距离)为 s 散列到同一个桶。
所以我想确认我的理解是否正确:在 org.apache.spark.ml.feature.MinHashLSH ,和 numHashTables 等于用于计算minhash签名的哈希函数数和用于位置敏感哈希的带/哈希表数。

qc6wkl3g

qc6wkl3g1#

我看到了https://spark.apache.org/docs/latest/ml-features#feature-转变
outputcol的类型是seq[vector],其中数组的维数等于numhashtables,并且向量的维数当前设置为1。在未来的版本中,我们将实现和放大,以便用户可以指定这些向量的维数。
所以看起来每个波段的行数(用于放大)确实设置为1。

相关问题