【发布时间】:2019-06-01 04:49:13
【问题描述】:
我正在尝试编写一个程序来确定 pearson 相关系数与 python 中的总体标准差。我认为这将是非常微不足道的,直到我得到求和的部分 (yi - μy)*(xi - μx)。这是我的完整代码:
def r(x, y):
mx, my = sum(x) / len(x), sum(y) / len(y)
sdx, sdy = (sum([(xi-mx)**2 for xi in x]) / len(x))**0.5, (sum([(yi-
my)**2 for yi in y]) / (len(y)))**0.5
res = ((sum([(xi-mx)*(yi-my) for xi in x for yi in y]))/(len(x)*sdx*sdy))**0.5
return res
我注意到结果非常小,所以我检查了 (xi-mx) 的总和:
sum([(xi-mx) for xi in x])
结果是 -9.769962616701378e-15。以下是列表中的值:
print([(xi-mx) for xi in x])
[3.2699999999999987, 3.0699999999999994, 1.2699999999999987, 1.0699999999999985, 0.9699999999999989, 0.2699999999999987, -0.7300000000000013, -1.7300000000000013, -2.7300000000000013, -4.730000000000001]
谁能解释一下为什么 python 的行为如此奇怪?
【问题讨论】:
-
舍入点错误。这里的所有都是它的。如果需要,请使用
round(number, decimal_points)。 -
看到最后的
e-15了吗? -
@GeeTransit 将 xi 舍入到小数点后 4 位仍然返回 -9.769962616701378e-15... 我认为这也可以解决潜在的浮点错误,并且知道为什么它不起作用
-
嗯。您用来调用函数的
x和y值是什么?我去看看能不能重现这个问题。 -
@user2357112 是的,每个结果后面都跟着 e 和一个负整数
标签: python pearson-correlation