杰卡德指数 Python

Jaccard Index Python

我想使用 Jaccard Index 来查找两个集合之间的相似性。 我在这里找到了 Jaccard Index 实现:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_similarity_score.html 但是库函数的输入必须是 List,而在我的例子中我更喜欢 Set.

我写了这段代码:

from sklearn.metrics import jaccard_similarity_score



def jaccard_index(first_set, second_set):
    """ Computes jaccard index of two sets
        Arguments:
          first_set(set):
          second_set(set):
        Returns:
          index(float): Jaccard index between two sets; it is
            between 0.0 and 1.0
    """
    # If both sets are empty, jaccard index is defined to be 1
    index = 1.0
    if first_set or second_set:
        index = (float(len(first_set.intersection(second_set)))
             / len(first_set.union(second_set)))

    return index

y_pred = [0, 2, 1, 3, 5]
y_true = [0, 1, 2, 3, 7]
a={0,2,1,3,5}
b={0,1,2,3,7}
print jaccard_similarity_score(y_true, y_pred)
print jaccard_similarity_score(y_true, y_pred, normalize=False)
print(jaccard_index(a,b))

这些是 3 打印的输出:

0.4
2
0.666666666667

为什么它们与我的实现不同 (0.666666666667)? 为什么第二个结果是2? Jaccard 指数不应该在 0 和 1 之间吗? 哪一个是最好的实现,我应该使用哪一个?

来自文档:

If normalize == True, return the average Jaccard similarity coefficient,
else it returns the sum of the Jaccard similarity coefficient over the sample set.

顺便看看sklearn实现的代码here

__

我现在看到了主要问题 - 这是由于集的性质。你有行 a={0,2,1,3,5}。之后 a 变为等于 {0, 1, 2, 3, 5},因为使用 set 会导致数据自动排序。 a 和 b 彼此独立排序,因此相似性不是在原始列表之间计算的,而是在不同列表之间计算的。所以你不能使用set,因为元素的原始位置很重要。