Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Java 数千个大型数据集的Jaccard相似算法 我需要什么_Java_Algorithm_Hash_Bitset_Cardinality - Fatal编程技术网

Java 数千个大型数据集的Jaccard相似算法 我需要什么

Java 数千个大型数据集的Jaccard相似算法 我需要什么,java,algorithm,hash,bitset,cardinality,Java,Algorithm,Hash,Bitset,Cardinality,我正在寻找一种非常快速和准确的方法,在多个庞大的数据集之间找到Jaccard相似性。我可以进行多达10.000-20.000次计算Jaccard相似性的操作。由于需要在转储这些数据集之后计算所有Jaccard相似性,所以我无法在安静的冬夜用缓慢的算法在后台计算它们 我认为有两种可能的解决办法: 解决方案#1 使用MinHash算法。这个解决方案的问题是速度非常慢。要获得10%的错误,需要使用100个哈希函数。我在这里看到的唯一解决方法是使用单个“昂贵”哈希函数对所有内容进行哈希,而不是在哈希结果

我正在寻找一种非常快速和准确的方法,在多个庞大的数据集之间找到Jaccard相似性。我可以进行多达10.000-20.000次计算Jaccard相似性的操作。由于需要在转储这些数据集之后计算所有Jaccard相似性,所以我无法在安静的冬夜用缓慢的算法在后台计算它们

我认为有两种可能的解决办法:

解决方案#1 使用MinHash算法。这个解决方案的问题是速度非常慢。要获得10%的错误,需要使用100个哈希函数。我在这里看到的唯一解决方法是使用单个“昂贵”哈希函数对所有内容进行哈希,而不是在哈希结果上使用100个“廉价”哈希函数。但是我没有足够的数学背景自己选择它们

问题#1 如何为MinHash选择速度高效的哈希函数集以获得最大错误10%

解决方案#2 使用HyperLogLog或位集计算Jaccard相似性
这种方法的问题在于。位集(即使是稀疏的数据结构)的另一个问题是它在更大的数据集上占用了太多的RAM

我的算法:

  • 选择概率基数估计算法(HyperLogLog或位集)
  • 计算
    set1的可能基数
  • 计算
    set2的可能基数
  • 计算
    set1并集set2
    的可能基数。HyperLogLog和位集都支持合并操作
  • set2
    set1
    =
    (基数(set1)+基数(set2)-基数(set1联合set2))/cardinality(set2)
  • 问题#2 为什么我在比特集和HyperLogLog上得到相同的Jaccard相似性估计偏差。我想如果位集占用更多的空间,它应该具有更高的精度,我错了吗

    问题#3 使用BitSet和HyperLogLog是否不可能使Jaccard相似度偏差小于5%?我做错了什么

    附笔。 1)有一种称为单排列散列的minwise散列变体(请参阅),它只使用一个散列函数。对于元素数量与存储箱数量相比较小的小集合,估计可能会不准确。然而,在这种情况下,可以使用中描述的技术“加密”集合的散列签名


    2) 如中所述,位集实际上是HyperLogLog草图的特例。本文还描述了一种最大似然法,该方法允许更精确地估计两个HyperLogLog草图的并集和交点大小,可用于最终获得Jaccard相似性的估计。

    您的集合有多大?什么是集合元素?(整数/单词/令牌?)有多少组?@joop我正在编写一个应用程序,它将接受用户的数据。数据集实际上是数据库表的列,其中数据库由用户提供。因此,数据集可以是1000到10亿行,其中包含任何数据。一个问题不应该包含一个问题,而应该包含多个问题吗?@GhostCat听起来像是“请帮助我让一切正常工作”。我试图向你解释我的解决方法和我面临的问题。这个问题可以用多种方式解决,因此它包含了多种问题