python - 在 numpy 中总结 ndarray 同时最小化浮点不准确性的最有效方法是什么?

标签 python numpy precision

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

最佳答案

我认为,对于浮点精度问题,最知名的任务算法是 Kahan summation .出于实际目的,Kahan 求和的误差界与被加数的数量无关,而朴素求和的误差界随被加数的数量线性增长。

NumPy 不使用 Kahan 求和,并且在不牺牲性能的情况下没有简单的方法来实现它。但它使用了下一个最好的东西,pairwise summation ,在一些合理的假设下,误差会增加,例如被加数的对数的平方根。

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

  1. 按原样在您的矩阵上调用 np.sum
  2. 在变形为一维后对矩阵调用 np.sum,如果矩阵在内存中不连续,这可能会产生更好的结果。
  3. 在一维数组的排序版本上调用 np.sum

在大多数情况下,最后三个选项的行为应该相似,但唯一了解的方法是实际测试它。

关于python - 在 numpy 中总结 ndarray 同时最小化浮点不准确性的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368500/

相关文章:

python - 来自 3D numpy 数组 Python 的动画等高线图

math - float 学有问题吗?

c++ - 在 C/C++ 中可以用 float 准确表示的最大 uint64

math - float 学有问题吗?

python - 为每个唯一值创建列表

python - NLTK 确定性衡量标准?

python - Python 内存优化是如何工作的?

python - 除了 NumPy 矩阵中的特定列之外,是否有一种有效的方法来获取最大元素的位置?

python - 如何使用 OpenCV 在一张 RGB 图像中编码灰度、SobelX 和 SobelY?

来自 C++ 的 Python 回调调用在 native 站点上失败