相似度计算

在推荐系统中,我们需要计算两个物品的相似度,对于物品的描述,一般都可以量化为一个向量,于是两个物品之间的相似度就可以用两个向量的相关性来描述,这是概率论的范畴了。


假如我们希望相似度的值在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之间,同样需要缩放。


代码:

  1. """ 
  2. Created on Sun Dec 28 10:33:42 2014 
  3.  
  4. @author: wepon 
  5.  
  6. """  
  7.   
  8. #相似度计算,inA、inB都是行向量  
  9. import numpy as np  
  10. from numpy import linalg as la  
  11.   
  12. #欧式距离  
  13. def euclidSimilar(inA,inB):  
  14.     return 1.0/(1.0+la.norm(inA-inB))  
  15. #皮尔逊相关系数  
  16. def pearsonSimilar(inA,inB):  
  17.     if len(inA)<3:  
  18.         return 1.0  
  19.     return 0.5+0.5*np.corrcoef(inA,inB,rowvar=0)[0][1]  
  20. #余弦相似度  
  21. def cosSimilar(inA,inB):  
  22.     inA=np.mat(inA)  
  23.     inB=np.mat(inB)  
  24.     num=float(inA*inB.T)  
  25.     denom=la.norm(inA)*la.norm(inB)  
  26.     return 0.5+0.5*(num/denom) 

测试:

  1. >>> inA=array([1,2,3])  
  2. >>> inB=array([2,4,6])  
  3. >>> euclidSimilar(inA,inB)  
  4. 0.21089672205953397  
  5. >>> pearsonSimilar(inA,inB)  
  6. 1.0  
  7. >>> cosSimilar(inA,inB)  
  8. 1.0 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值