皮爾遜相關係數的,餘弦相似性,歐式距離計算(python代碼版)

 

皮爾遜相關係數的,餘弦相似性,歐式距離是我們經常用到的計算相似性的函數,下面自己實現一下:

一、介紹下三個公式

(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)這三個相似性經常在協同過濾等推薦算法中用到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章