Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更快地实施LSH(AND-OR)_Python_Locality Sensitive Hash_Minhash - Fatal编程技术网

Python 更快地实施LSH(AND-OR)

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

我有一个大小为(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秒)。我认为有必要优化这一部分,如果可能的话,用数据进行适当的缩放。我认为检查字典中是否已经存在密钥是代码中负责此操作的部分


更新:我通过避免检查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'