[英]Why is the built-in python sum function behaving like this?
我正在嘗試編寫一個程序來確定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表現得如此奇怪?
res = (sum([(xi-mx)*(yi-my) for xi in x for yi in y]))/(len(x)*sdx*sdy)
那沒有按照您的想法去做。 在計算皮爾遜相關系數的分子時, (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
中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)]
您顯示的數字總和實際上接近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完全是由於浮點舍入錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.