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

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学