我想使用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之间吗? 哪一个是最佳实现,哪一个应该使用?
答案 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,因为元素的原始位置很重要。