【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 }$$

应用层面

非对称二元属性的相似性

在数据挖掘领域,常常需要比较两个具有布尔值属性的对象之间的距离,Jaccard距离就是常用的一种方法。

给定两个比较对象A,B。

A,B 均有n个二元属性,即每个属性取值为{0,1}。

定义如下4个统计量:

  1. M00 :A,B属性值同时为0的属性个数;
  2. M01:A属性值为0且B属性值为1的属性个数;
  3. M10:A属性值为1且B属性值为0的属性个数;
  4. M11:A,B属性值同时为1的属性个数;

其中,M 00 + M 01 + M 10 + M 11 = n

Jaccard 系数:

$$ J(A, B)=\frac{M_{11}}{M_{01}+M_{10}+M_{11}} $$

对于这里Jaccard 系数的分子为什么只有M 01 + M 10 + M 11 ,而没有 M 00 ,这是因为我们求的是非对称二元属性的相似度,这里只有非0值才受关注,其中A,B两个属性的交集都为0,并不需要用到。

主要应用场景:

  1. 比较文本相似度,用于文本查重与去重;
  2. 计算对象间距离,用于数据聚类等。

项目相似性度量是协同过滤系统的核心。 相关研究中,基于物品协同过滤系统的相似性度量方法普遍使用余弦相似性。 然而,在许多实际应用中,评价数据稀疏度过高,物品之间通过余弦相似度计算会产生误导性结果。 将杰卡德相似性度量应用到基于物品的协同过滤系统中,并建立起相应的评价分析方法。 与传统相似性度量方法相比,杰卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端,特别适合于应用到稀疏度过高的数据。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn