手动实现协方差时三种方式结果不一致,求排查Bug
问题分析与解决
你的方法3在数学展开时出现了错误,核心问题是最后一项的求和步骤遗漏了样本量倍数:
我们重新推导协方差的分子展开式:
样本协方差的分子为 $\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})$
展开后得到:$\sum x_i y_i - \bar{x}\sum y_i - \bar{y}\sum x_i + \sum \bar{x}\bar{y}$
注意最后一项 $\sum \bar{x}\bar{y}$,由于$\bar{x}$和$\bar{y}$是常数,对n个样本求和的结果是 $n \times \bar{x}\bar{y}$,但你的方法3里直接写了 $\bar{x}\bar{y}$,漏掉了乘以样本量n。
修正后的方法3代码如下:
( sum(foo*bar) - mean(bar)*sum(foo) - mean(foo)*sum(bar) + n * mean(foo)*mean(bar) # 补充乘以样本量n ) / (n-1)
运行修正后的代码,结果会和方法1、方法2完全一致。
内容的提问来源于stack exchange,提问作者JCWong
相关产品推荐
相关产品推荐

