皮爾遜相關係數的,餘弦相似性,歐式距離是我們經常用到的計算相似性的函數,下面自己實現一下:
一、介紹下三個公式
(1)皮爾遜相關係數
(2)歐式距離
---------- 二維空間
-----------n維空間
(3)餘弦相似性
二、代碼實現如下
# 皮爾斯相關係數
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)這三個相似性經常在協同過濾等推薦算法中用到。