如何理解皮尔逊相关系数(Pearson Correlation Coefficient)?

做计算似度的时候经常会用皮尔逊相关系数,那么应该如何理解该系数?其数学含义、本质是什么?
关注者
1,555
被浏览
2,051,737

35 个回答

提供一个机器学习方向的解释。先上结论:在数据标准化( \mu=0,\sigma=1 )后,Pearson相关性系数、Cosine相似度、欧式距离的平方可认为是等价的。换句话说,如果你的数据符合正态分布或者经过了标准化处理,那么这三种度量方法输出等价,不必纠结使用哪一种。对于标准化后的数据求欧氏距离平方并经过简单的线性变化,其实就是Pearson系数 [1],详见证明2。

我个人觉得比较容易理解的步骤是:我们一般用欧式距离(向量间的距离)来衡量向量的相似度,但欧式距离无法考虑不同变量间取值的差异。举个例子,变量a取值范围是0至1,而变量b的取值范围是0至10000,计算欧式距离时变量b上微小的差异就会决定运算结果。而Pearson相关性系数可以看出是升级版的欧氏距离平方,因为它提供了对于变量取值范围不同的处理步骤。因此对不同变量间的取值范围没有要求(unit free),最后得到的相关性所衡量的是趋势,而不同变量量纲上差别在计算过程中去掉了,等价于z-score标准化

而未经升级的欧式距离以及cosine相似度,对变量的取值范围是敏感的,在使用前需要进行适当的处理。我个人的经验是,在低维度可以优先使用标准化后的欧式距离或者其他距离度量在高维度时Pearson相关系数更加适合。不过说到底,这几个衡量标准差别不大,很多时候的输出结果是非常相似的。

回答的结构如下:1. 定义一些基础概念和公式 2. 证明这三种测量方法间的等价性 3. 通过实验结果验证等价性(实验代码需要Python 3,工具库numpy,scipy和sklearn)。


假设我们有两个向量 X=[X_1, ...X_n]Y=[Y_1, ...Y_n] ,长度均为 n

欧氏距离(Euclidean Distance)是常见的相似性度量方法,可求两个向量间的距离,取值范围为0至正无穷。显然,如果两个向量间的距离较小,那么向量也肯定更为相似。此处需要注意的一点是,欧氏距离计算默认对于每一个维度给予相同的权重,因此如果不同维度的取值范围差别很大,那么结果很容易被某个维度所决定。解决方法除了对数据进行处理以外,还可以使用加权欧氏距离,不同维度使用不同的权重。本文中我们使用的是欧氏距离的平方。

  • 公式1d(X,Y)=\sum_{i=1}^{n}{(X_n-Y_n)^2}

Pearson相关性系数(Pearson Correlation)是衡量向量相似度的一种方法。输出范围为-1到+1, 0代表无相关性,负值为负相关,正值为正相关。

  • 公式2\rho(X,Y)=\frac{E[(X-\mu_{X})(Y-\mu_{Y})]}{\sigma_X\sigma_Y} =\frac{E[(X-\mu_{X})(Y-\mu_{Y})]}{\sqrt{\sum_{i=1}^{n}{(X_i-\mu_X)^2}}\sqrt{\sum_{i=1}^{n}{(Y_i-\mu_Y)^2}}}

Cosine相似度也是一种相似性度量,输出范围和Pearson相关性系数一致,含义也相似。

  • 公式3c(X,Y)=\frac{X\cdot Y}{\left| X \right|\left| Y \right|} =\frac{\sum_{i=1}^{n}{X_iY_i}}{\sqrt{\sum_{i=1}^{n}{X_i^2}}\sqrt{\sum_{i=1}^{n}{Y_i^2}}}

标准化(Standardization)是一种常见的数据缩放手段,标准化后的数据均值为0,标准差为1。

  • 公式4z(X) = \frac{X_i-\mu _X}{\sigma_X}

平方和(Summed Square)与样本方差(Sample Variance)之间的关系

  • 公式5\sigma_X=\sqrt{\frac{\sum_{i=1}^{n}{(X_i-\mu_X)^2}}{n-1}}
  • 公式6:由公式5可得 (n-1)\sigma_X^2 = \sum_{i=1}^{n}{(X_i-\mu_X)^2}

证明1: Pearson相关性系数与Cosine Similarity在数据被标准化后等价

观察公式2和公式3,易发现如果将公式3中的X和Y代入公式4,可得

c(X,Y)=\frac{\sum_{i=1}^{n}{X_iY_i}}{\sqrt{\sum_{i=1}^{n}{X_i^2}}\sqrt{\sum_{i=1}^{n}{Y_i^2}}} =\frac{z(X)\cdot z(Y)}{\left| z(X) \right|\left| z(Y) \right|} 因为此时 \mu=0,\sigma=1 ,所以经过化简后会发现公式2和3等价。为了节省空间,过程略去,可参考其他答主的回答。

证明2:Pearson相关性系数和欧式距离方在标准化数据下等价

为了简化公式,此处的 X,Y 我们默认已经经过了标准化处理,因此均值为0,标准差为1。在这种情况下我们可以利用了公式5和6化简 \sum_{i=1}^{n}{X_i^2}\sum_{i=1}^{n}{Y_i^2},得到下式:\sum_{i=1}^{n}{X_i^2}=\sum_{i=1}^{n}{(X_i-0)^2}=\sum_{i=1}^{n}{(X_i-\mu_X)^2}=(n-1)\sigma_X^2=n-1 ,当 n 取值很大时 n-1\rightarrow n ,所以我们可得到 \sum_{i=1}^{t}{X_i^2}=\sum_{i=1}^{t}{Y_i^2}= n ,这个结论马上会用到。

让我们开始展开欧氏距离方(第二步到第三步使用了我们上边的推导):

\begin{equation} \begin{split} d(X,Y)&=\sum_{i=1}^{n}{(X_n-Y_n)^2} \\ &=\sum_{i=1}^{n}{X_i}^2 - 2 \sum_{i=1}^{n}{X_iY_i}+\sum_{i=1}^{n}{Y_i}^2 \\ &= 2n - 2 \sum_{i=1}^{n}{X_iY_i}\\ &=2n(1-\sum_{i=1}^{n}{X_iY_i})\\ &=2n(1-\frac{\sum_{i=1}^{n}{(X_i-0)(Y_i-0)}}{1\cdot1})\\ &=2n(1-\frac{E[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X\sigma_Y}\\ &= 2n(1-\rho(X,Y)) \end{split} \end{equation}

于是我们得到了结论 d(X,Y) =2n(1-\rho(X,Y)) ,此处的n是向量的长度,是常数,因此我们依然可以认为是等价的。

划重点:欧氏距离的平方 = 2 * 常数n (也就是向量的长度)* (1-Pearson相关系数)

证明3:Cosine相似度和欧氏距离方等价

通过证明1和2,易得证明3,略去。


实验证明:

我随机生成了三个向量(长度为100),并分别计算两两之间的Pearson相关性系数,Cosine相似度和欧式距离方:

  • 原始数据,没有任何处理
  • 经过了标准化(公式4)后的结果

结果如下图,可见标准化后三者等价。此处需要注意因为Pearson可能是负数,因此我用1-Pearson,之后结果就会是非负数并处于区间 [0,2] ,这样就可以和欧氏距离这个非负进行对比。

import numpy as np
from scipy.stats import pearsonr
from scipy.spatial.distance import euclidean
from scipy.spatial.distance import cosine
from sklearn.preprocessing import StandardScaler

# 设定向量长度,均为100
n = 100
x1 = np.random.random_integers(0, 10, (n,1))
x2 = np.random.random_integers(0, 10, (n,1))
x3 = np.random.random_integers(0, 10, (n,1))

p12 = 1 - pearsonr(x1, x2)[0][0]
p13 = 1 - pearsonr(x1, x3)[0][0]
p23 = 1 - pearsonr(x2, x3)[0][0]

d12 = (euclidean(x1, x2)**2) / (2*n)
d13 = (euclidean(x1, x3)**2) / (2*n)
d23 = (euclidean(x2, x3)**2) / (2*n)

c12 = cosine(x1, x2)
c13 = cosine(x1, x3)
c23 = cosine(x2, x3)

print('\n原始数据,没有标准化\n')
print('             x1&x2  x2&x3  x1&x3')
print('pearson:    ', np.round(p12, decimals=4), np.round(p13, decimals=4), 
      np.round(p23, decimals=4))
print('cos:        ', np.round(c12, decimals=4), np.round(c13, decimals=4), 
      np.round(c23, decimals=4))
print('euclidean sq', np.round(d12, decimals=4), np.round(d13, decimals=4), 
      np.round(d23, decimals=4))

# 标准化后的数据
x1_n = StandardScaler().fit_transform(x1)
x2_n = StandardScaler().fit_transform(x2)
x3_n = StandardScaler().fit_transform(x3)

p12_n = 1 - pearsonr(x1_n, x2_n)[0][0]
p13_n = 1 - pearsonr(x1_n, x3_n)[0][0]
p23_n = 1 - pearsonr(x2_n, x3_n)[0][0]

d12_n = (euclidean(x1_n, x2_n)**2) / (2*n)
d13_n = (euclidean(x1_n, x3_n)**2) / (2*n)
d23_n = (euclidean(x2_n, x3_n)**2) / (2*n)

c12_n = cosine(x1_n, x2_n)
c13_n = cosine(x1_n, x3_n)
c23_n = cosine(x2_n, x3_n)

print('\n标准化后的数据: 均值=0,标准差=1\n')
print('             x1&x2  x2&x3  x1&x3')
print('pearson:    ', np.round(p12_n, decimals=4), np.round(p13_n, decimals=4), 
      np.round(p23_n, decimals=4))
print('cos:        ', np.round(c12_n, decimals=4), np.round(c13_n, decimals=4),
      np.round(c23_n, decimals=4))
print('euclidean sq', np.round(d12_n, decimals=4), np.round(d13_n, decimals=4), 
      np.round(d23_n, decimals=4))

[1] Berthold, M.R. and Höppner, F., 2016. On clustering time series using euclidean distance and pearson correlation. arXiv preprint arXiv:1601.02213.

要理解Pearson相关系数,首先要理解协方差(Covariance),协方差是一个反映两个随机变量相关程度的指标,如果一个变量跟随着另一个变量同时变大或者变小,那么这两个变量的协方差就是正值,反之相反,公式如下:

Pearson相关系数公式如下:

由公式可知,Pearson相关系数是用协方差除以两个变量的标准差得到的,虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但是协方差值的大小并不能很好地度量两个随机变量的关联程度,例如,现在二维空间中分布着一些数据,我们想知道数据点坐标X轴和Y轴的相关程度,如果X与Y的相关程度较小但是数据分布的比较离散,这样会导致求出的协方差值较大,用这个值来度量相关程度是不合理的,如下图:

为了更好的度量两个随机变量的相关程度,引入了Pearson相关系数,其在协方差的基础上除以了两个随机变量的标准差,容易得出,pearson是一个介于-1和1之间的值,当两个变量的线性关系增强时,相关系数趋于1或-1;当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;如果相关系数等于0,表明它们之间不存在线性相关关系。《数据挖掘导论》给出了一个很好的图来说明: