Python 更快地实施LSH(AND-OR)
我有一个大小为(1600003200)的数据集,其中所有元素要么为零,要么为一。我想找到类似的候选人。我已经使用Minhash和one-for循环将其哈希到(160000200),大约花了两分钟,我对此很满意。我已经使用从“海量数据集挖掘”第3章学到的AND-OR模式实现了对位置敏感的哈希(LSH),以在for循环中找到使用for循环的候选对,但这需要30分钟。我想减少这次。有没有更快的办法 下面是我如何完成LSH-Minhash签名长度(n)=200, 子签名长度(r)=5,频带数(b)=40 大小为(160000200)的Minhash签名矩阵是一个numpy数组。我的想法是,如果我能便宜地将它转换成(160000,40)数组,其中新数组的每个元素由minhash数组的5个元素组成,那么也许我可以使用numpy.unique()为每个列获取唯一的r_签名,作为候选ID字典的键。我对python和编码都是新手。我想不出一个方法来优化它,让它运行得更快 以下是代码和数据的链接: 注意:我观察到Minhash部分所花费的时间随着数据的增加而线性增加(本例中的用户数),而LSH部分所花费的时间是非线性增加的(前6.25%花费了20.15秒,后6.25%花费了132.3秒)。我认为有必要优化这一部分,如果可能的话,用数据进行适当的缩放。我认为检查字典中是否已经存在密钥是代码中负责此操作的部分Python 更快地实施LSH(AND-OR),python,locality-sensitive-hash,minhash,Python,Locality Sensitive Hash,Minhash,我有一个大小为(1600003200)的数据集,其中所有元素要么为零,要么为一。我想找到类似的候选人。我已经使用Minhash和one-for循环将其哈希到(160000200),大约花了两分钟,我对此很满意。我已经使用从“海量数据集挖掘”第3章学到的AND-OR模式实现了对位置敏感的哈希(LSH),以在for循环中找到使用for循环的候选对,但这需要30分钟。我想减少这次。有没有更快的办法 下面是我如何完成LSH-Minhash签名长度(n)=200, 子签名长度(r)=5,频带数(b)=40
更新:我通过避免检查dict中键的存在来解决这个问题,尽管我在for循环中使用了for循环两次。现在,16万名候选人需要310秒的时间,而且所用的时间随着数据呈线性扩展。我已经在google colab笔记本中更新了相应的代码 你试过使用吗?它实现了Minhash和LSH算法。我最近尝试了这个库,用于在web抓取的联系人数据中查找重复项,它非常容易使用,效果非常好。
bucket-of-ids = 'empty list of dictionaries of
length 40'
for each-user in 160000:
for each-band in 40:
r_signature = string(jth 5 elements)
if r_signature in bucket-of-ids[band]:
'add id of user to dictionary of band
using r_signature as key'
else :
'create r_signature as new key and then
add user id to it as list of values'