【问题标题】:How to manually calculate correlation coefficiant using numpy for loops in Python?如何在 Python 中使用 numpy for 循环手动计算相关系数?
【发布时间】:2021-02-15 18:53:49
【问题描述】:

所以我正在学习我的第一门 Python 课程,并且在尝试计算数据集的相关系数时偶然发现了一些问题。我知道我可以只使用 np.coercoef 但我也希望能够“手动”完成。我尝试了以下代码的各种组合,但我得到的答案总是比 np.coercoef 给我的答案更高(大约为 0.62 与 0.57 相比)。

我希望这里有人可以帮助我找出代码中的问题?

最好的问候,

k_m = np.array([22, 48, 76, 10, 22, 4, 68, 44, 10, 76, 14, 56])
km = np.array([63, 39, 61, 30, 51, 44, 74, 78, 55, 58, 41, 69])

gns_k_m = 0
gns_km = 0
cov = 0
sum_k_m = 0
sum_km = 0

for k in range(len(k_m)):
    gns_k_m += k_m[k]/len(k_m)

for k in range(len(km)):
    gns_km += km[k]/len(km)
    
print(gns_k_m, gns_km)

for k in range(len(k_m)):
    cov += (k_m[k]-gns_k_m)*(km[k]-gns_km)/(len(k_m)-1)

print(cov)

for k in range(len(k_m)):
    sum_k_m += (k_m[k]-gns_k_m)**2

sa_k_m = np.sqrt(sum_k_m/len(k_m))

for k in range(len(km)):
    sum_km += (km[k]-gns_km)**2
    
sa_km = np.sqrt(sum_km/len(km))

cor = cov/(sa_k_m*sa_km)

print(cor)
print(np.corrcoef(k_m,km))

【问题讨论】:

  • 我认为这个问题是统计问题,而不是计算问题。简单看一下,为什么在计算方差时会有'-1'?
  • 你确定你在比较相同的东西?

标签: python numpy for-loop correlation pearson-correlation


【解决方案1】:

问题在于np.corrcoef 使用了协方差除以len(k_m) 而不是您的len(k_m) - 1 的标准化。

因此,如果您重新规范化np.corrcoef 给出的结果,您将获得与手动实现给出的相同的值。

In [26]: new_res = (np.corrcoef(k_m, km) * len(k_m) / (len(k_m) - 1))[0, 1]

In [28]: np.allclose(new_res, cor)
Out[28]: True

In [29]: new_res
Out[29]: 0.6165427925911239

【讨论】:

  • 好的,谢谢!将 [0,1] 放在第一行的末尾是什么意思?
  • np.corrcoef 返回具有 Pearson 相关系数的 2x2 矩阵,[0, 1] 是对应于该矩阵“右上角”条目的索引。这是k_mkm的相关系数。
猜你喜欢
  • 2011-12-20
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2022-01-25
  • 2020-10-29
相关资源
最近更新 更多