注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

皮尔逊相关系数及其Python实现  

2014-11-18 14:50:52|  分类: 机器学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
概率论统计学中,相关(Correlation,或称相关系数关联系数),显示两个随机变量之间线性关系的强度和方向。在统计学中,相关的意义是用来衡量两个变量相对于其相互独立的距离。
在推荐系统中,我们常用皮尔逊相关系数来衡量两个用户兴趣的相似度,它是判断两组数据与某一直线拟合程度的一种度量。它在用户对物品的评分数据差别大时(如有些用户评分普遍较高,有些用户评分普遍偏低)时的效果更好。也即它修正了“夸大分值”的情况,如果某个用户总是倾向于给出比另一个人更高的分值,而两者的分值之差又始终保持一致,则两者间依然可能存在很好地相关性。

皮尔逊相关系数的数学理论知识如下:
统计学中,皮尔逊积矩相关系数Pearson product-moment correlation coefficient)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。系数的值为1意味着X 和 Y可以很好的由直线方程来描述,所有的数据点都很好的落在一条 直线上,且 Y 随着 X 的增加而增加。系数的值为?1意味着所有的数据点都落在直线上,且 Y 随着 X 的增加而减少。系数的值为0意味着两个变量之间没有线性关系。当两个变量独立时,相关系数为0.但反之并不成立。 这是因为相关系数仅仅反映了两个变量之间是否线性相关。比如说,X是区间[-1,1]上的一个均匀分布的随机变量。Y = X2. 那么Y是完全由X确定。因此Y 和X是不独立的。但是相关系数为0。或者说他们是不相关的。当Y 和X服从联合正态分布时,其相互独立和不相关是等价的。当且仅当 Xi and Yi 均落在他们各自的均值的同一侧, 则(Xi ? X)(Yi ? Y) 的值为正。 也就是说,如果Xi 和 Yi 同时趋向于大于, 或同时趋向于小于他们各自的均值,则相关系数为正。 如果 Xi 和 Yi 趋向于落在他们均值的相反一侧,则相关系数为负。

定义:

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差标准差的商:

\rho_{X,Y}={\mathrm{cov}(X,Y) \over \sigma_X \sigma_Y} ={E[(X-\mu_X)(Y-\mu_Y)] \over \sigma_X\sigma_Y},

以上方程定义了总体相关系数, 一般表示成希腊字母ρ(rho)。基于样本对协方差和标准差进行估计,可以得到样本相关系数, 一般表示成r:

r = \frac{\sum ^n _{i=1}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum ^n _{i=1}(X_i - \bar{X})^2} \sqrt{\sum ^n _{i=1}(Y_i - \bar{Y})^2}}.

一种等价表达式的是表示成标准分的均值。基于(Xi, Yi)的样本点,样本皮尔逊系数是

r = \frac{1}{n-1} \sum ^n _{i=1} \left( \frac{X_i - \bar{X}}{\sigma_X} \right) \left( \frac{Y_i - \bar{Y}}{\sigma_Y} \right)

其中

\frac{X_i - \bar{X}}{\sigma_X} \bar{X} 及 \sigma_X

分别是标准分、样本平均值和样本标准差


数学特性:

总体和样本皮尔逊系数的绝对值小于或等于1。如果样本数据点精确的落在直线上(计算样本皮尔逊系数的情况),或者双变量分布完全在直线上(计算总体皮尔逊系数的情况),则相关系数等于1或-1。皮尔逊系数是对称的:corr(X,Y) = corr(Y,X)。

皮尔逊相关系数有一个重要的数学特性是,因两个变量的位置和尺度的变化并不会引起该系数的改变,即它该变化的不变量 (由符号确定)。也就是说,我们如果把X移动到a + bX和把Y移动到c + dY,其中a、b、c和d是常数,并不会改变两个变量的相关系数(该结论在总体和样本皮尔逊相关系数中都成立)。我们发现更一般的线性变换则会改变相关系数:参见之后章节对该特性应用的介绍。

由于μX = E(X), σX2 = E[(X ? E(X))2] = E(X2) ? E2(X),Y也类似, 并且

E[(X-E(X))(Y-E(Y))]=E(XY)-E(X)E(Y),\,

故相关系数也可以表示成

\rho_{X,Y}=\frac{E(XY)-E(X)E(Y)}{\sqrt{E(X^2)-(E(X))^2}~\sqrt{E(Y^2)- (E(Y))^2}}.

对于样本皮尔逊相关系数:


r_{xy}=\frac{\sum x_iy_i-n \bar{x} \bar{y}}{(n-1) s_x s_y}=\frac{n\sum x_iy_i-\sum x_i\sum y_i}
{\sqrt{n\sum x_i^2-(\sum x_i)^2}~\sqrt{n\sum y_i^2-(\sum y_i)^2}}.

以上方程给出了计算样本皮尔逊相关系数简单的单流程算法,但是其依赖于涉及到的数据,有时它可能是数值不稳定的。

几何学的解释:

对于没有中心化的数据, 相关系数与两条可能的回归线y=gx(x) 和 x=gy(y) 夹角的余弦值一致。

对于中心化过的数据 (也就是说, 数据移动一个样本平均值以使其均值为0), 相关系数也可以被视作由两个随机变量 向量 夹角\ \theta 的 余弦值(见下方)。

一些人[谁?] 倾向于是用非中心化的相关系数 (non-Pearson-compliant) 。 比较如下。

例如,有5个国家的国民生产总值分别为 10, 20, 30, 50 和 80 亿美元。 假设这5个国家 (顺序相同) 的贫困百分比分别为 11%, 12%, 13%, 15%, and 18% 。 令 x 和 y 分别为包含上述5个数据的向量: x = (1, 2, 3, 5, 8) 和 y = (0.11, 0.12, 0.13, 0.15, 0.18)。

利用通常的方法计算两个向量之间的夹角 \ \theta (参见 数量积), 未中心化 的相关系数是:

 \cos \theta = \frac { \bold{x} \cdot \bold{y} } { \left\| \bold{x} \right\| \left\| \bold{y} \right\| } = \frac { 2.93 } { \sqrt { 103 } \sqrt { 0.0983 } } = 0.920814711.

我们发现以上的数据特意选定为完全相关: y = 0.10 + 0.01 x。 于是,皮尔逊相关系数应该等于1。将数据中心化 (通过E(x) = 3.8移动 x 和通过 E(y) = 0.138 移动 y ) 得到 x = (?2.8, ?1.8, ?0.8, 1.2, 4.2) 和 y = (?0.028, ?0.018, ?0.008, 0.012, 0.042), 从中,

 \cos \theta = \frac { \bold{x} \cdot \bold{y} } { \left\| \bold{x} \right\| \left\| \bold{y} \right\| } = \frac { 0.308 } { \sqrt { 30.8 } \sqrt { 0.00308 } } = 1 = \rho_{xy},

皮尔逊距离:

皮尔逊距离度量的是两个变量X和Y,它可以根据皮尔逊系数定义成

d_{X,Y}=1-\rho_{X,Y}.

我们可以发现,皮尔逊系数落在 [-1, 1], 而皮尔逊距离落在 [0, 2]。

Python实现:
使用的计算公式为:
皮尔逊相关系数及其Python实现 - changfengmingzhi - 长风明志的博客
 

from math import sqrt

#一个涉及影评者及其对几部影片评分情况的字典
critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a plane':3.5},'Gene Seymour':{'Lady in the Water':3.0,'The Night Listener':3.0}}

#返回用户p1和p2的皮尔逊相关系数
def sim_pearson(prefs,p1,p2):
    #得到双方都曾评价过的物品列表
    si = {}
    for item in prefs[p1]:
        if item in prefs[p2]:
            si[item] = 1
    
    #得到列表元素的个数
    n = len(si)
    
    #如果两者没有共同之处,则返回1
    if(n == 0):
        return 1
    
    #对所有偏好求和
    sum1 = sum([prefs[p1][it] for it in si])
    sum2 = sum([prefs[p2][it] for it in si])
    
    #求平方和
    sum1Sq = sum([pow(prefs[p1][it],2) for it in si])
    sum2Sq = sum([pow(prefs[p2][it],2) for it in si])
    
    #求乘积之和
    pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])
    
    # 计算皮尔逊相关系数
    num = pSum - (sum1*sum2/n)
    den = sqrt((sum1Sq - pow(sum1,2)/n) * (sum2Sq - pow(sum2,2)/n))
    
    if den == 0:
        return 0
    
    r = num/den
    
    return r


  评论这张
 
阅读(8397)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017