前言
最近在看一些文章跟代码的时候碰到了余弦距离跟jaccrd距离的概念。刚开始有些混淆不清楚特,特别是在用scipy代码实现的过程中更是搞得一塌糊涂。现在自己整明白了就将自己的理解写下来。主要的区别就是cos计算出来的是余弦相似度,只有1减去计算出来的余弦相似度才是余弦距离。
-
余弦距离
简单讲余弦距离就是
也就是1减去
如果用scipy库中的包实现的话如下所示
import numpy as np
vec1 = [1,2,3,4]
vec2 = [5,6,7,8]
#法一:根据公式求解
dist1 = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))
print("余弦距离为:\t"+str(1-dist1))
#法二:根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cosine')
print("余弦距离为:\t"+str(dist2))
上面这段代码是从另一个博主那里借鉴来的不过他写的有错(上面的代码是我改正过的),按照他的计算方式算的不是余弦距离而是余弦相似度。我之所以困惑也是看了他的代码才晕的(博主抱歉了)原博主的文章链接。进一步看一下scipy库pdist给出的说明文档也验证了我的想法
用函数包算出来的直接就是余弦距离。
- jaccard距离
以上内容来自百度百科说的而已经很详细了。
代码实现如下:
import numpy as np
from scipy.spatial.distance import pdist
x=np.random.random(10)>0.5
y=np.random.random(10)>0.5
x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)
#方法一:根据公式求解
up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())
down=np.double(np.bitwise_or(x != 0, y != 0).sum())
d1=(up/down)
#方法二:根据scipy库求解
X=np.vstack([x,y])
d2=pdist(X,'jaccard') # 算出来的就是jaccard距离,需要计算jaccard系数的话就需要1-d2