版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_20183817/article/details/83344540
皮尔逊相关系数的,余弦相似性,欧式距离是我们经常用到的计算相似性的函数,下面自己实现一下:
一、介绍下三个公式
(1)皮尔逊相关系数
(2)欧式距离
---------- 二维空间
-----------n维空间
(3)余弦相似性
二、代码实现如下
扫描二维码关注公众号,回复:
3719020 查看本文章
# 皮尔斯相关系数
from math import sqrt
print '同一个向量三个相关性计算如下:'
def multipl(a,b):
sumofab=0.0
for i in range(len(a)):
temp=a[i]*b[i]
sumofab+=temp
return sumofab
def corrcoef(x,y):
n=len(x)
#求和
sum1=sum(x)
sum2=sum(y)
#求乘积之和
sumofxy=multipl(x,y)
#求平方和
sumofx2 = sum([pow(i,2) for i in x])
sumofy2 = sum([pow(j,2) for j in y])
num=sumofxy-(float(sum1)*float(sum2)/n)
#计算皮尔逊相关系数
den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
return num/den
x = [0,1,0,3,7]
y = [0,1,1,1,9]
print '皮尔斯相关系数为:%f' %corrcoef(x,y) #0.471404520791
# 欧式距离
#-*-coding:utf-8-*-
def distance(vector1,vector2):
d=0;
for a,b in zip(vector1,vector2):
d+=(a-b)**2;
return d**0.5;
print '欧式距离:%f' %distance(x,y);
import numpy as np
#自定义余弦相似度函数
def get_cossimi(x,y):
myx=np.array(x)
myy=np.array(y)
cos1=np.sum(myx*myy)
cos21=np.sqrt(sum(myy*myy))
cos22=np.sqrt(sum(myx*myx))
return (cos1/float(cos22*cos21))
print '余弦相似性:%f' %get_cossimi(x,y
结果:
同一个向量三个相关性计算如下:
皮尔斯相关系数为:0.926332
欧式距离:3.000000
余弦相似性:0.951720
三、总结
(1)皮尔斯相关系数和余弦相似性计算结果差距不大、和欧氏距离差异很大;
(2)皮尔斯相关系数比余弦相似性相似性计算更具精确性(已经证明);
(3)这三个相似性经常在协同过滤等推荐算法中用到。