什么是最有效的方法来总结ndarray numpy同时最小化浮点不准确?

时间:2016-07-14 07:52:52

标签: python numpy precision

我有一个大矩阵,其值的数量级差异很大。为了尽可能准确地计算总和,我的方法是将ndarray重新整形为一维数组,对其进行排序,然后将其添加,从最小的条目开始。是否有更好/更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:5)

我认为,鉴于浮点精度问题,最适合您任务的算法是Kahan summation。出于实际目的,Kahan求和的误差界限与加数的数量无关,而朴素求和的误差界限与求和的数量呈线性增长。

NumPy不使用Kahan求和,没有大的性能权衡,没有简单的方法来实现它。但它使用了下一个最好的东西,pairwise summation,在一些合理的假设下,误差增加,比如加数的对数的平方根。

因此,Numpy很可能已经能够为您的问题提供足够高的精确度。为了验证这一点,我实际上会通过Kahan求和运行一些示例案例(上面维基百科链接中的伪代码可以简单地转换为Python),并将其作为黄金,最佳结果,并将其与之比较:

  1. 按原样在您的矩阵上调用np.sum
  2. 在重新设定为1D后,在矩阵上调用np.sum,如果矩阵在内存中不连续,可能会产生更好的结果。
  3. 在1D数组的排序版本上调用np.sum
  4. 对于大多数情况,这三个最后选项的行为应该相似,但唯一要知道的方法就是实际测试它。