Python:皮尔逊的 r

Python: Pearson's r

这是我使用皮尔逊 r 计算两个变量之间相关性的代码。

def correlation(x, y):
    std_x = (x - x.mean()) / x.std(ddof=0)
    std_y = (y - y.mean()) / y.std(ddof=0)

    return (std_x * std_y).mean()

我知道要这样做,需要:

  1. 标准化每个变量
  2. 将每对值相乘,取平均值

这让我想到了我的问题,为什么使用以下行:

std_x = (x - x.mean()) / x.std(ddof=0)

而不是简单地:

r = (x.std(ddof=0)*y.std(ddof=0))/len(x)

我想你对皮尔逊系数的公式感到困惑。假设您有两个随机变量 X 和 Y。那么 Pearson 系数定义为

r = Cov(X, Y)/(s_X*s_Y)

其中Cov(X, Y)是X和Y的协方差,s_Ys_Y是它们的标准差。

Cov(X, Y) = E[(X-E[X])*(Y - E[Y])]

其中E[Z]设计随机变量的期望值Z.

好的,现在我们有了公式,那么如何计算呢。实际上你不能,因为你无法访问 real 标准偏差和 real 预期值。相反,我们通常做的是计算样本相关系数,该系数基于此公式,但用估计器给出的值替换 真实 值。

公式中期望值的自然(最小方差无偏)估计量,就是平均值(由np.mean给出),同样,标准差的正确估计量是经验标准np.std.

给出的偏差

所以把它们放在一起,公式就变成了

r = np.mean((x-np.mean(x))*(y-np.mean(y)))/(np.std(x)*np.std(y))

实际上与

相同

np.mean(X*Y)

其中 X = (x-np.mean(x))/np.std(x)Y = (y-np.mean(y))/np.std(y)