为什么内置的python sum函数的行为是这样的?

为什么内置的python sum函数的行为是这样的?,python,pearson-correlation,Python,Pearson Correlation,我正试图用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.

我正试图用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在这个问题上表现得如此奇怪吗

您显示的数字之和实际上接近于0。为什么这么奇怪?事实上,它必须接近0。不管x中的值是多少,从数学上来说

sum(xi - mean(x) for xi in x) =
sum(xi for xi in x) - sum(mean(x) for xi in x) =
len(x) * mean(x) - len(x) * mean(x) =
0

数字结果不完全是0,这仅仅是由于浮点舍入错误。

您显示的数字之和实际上接近于0。为什么这么奇怪?事实上,它必须接近0。不管x中的值是多少,从数学上来说

sum(xi - mean(x) for xi in x) =
sum(xi for xi in x) - sum(mean(x) for xi in x) =
len(x) * mean(x) - len(x) * mean(x) =
0
res = (sum([(xi-mx)*(yi-my) for xi in x for yi in y]))/(len(x)*sdx*sdy)
数值结果不完全为0,这仅仅是由于浮点舍入错误造成的

res = (sum([(xi-mx)*(yi-my) for xi in x for yi in y]))/(len(x)*sdx*sdy)
那不是你想象的那样。在计算皮尔森相关系数的分子时,席-MX*Y-My应按顺序配对。 使用应该可以修复它

res = (sum([(xi-mx)*(yi-my) for xi, yi in zip(x, y)]))/(len(x)*sdx*sdy)
这就是我得到的:

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, yi in zip(x, y)]))/(len(x)*sdx*sdy)
    return res

r(x, y) # 0.6124721937208479
<席上的X对于Y的真正意义是什么?

>>> x, y = [1, 2, 3], [4, 5, 6]
>>> [(xi, yi) for xi in x for yi in y]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
所以有重复发生。实际生成一个组合列表。您可以使用zip将值聚合为对:

>>> [*zip(x, y)]
[(1, 4), (2, 5), (3, 6)]
那不是你想象的那样。在计算皮尔森相关系数的分子时,席-MX*Y-My应按顺序配对。 使用应该可以修复它

res = (sum([(xi-mx)*(yi-my) for xi, yi in zip(x, y)]))/(len(x)*sdx*sdy)
这就是我得到的:

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, yi in zip(x, y)]))/(len(x)*sdx*sdy)
    return res

r(x, y) # 0.6124721937208479
<席上的X对于Y的真正意义是什么?

>>> x, y = [1, 2, 3], [4, 5, 6]
>>> [(xi, yi) for xi in x for yi in y]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
所以有重复发生。实际生成一个组合列表。您可以使用zip将值聚合为对:

>>> [*zip(x, y)]
[(1, 4), (2, 5), (3, 6)]

舍入点误差。就这些。如果需要的话,使用圆号、十进制点。你看到E-15的结尾了吗?@ GeTrimeRouk席到4个小数点仍然返回-976962626167078E-15…我想这也可以修复一个潜在的浮点错误,并解释为什么它不起作用。您用来调用函数的x和y值是多少?我要看看是否可以重现这个问题。@user2357112是的,每个结果后面都跟有e和一个负整数点错误。就这些。如果需要的话,使用圆号、十进制点。你看到E-15的结尾了吗?@ GeTrimeRouk席到4个小数点仍然返回-976962626167078E-15…我想这也可以修复一个潜在的浮点错误,并解释为什么它不起作用。您用来调用函数的x和y值是多少?我要看看我是否能重现这个问题。@user2357112是的,每个结果后面都跟有e和一个负整数。这正是我要找的!在我改变了这一点后,这个程序开始工作了。我想我犯了一个数学错误,但就是我写得那么差。非常感谢。这正是我要找的!在我改变了这一点后,这个程序开始工作了。我想我犯了一个数学错误,但就是我写得那么差。非常感谢。