Jaccard Index Python

时间:2018-03-13 11:35:03

标签: python set distance normalization similarity

我想使用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之间吗? 哪一个是最佳实现,哪一个应该使用?

1 个答案:

答案 0 :(得分:0)

来自文档:

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}。在此之后,becames等于{0,1,2,3,5},因为使用set会导致数据的自动排序。 a和b彼此独立地排序,结果,相似性不是在原始列表之间计算,而是在不同列表之间计算。所以你不能使用set,因为元素的原始位置很重要。