皮尔逊相关系数的,余弦相似性,欧式距离计算(python代码版)

 

皮尔逊相关系数的,余弦相似性,欧式距离是我们经常用到的计算相似性的函数,下面自己实现一下:

一、介绍下三个公式

(1)皮尔逊相关系数

è¿éåå¾çæè¿°

(2)欧式距离

       ---------- 二维空间

                                       -----------n维空间

(3)余弦相似性 

皮尔逊相关系数的,余弦相似性,欧式距离计算(python代码版)_第1张图片

二、代码实现如下

# 皮尔斯相关系数
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)这三个相似性经常在协同过滤等推荐算法中用到。

你可能感兴趣的