杰卡德指数 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,因为元素的原始位置很重要。
我想使用 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,因为元素的原始位置很重要。