我试图理解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值划分为 b
带 r
在每个波段中的行,因此 r
以及 b
应等于使用的哈希函数数。调谐 b
以及 r
在计算候选对时包含假阳性或假阴性具有重要意义。
从我看到同一个孩子 approxNearestNeighbors
两个数据集加入 approxSimilarityJoin
实现时,看起来行数总是假设为一,那么带数等于散列函数的个数,即。 numHashTables
,这也与 numHashTables
用于lsh或放大。
但是,如果 r
总是一个,假设 numHashTables=10
,我们可以计算jarccard距离(aka。 keyDistance
在 MinHashLSH
)对于更多的对(假阳性,相关代码在这里)比我们需要基于方程 Pr = 1 - (1 - s^r)^b
哪里 Pr
是一对相似性(不是距离)为 s
散列到同一个桶。
所以我想确认我的理解是否正确:在 org.apache.spark.ml.feature.MinHashLSH
,和 numHashTables
等于用于计算minhash签名的哈希函数数和用于位置敏感哈希的带/哈希表数。
1条答案
按热度按时间qc6wkl3g1#
我看到了https://spark.apache.org/docs/latest/ml-features#feature-转变
outputcol的类型是seq[vector],其中数组的维数等于numhashtables,并且向量的维数当前设置为1。在未来的版本中,我们将实现和放大,以便用户可以指定这些向量的维数。
所以看起来每个波段的行数(用于放大)确实设置为1。