离散相似度量的算法

时间:2011-02-24 20:10:24

标签: algorithm comparison machine-learning similarity

鉴于我有两个列表,每个列表包含一个公共超集的单独子集,是 有一个算法给我一个相似性测量?

示例:

<=> A = {John,Mary,Kate,Peter}和B = {Peter,James,Mary,Kate}

这两个名单有多相似?请注意,我不知道常见超集的所有元素。

更新: 我不清楚,我可能以一种草率的方式使用'set'这个词。我很抱歉。 澄清:秩序很重要。 如果相同的元素在列表中占据相同的位置,则我们对该元素具有最高的相似性。 相似性降低了相同元素的距离越远。 如果元素仅存在于其中一个列表中,则相似性甚至更低。

我甚至可以添加额外的维度,即较低的索引具有更大的值,因此aa [1] == b [1]的价值超过[9] == b [9],但这主要是因为我我很好奇。

5 个答案:

答案 0 :(得分:13)

Jaccard Index aka Tanimoto系数)正好用于OP问题中所述的用例。

Tanimoto coeff, tau 等于 Nc 除以 Na + Nb - Nc

tau = Nc / (Na + Nb - Nc)
  • Na ,第一组中的项目数

  • Nb ,第二组中的项目数

  • Nc ,两组的交集,或唯一项目的数量 a和b共同

这里的Tanimoto编码为Python函数:

def tanimoto(x, y) :
  w = [ ns for ns in x if ns not in y ]
  return float(len(w) / (len(x) + len(y) - len(w)))

答案 1 :(得分:2)

我会探讨两种策略:

  1. 将列表视为集合并应用集合操作(​​交集,差异)
  2. 将列表视为符号字符串并应用Levenshtein算法

答案 2 :(得分:1)

如果你真的有(即,一个元素只是存在或不存在,没有附加计数)并且只有两个,只需添加共享元素的数量并除以总数元素的数量可能与它一样好。

如果你有(或可以得到)计数和/或两个以上的计数,你可以比cosine simliarityTFIDF更好一些(术语频率*倒置文档频率) )。

后者试图对所有(或几乎)所有“文件”中出现的单词给予较低的权重 - 即单词集。

答案 3 :(得分:0)

您对“相似度测量”的定义是什么?如果你想要的只是集合中有多少项是相同的,你可以找到A和B的基数,将基数加在一起,并从A和B的并集的基数中减去。

答案 4 :(得分:0)

如果订单有问题,您可以使用Levenshtein distance或其他类型Edit distance