【2.2.1】皮尔森相关系数 (Pearson's correlation coefficient)

皮尔森相关系数( Pearson correlation coefficient)也叫皮尔森积差相关系数(Pearson product-moment correlation coefficient),是用来反应两个变量相似程度的统计量。或者说可以用来计算两个向量的相似度(在基于向量空间模型的文本分类、用户喜好推荐系统中都有应用)。

皮尔森相关系数计算公式如下:

$$ \rho(x,y) = {\frac {cov(X,Y)}{\sigma_x \sigma_y}} = {\frac {X * Y}{|X||Y|}}$$

分子是协方差,分母是两个变量标准差的乘积。显然要求X和Y的标准差都不能为0。

因为

$$\mu_{x} = E\left(X\right);\sigma^{2}_{x}=E\left(X - \mu x\right)^{2}=E\left(X^{2}\right)-E^{2}\left(X\right) $$

,所以皮尔森相关系数计算公式还可以写成:

$$\rho\left(X,Y\right)= {\frac{E\left(XY\right)-E\left(X\right)E\left(Y\right)}{ {\sqrt{E\left(X^{2}\right) -E^{2}\left(Y\right)}} {\sqrt{E\left(Y^{2}\right) -E^{2}\left(X\right)}} }}$$

pearson是一个介于-1和1之间的值,用来描述两组线性的数据一同变化移动的趋势。

当两个变量的线性关系增强时,相关系数趋于1或-1;当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;如果相关系数等于0,表明它们之间不存在线性相关关系。当两个变量独立时相关系统为0,但反之不成立。比如对于y=x2次方,X服从[-1,1]上的均匀分布,此时E(XY)为0,E(X)也为0,所以Px,y=0,但x和y明显不独立。所以“不相关”和“独立”是两回事。当Y 和X服从联合正态分布时,其相互独立和不相关是等价的。

对于居中的数据来说(何谓居中?也就是每个数据减去样本均值,居中后它们的平均值就为0),E(X)=E(Y)=0,此时有:

$$\rho\left(X,Y\right) = {\frac {E\left(XY\right)}{E\left(X^{2}\right)E\left(Y^{2}\right)}} = {\frac {X*Y}{|X||Y|}}$$

即相关系数可以看作是两个随机变量中得到的样本集向量之间夹角的cosine函数。

进一步当X和Y向量归一化后,||X||=||Y||=1,相关系数即为两个向量的乘积。

2、适用范围

当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

(1)、两个变量之间是线性关系,都是连续数据。

(2)、两个变量的总体是正态分布,或接近正态的单峰分布。

(3)、两个变量的观测值是成对的,每对观测值之间相互独立。

局限性:

1.未考虑重叠记录项的数量对相似度的影响

上表中,行表示用户(1~5)对项目(101~103)的一些评分值。直观来看,User1和User5用3个共同的评分项,并且给出的评分趋势相 同,User1与User4只有2个相同评分项,虽然他们的趋势也相似,但是由于102的未知,可能是User2对102未发生行为,或者对102很讨厌,所以我们更希望User1和User5更相似,但结果是User1与User4有着更高的结果。 可以看出pearson系数只会对重叠的记录进行计算。

同样的场景在现实生活中也经常发生,比如两个用户共同观看了200部电影,虽然不一定给出相同或完全相近的评分,但只要他们之间的趋势相似也应该比另一位只观看了2部相同电影的相似度高!但事实并不如此,如果对这两部电影,两个用户给出的相似度相同或很相近,通过Pearson相关性计算出的相似度会明显大于观看了相同的200部电影的用户之间的相似度。

2.如果只有一个重叠项则无法计算相关性

从数学上讲,若只有一个重叠的记录,那么至少有一组记录的标准差为0,导致分母为0

从这一点也可以看出,pearson系数不适用与小的或者非常稀疏的数据集。当然,这一特性也有它的好处,无法计算pearson系数可以认为这两组数据没有任何相关性。

3.如果一组记录的所有评分都一样则无法计算相关性 理由同2.

4.Pearson系数对绝对数值不敏感

考虑这三组数据,1:(1.0,2.0,3.0,4.0),2:(40.0,50.0,70.0,80.0),3:(50.0,60.0,70.0,80.0),我们可以直观的认为2和3更为相似,它们的重叠评分数目一致,趋势也相同,记录1虽然也满足上述的条件,但是它整体数值很低。在现实中,有人习惯于给出更高的评分,而有人则恰恰相反。

利用pearson计算它们之间的相似度为:

 1&2: 0.9899494936611665

 2&3: 0.9899494936611665
 
 1&3: 0.9999999999999999

可以看出pearson系数对绝对数值并不敏感,它确实只是描述了两组数据变化的趋势。

三、计算

3.1 python 代码

import numpy as np
from scipy.stats import pearsonr

np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print "Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))
print "Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)

计算出来的第一个值为 ”r",Pearson’s correlation coefficient 相关系数;第二个值为p-value

3.2 R代码:

假设你现在做了个生物学实验,喜得以下两个变量:

X1=c(1, 2, 3, 4, 5, 6),
Y1=c(0.3, 0.9, 2.7, 2, 3.5, 5),

分别计算X1,Y1的均值,使用mean函数:

mean(X1)
3.5

mean(Y1)
2.4

分别计算X1,Y1的方差,使用var函数:

var(X1)
1.87	

var(Y1)
1.72

计算X1,Y1之间的协方差,使用cov函数:

cor(X1,Y1)
3.06

计算X1,Y1之间的皮尔森相关性系数,使用cor函数:

cor(X1,Y1,method='pearson')
0.94

其值在0.9以上,哇,说明二者非常相关,比如验证了蛋白A表达量的变化,与蛋白B表达量的变化关系很大!拿到这种有统计学论证的结果你可能很开心。

然而,你的小伙伴可能却没这种好运气,由于实验操作不慎或者处理数据不小心,他得到了这样一个变量 X2(1,1,1,1,1,1),那么计算X2与Y1之间的皮尔森相关性系数会发生什么呢?

cor(X2,Y1,method='pearson')
[1] NA 
报错:标准差为零

看到没有,R运行会得到一个缺失值(NA),并且代码给你提醒:标准差为零(自己试着计算下X2的标准差是多少),这时候明白上面说的意思了吧!也就是说,X2里面的取值根本没有任何波动,那它与Y1的相关性也就没法用这种方法来计算了。

此外,从上面的公式我们知道,皮尔森相关性系数是协方差与标准差的比值,所以它对数据是有比较高的要求的:

  1. 实验数据通常假设是成对的来自于正态分布的总体。为啥通常会假设为正态分布呢?因为我们在求皮尔森相关性系数以后,通常还会用t检验之类的方法来进行皮尔森相关性系数检验,而 t检验是基于数据呈正态分布的假设的。
  2. 实验数据之间的差距不能太大,或者说皮尔森相关性系数受异常值的影响比较大。比如刚才心跳与跑步的例子,万一这个人的心脏不太好,跑到一定速度后承受不了,突发心脏病,那这时候我们会测到一个偏离正常值的心跳(过快或者过慢,甚至为0),如果我们把这个值也放进去进行相关性分析,它的存在会大大干扰计算的结果的。

在我们实际数据分析的过程中,以上这些对数据的要求就给我们的分析带来了一定的局限性。为了摆脱这些限制,第二种系数呼之而出。 –斯皮尔曼相关性系数

参考资料:

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn