题目:
计算(1,1,0)、(1,-1,0)、(-1,1,0)两两之间的Jaccard相似度。
特地写下本文是因为大数据课程的作业。
了解一下Jaccard相似系数
Jaccard相似系数( Jaccard similarity coefficient)又称 Jaccard系数( Jaccar Index)。
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的Jaccard相似系数,用符号J(A,B)表示。
Jaccard相似系数是衡量两个集合的相似度一种指标。
即计算两个集合之间的相似程度,元素的“取值”为0或1。
所谓的Jaccard相似度就是Jaccard相似系数。
Jaccard相似度=Jaccard相似系数
Jaccard主要应用场景:
- 推荐系统
- 过滤相似度很高的新闻,或者网页去重
- 考试防作弊系统
- 论文查重系统
Jaccard距离 Jaccard Distance
与杰卡德相似系数相反的概念是Jaccard距离(Jaccard Distance)。杰卡德距离可用如下公式表示:
Jaccard相似系数与Jaccard距离之间的关系:
Jaccard距离是Jaccard相似系数的补集,被定义为
Jaccard距离=1-Jaccard相似系数
*对Jaccard相似系数的介绍,这里有一篇很详细的博客。
推荐算法之Jaccard相似度与Consine相似度 - 程序园www.voidcn.com
但我们遇到的是向量,显然不能用上面的办法。
不多BB,开始吟唱!
我参考了StackExchange上的一个回答
StackExcahnge上的一篇回答
什么是binary vectors?
二元向量,又称二进制向量。想想,二进制是由什么组成?0和1(二元)。
所以狭义Jaccard相似系数应该是只能计算由0和1组成的二元向量。
什么是real-valued vectors?
实值向量,即向量的元素为实数。
那不妨再了解一下实数的定义:
实数,是有理数和无理数的总称。
实数的分类
所以,负整数是实数。
我们再看看题目:
计算(1,1,0)、(1,-1,0)、(-1,1,0)两两之间的Jaccard相似度。
向量中出现了-1,属于实值向量,显然不是二元向量。
也即,不能使用狭义的Jaccard相似系数。
所以我们需要解决实值向量的情况。
于是乎。
我选择了广义Jaccard相似系数。
这个公式就是
分子取小者,分母取大者,求和。
这种方法用最大最小值函数来代替乘积和模计算,
即用向量中每个分量的的最小值和最大值来参与计算。
所以依样画葫芦,我的计算过程如下:
令
所以
直到我用Matlab计算的Jaccard距离之前,我都一直坚信我的计算方式是毫无破绽的,尽管计算结果-1让我一度怀疑。
MATLAB让我瞬间打脸
>> X= [1 1 0; 1 -1 0; -1 1 0]
D= pdist( X , 'jaccard')
运算结果:
Jaccard距离
讲道理。
说实话。
这个结果让我有点难受。
有点迷。
MATLAB都实锤了,我也不好反驳了。
但我仍然存疑。
......
所以答案应该是:
由MATLAB计算出Jaccard距离。
因为,
Jaccard距离=1-Jaccard相似系数
所以,