我有一个大矩阵,其值的数量级差异很大。为了尽可能准确地计算总和,我的方法是将ndarray重新整形为一维数组,对其进行排序,然后将其添加,从最小的条目开始。是否有更好/更有效的方法来做到这一点?
答案 0 :(得分:5)
我认为,鉴于浮点精度问题,最适合您任务的算法是Kahan summation。出于实际目的,Kahan求和的误差界限与加数的数量无关,而朴素求和的误差界限与求和的数量呈线性增长。
NumPy不使用Kahan求和,没有大的性能权衡,没有简单的方法来实现它。但它使用了下一个最好的东西,pairwise summation,在一些合理的假设下,误差增加,比如加数的对数的平方根。
因此,Numpy很可能已经能够为您的问题提供足够高的精确度。为了验证这一点,我实际上会通过Kahan求和运行一些示例案例(上面维基百科链接中的伪代码可以简单地转换为Python),并将其作为黄金,最佳结果,并将其与之比较:
np.sum
。np.sum
,如果矩阵在内存中不连续,可能会产生更好的结果。np.sum
。对于大多数情况,这三个最后选项的行为应该相似,但唯一要知道的方法就是实际测试它。