前言 最近在看一些文章跟代码的时候碰到了余弦距离跟jaccrd距离的概念。刚开始有些混淆不清楚特,特别是在用scipy代码实现的过程中更是搞得一塌糊涂。现在自己整明白了就将自己的理解写下来。
余弦距离 简单讲余弦距离就是
也就是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