You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

关于Pearson相关系数计算代码中标准化步骤的疑问

为什么计算Pearson相关系数时,标准化后取乘积均值和协方差除以标准差乘积是等价的?

嘿,你提的这个问题特别好——其实你写的标准化计算法和cov(x,y)/(x.std(ddof=0)*y.std(ddof=0))的计算法,数学上是完全一模一样的,只是表达形式不同而已。咱们来拆解一下背后的逻辑:

先看两种方法的代码对比

你的实现:

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()

另一种基于协方差的实现:

import numpy as np

def correlation_cov(x, y):
    cov_xy = np.cov(x, y, ddof=0)[0][1]  # 等价于手动计算:((x-x.mean())*(y-y.mean())).mean()
    return cov_xy / (x.std(ddof=0) * y.std(ddof=0))

从数学推导看等价性

咱们从Pearson相关系数的核心定义出发:

Pearson r = 协方差(X,Y) / (X的总体标准差 × Y的总体标准差)

其中:

  • 协方差Cov(X,Y) = E[(X-μₓ)(Y-μᵧ)],也就是(X减均值)和(Y减均值)的乘积的平均值(这里用的是总体统计量,对应ddof=0
  • X的总体标准差σₓ = √E[(X-μₓ)²],Y的总体标准差σᵧ同理

现在看你的标准化步骤:
标准化后的X是Zₓ = (X-μₓ)/σₓ,标准化后的Y是Zᵧ = (Y-μᵧ)/σᵧ
那么Zₓ×Zᵧ的平均值就是:

E[Zₓ×Zᵧ] = E[ (X-μₓ)(Y-μᵧ) / (σₓσᵧ) ] = E[(X-μₓ)(Y-μᵧ)] / (σₓσᵧ) = Cov(X,Y)/(σₓσᵧ) = r

哦!这不就是Pearson r的定义吗?所以你的方法其实就是把“协方差除以标准差乘积”的步骤拆成了先标准化再算乘积均值,本质完全一致。

为什么两种思路都存在?

  • 你的标准化思路:更偏向于直观理解——Pearson r衡量的是两个变量「线性关联的方向和强度」。标准化后,每个变量都变成了均值为0、标准差为1的“标准分”,这时候它们的乘积的平均值,直接反映了“X和Y是否同时偏离各自均值”:如果大部分时候同高同低,乘积为正,r为正;反之则为负;如果完全无关,乘积的均值趋近于0。这种方式把r的意义变得更具象。
  • 协方差除以标准差的思路:更偏向于统计量的直接组合——从“协方差衡量关联程度,但受变量量纲影响”出发,用标准差把协方差“归一化”到[-1,1]区间,这是从统计定义出发的直接计算方式。

验证一下数值一致性

用实际数据测试,两种方法结果完全相同:

import numpy as np

x = np.array([1, 3, 5, 7, 9])
y = np.array([2, 6, 10, 14, 18])

print("标准化方法结果:", correlation(x, y))  # 输出1.0(完全正相关)
print("协方差方法结果:", correlation_cov(x, y))  # 同样输出1.0

所以不管用哪种方式,最终得到的都是正确的Pearson相关系数——只是看你更习惯从哪个角度理解而已~

内容的提问来源于stack exchange,提问作者MM3

火山引擎 最新活动