python 减少浮点错误
python reduce with floating point error
在手动计算浮动列表的方差时,我使用了 "reduce",但发现它与我的预期略有不同(给定 numpy.var)。然后我使用列表理解重新计算它,并得到了我预期的值。
sumSqrdReduce = reduce((lambda total, val: total+(val - mean)**2), lst)
sumSqrdComprehension = sum([(val-mean)**2 for val in lst])
演示此问题的示例列表:
lst = [0.53839998, 4.36650467, 3.64258786, 3.62987329, -0.33371547, 10.16436997, 3.11141481, 4.62991016, 0.72292498, -2.9477603, 4.0144724, 7.14428721, -3.05925725, 4.83175576, 5.55112354, 5.03295696, -2.40226829, 1.87662003, -1.02187228, 5.25553533, 1.54985611, 2.71460086, 0.83336707, -3.3935002, 3.88551682, -2.47155389, 1.76985117, 3.57110149, -5.17191153, 4.80879124, -0.97037815, 0.99500531, -0.22062183, 9.96261967, 3.31320864, 0.39606156, -2.71492665, 0.31085669, -1.82838686, 0.38113291, 2.7265862, 6.46300302, 3.11995554, 0.15073258, 12.03547416, 4.82310128, 2.43649615, 3.2195886, 2.84891094, 9.75191341]
加上上面的列表(平均值=2.4008863134):
sumSqrdReduce = 671.241430925
sumSqrdComprehension = 674.171886287
我是否错误地执行了 reduce?或者这是一个通用的 'floating point accumulation error,' 如果是这样,为什么这两种方法不复制相同的浮点误差?我希望 'truth' 的任何差异对于每种方法都是相同的,并且希望不会有太大的不同。
您确实执行了错误的缩减操作。您将 lst
的第一个元素作为初始 total
,而不取其与平均值的平方偏差。
你的 reduce
的 (val - mean)**2
部分在概念上更适合 map
,如果你真的想使用传统的函数式编程函数:
reduce(lambda x, y: x+y, map(lambda x: (x-mean)**2, lst))
或者您可以指定初始累加器值 0.0:
reduce((lambda total, val: total+(val - mean)**2), lst, 0.0)
既然你已经标记了你的问题 NumPy,如果出于某种原因你想避免内置 numpy.var
:
numpy.sum((arr-mean)**2)
在手动计算浮动列表的方差时,我使用了 "reduce",但发现它与我的预期略有不同(给定 numpy.var)。然后我使用列表理解重新计算它,并得到了我预期的值。
sumSqrdReduce = reduce((lambda total, val: total+(val - mean)**2), lst)
sumSqrdComprehension = sum([(val-mean)**2 for val in lst])
演示此问题的示例列表:
lst = [0.53839998, 4.36650467, 3.64258786, 3.62987329, -0.33371547, 10.16436997, 3.11141481, 4.62991016, 0.72292498, -2.9477603, 4.0144724, 7.14428721, -3.05925725, 4.83175576, 5.55112354, 5.03295696, -2.40226829, 1.87662003, -1.02187228, 5.25553533, 1.54985611, 2.71460086, 0.83336707, -3.3935002, 3.88551682, -2.47155389, 1.76985117, 3.57110149, -5.17191153, 4.80879124, -0.97037815, 0.99500531, -0.22062183, 9.96261967, 3.31320864, 0.39606156, -2.71492665, 0.31085669, -1.82838686, 0.38113291, 2.7265862, 6.46300302, 3.11995554, 0.15073258, 12.03547416, 4.82310128, 2.43649615, 3.2195886, 2.84891094, 9.75191341]
加上上面的列表(平均值=2.4008863134):
sumSqrdReduce = 671.241430925
sumSqrdComprehension = 674.171886287
我是否错误地执行了 reduce?或者这是一个通用的 'floating point accumulation error,' 如果是这样,为什么这两种方法不复制相同的浮点误差?我希望 'truth' 的任何差异对于每种方法都是相同的,并且希望不会有太大的不同。
您确实执行了错误的缩减操作。您将 lst
的第一个元素作为初始 total
,而不取其与平均值的平方偏差。
你的 reduce
的 (val - mean)**2
部分在概念上更适合 map
,如果你真的想使用传统的函数式编程函数:
reduce(lambda x, y: x+y, map(lambda x: (x-mean)**2, lst))
或者您可以指定初始累加器值 0.0:
reduce((lambda total, val: total+(val - mean)**2), lst, 0.0)
既然你已经标记了你的问题 NumPy,如果出于某种原因你想避免内置 numpy.var
:
numpy.sum((arr-mean)**2)