jaccard的计算方法辨析 jaccard系数是在数据挖掘中常用的一个指标,但是对于基于向量的jaccard系数计算方法与基于集合的jaccard计算方法是不一样的。笔者也是在读一篇论文的代码时发现的这个差别,下面我将具体的探讨一下这两种计算方法的不同。以便在以后的矩阵或者向量计算中入坑导致实验的错误。 因为我对基于向量的计算方法特别感兴趣,所以就首先介绍基于向量的jaccard系数计算方法。
1、 基于向量的jaccard系数计算方法 向量的计算方法与集合的计算方法还是有差别的,如果两者用同样的方法计算做出来的结果就会有问题。下面我举例子说明: 假如 A=(1,0,0)B=(0,1,0)则A∩B=(0,0,0),A∪B=(1,1,0)。从结果我们可以看出对于向量的集合运算,两个向量取交集即为向量对应索引位置上的元素做与运算,两个向量取并集即为对应向量索引做或运算。那么在jaccard系数计算公式中 |A∩B|的绝对值符号就表示经计算后向量中不为0元素的个数,所以最终J(A,B)= 0 / 2 = 0。 接下来用代码展示一下:
from numpy import * import scipy.spatial.distance as dist # 导入scipy距离公式 matV = mat([[1, 1, 0, 1, 0, 1, 0, 0, 1], [0, 1, 1, 0, 0, 0, 1, 1, 1]]) print("dist.jaccard:", 1 - dist.pdist(matV, 'jaccard')) dist.jaccard: [0.25] # 下面使用集合运算方法做的错误示例,需要注意 a = [1, 1, 0, 1, 0, 1, 0, 0, 1] b = [0, 1, 1, 0, 0, 0, 1, 1, 1] c = len(set(a) & set(b))/len(set(a) | set(b)) print(c)本节内容主要参考了这位博主的资料,有兴趣的可以看一下这个博主的详细解释另一位博主的解释。
2、 基于集合的jaccard系数计算方法 下面是百度百科对jaccard的定义 计算方式挺简单的就是集合的交和并操作,我在上面的实力代码中做的错误的示范就是基于集合的计算方法,因此在这里就不再赘述了。
3、 jaccard距离衡量数据相似性的思考 jaccard距离的计算方法只适用于0-1矩阵,它在计算的过程中过滤了0-0匹配。除此之外,它与汉明距离的区别在与汉明距离关注0-0匹配。因为笔者是从事药物筛选研究,举个例子:如果两种药物都不能产生同一种副作用,你也不能认为这两种药物具有相关性或者它们存在相似的信息。所以在有些数据衡量的时候必须用jaccard距离并不是随便去尝试。