【2.7.1】集合相似性--杰卡德相似度(Jaccard index)
一、Jaccard index
Jaccard index, 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。
杰卡德相似系数
两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标(余弦距离也可以用来衡量两个集合的相似度)。
$$ J(A,B) = \frac{A ∩ B}{ A ∪ B }$$
Python实现:
def jaccard_sim(a, b):
unions = len(set(a).union(set(b)))
intersections = len(set(a).intersection(set(b)))
return intersections / unions
a = ['x', 'y']
b = ['x', 'z', 'v']
print(jaccard_sim(a, b))
另外sklearn中也有相关实现,但是要求数据进行过encode处理,而且两个数组的长度也必须一样。
Jaccard相似度算法实现
案例
假设A = [1,2,3,4] ,长度为4
假设B = [1,2,5,6] ,长度为4
则AB的公共部分C = [1,2], 长度为2
AB的相似度为:2 / (4 + 4 - 2) = 0.33
代码:
#-*- coding: utf-8 -*-
#user_data为用户信息嵌套字典
#如{'fabrice' : {'water' : 3}}
def sim_tonimoto(user_data, user1, user2):
common = {}
#判断有没有相同的数据, 没有相同数据则返回0
for item in user_data[user1]:
if item in user_data[user2]:
common[item] = 1
if len(common) == 0:
return 0
common_num = len(common)
user1_num = len(user_data[user1])
user2_num = len(user_data[user2])
res = float(common_num)/(user1_num + user2_num - common_num)
return res
杰卡德距离
杰卡德距离(Jaccard Distance) 是用来衡量两个集合差异性的一种指标,它是杰卡德相似系数的补集,被定义为1减去Jaccard相似系数。
$$ J_{δ} = 1- J(A,B) = \frac{A ∪ B - A ∩ B}{ A ∪ B }$$
参考资料
