机器学习中那些相似度的计算方法及实现
2017-03-30 08:08
423 查看
在推荐系统中,我们需要计算两个物品的相似度,对于物品的描述,一般都可以量化为一个向量,于是两个物品之间的相似度就可以用两个向量的相关性来描述,这是概率论的范畴了。
假如我们希望相似度的值在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之间,同样需要缩放。
代码:
[python] view
plain copy
"""
Created on Sun Dec 28 10:33:42 2014
@author: wepon
"""
#相似度计算,inA、inB都是行向量
import numpy as np
from 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)
测试:
[python] view
plain copy
>>> 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
感觉这几种度量方法都比较粗糙,最终选择哪种相似度度量方式还是得看具体问题吧。
假如我们希望相似度的值在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之间,同样需要缩放。
代码:
[python] view
plain copy
"""
Created on Sun Dec 28 10:33:42 2014
@author: wepon
"""
#相似度计算,inA、inB都是行向量
import numpy as np
from 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)
测试:
[python] view
plain copy
>>> 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
感觉这几种度量方法都比较粗糙,最终选择哪种相似度度量方式还是得看具体问题吧。
相关文章推荐
- 图像相似度计算之哈希值方法OpenCV实现
- [推荐系统]mahout中实现的几种相似度计算方法
- Java基于余弦方法实现的计算相似度算法示例
- 图像相似度计算之直方图方法OpenCV实现
- 余弦方法计算相似度算法实现
- 图像相似度计算之哈希值方法OpenCV实现
- 常用的相似度计算方法原理及实现
- 余弦方法计算相似度算法--Python实现 Java实现
- 字符串相似度计算的方法,使用SQL以及C#实现,本文非原创摘自网络(.NET SQL技术交流群入群206656202需注明博客园)
- 余弦方法计算相似度算法实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 相似度计算方法学习
- 机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现
- 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 【java学习记录】2.定义一个计算矩形面积、立方体和球体体积的类,该类完成计算的方法用静态方法实现
- 推荐系统中的相似度计算方法总结及实现代码(python)