python - 为什么内置的 python sum 函数会这样?

标签 python pearson-correlation

我正在尝试编写一个程序来确定 python 中的 pearson 相关系数与总体标准差。在我到达求和 (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 的行为如此奇怪?

最佳答案

res = (sum([(xi-mx)*(yi-my) for xi in x for yi in y]))/(len(x)*sdx*sdy)

那不是按照您的想法行事。在计算 PIL 逊相关系数的分子时,(xi - mx) * (yi - my)应该依次配对。 使用 zip应该修复它。

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

for xi in x for yi in 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)]

关于python - 为什么内置的 python sum 函数会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54058852/

相关文章:

Python——函数不返回值

python - 使用 Pandas 滚动相关时如何处理不一致的结果?

python - 如何计算 PIL 逊相关矩阵并仅保留有效值?

r - R 和 SPSS 线性模型结果之间的差异

python - scipy.pdist() 返回 NaN 值

python - 在 flask 中创建文件夹

python - Matplotlib:使用循环绘制的 8 个图具有相同的标题

两个矩阵之间的行相关性

python - Pandas 非连续数字过滤器丢弃 0 行

python - 为什么python中有日期类