您的位置:首页 > 其它

机器学习中那些相似度的计算方法及实现

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  

感觉这几种度量方法都比较粗糙,最终选择哪种相似度度量方式还是得看具体问题吧。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: