相似度计算之杰卡德相似度
Jaccard index, 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。
杰卡德相似系数
两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标(余弦距离也可以用来衡量两个集合的相似度)。
Python实现:
1 2 3 4 5 6 7 8 | 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']
|
另外sklearn中也有相关实现,但是要求数据进行过encode处理,而且两个数组的长度也必须一样。
杰卡德距离
杰卡德距离(Jaccard Distance) 是用来衡量两个集合差异性的一种指标,它是杰卡德相似系数的补集,被定义为1减去Jaccard相似系数。
杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
杰卡德系数扩展:Tanimoto系数
Tanimoto系数由Jaccard系数扩展而来,又称为广义Jaccard相似系数,计算方式如下:
其中A、B分别表示为两个向量,集合中每个元素表示为向量中的一个维度,在每个维度上,取值通常是[0, 1]之间的值(如果取值是二值向量0或1,那么Tanimoto系数就等同Jaccard距离),表示向量乘积,表示向量的模,即
Tanimoto系数容易与余弦相似度混淆在Tanimoto系数计算公式中,如果把分母的去掉,并将替换为,就转成了余弦相似度(cosine similarity)。
Tanimoto系数Python实现:
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np def tanimoto_coefficient(p_vec, q_vec): """ This method implements the cosine tanimoto coefficient metric :param p_vec: vector one :param q_vec: vector two :return: the tanimoto coefficient between vector one and two """ pq = np.dot(p_vec, q_vec) p_square = np.linalg.norm(p_vec) q_square = np.linalg.norm(q_vec) return pq / (p_square + q_square - pq) |
参考资料:
备注 : 这里的分母,作者写错多了平方。