相似度计算
2019-05-04 10:49
357 查看
相似度计算
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/42213883
《Machine Learning in Action》笔记,相似度计算,基于python+numpy。
在推荐系统中,我们需要计算两个物品的相似度,对于物品的描述,一般都可以量化为一个向量,于是两个物品之间的相似度就可以用两个向量的相关性来描述,这是概率论的范畴了。
假如我们希望相似度的值在0~1之间,并且越相似,值越大,有哪些办法?
1、计算欧式距离,然后根据“相似度=1/(1+距离)”计算相似度。
2、皮尔逊相关系数,在numpy中可以用线性代数模块linalg中的corrcoef()来计算相关系数(correlation coefficient)。得出结果的取值范围是-1~1,可通过“0.5+0.5*corrcoef()”将其缩放到0~1之间。
3、余弦相似度,计算的是两个向量的夹角的余弦值。余弦值=A*B/(||A||*||B||)。||A||表示A的2范数,可以用linalg模块中的norm()计算。余弦值在-1~1之间,同样需要缩放。
代码:
"""Created on Sun Dec 28 10:33:42 2014@author: wepon"""#相似度计算,inA、inB都是行向量import numpy as npfrom numpy import linalg as la#欧式距离def euclidSimilar(inA,inB): return 1.0/(1.0+la.norm(inA-inB))#皮尔逊相关系数def pearsonSimilar(inA,inB): if len(inA)<3: return 1.0 return 0.5+0.5*np.corrcoef(inA,inB,rowvar=0)[0][1]#余弦相似度def cosSimilar(inA,inB): inA=np.mat(inA) inB=np.mat(inB) num=float(inA*inB.T) denom=la.norm(inA)*la.norm(inB) return 0.5+0.5*(num/denom)
测试:
>>> inA=array([1,2,3])>>> inB=array([2,4,6])>>> euclidSimilar(inA,inB)0.21089672205953397>>> pearsonSimilar(inA,inB)1.0>>> cosSimilar(inA,inB)1.0
感觉这几种度量方法都比较粗糙,最终选择哪种相似度度量方式还是得看具体问题吧。
相关文章推荐
- 华为OJ 计算字符串相似度或者编辑距离 JAVA
- 转贴:向量相似度的计算和向量夹角余旋的关系
- Python 文本挖掘:使用gensim进行文本相似度计算
- 关于word2vec 句子相似度计算
- 计算数据的相似度:欧几里德、皮尔逊相关度
- 向量空间模型(VSM)在文档相似度计算上的简单介绍
- 计算字符串相似度
- 华为oj 计算字符串的相似度
- simhash 文本相似度计算
- 相似度计算常用方法综述
- [面试备忘]计算字符串相似度 & 无头单链删非头尾节点 & 基于前续中续重建二叉树
- NLP计算文档相似度之doc2vec
- Mahout推荐引擎中的几种相似度计算简要介绍
- 计算字符串的相似度--编程之美3.3
- python 中文切词并计算相似度
- gensim的LSI模型来计算文档的相似度
- 皮尔逊相似度计算的例子(R语言)
- WordNet词网研究7——之JWS(Java Wordnet Similarity)语义相似度计算
- 基于gensim模块的中文句子相似度计算工具
- python使用gensim进行文本相似度计算