准确计算向量的平均值

计算科学 Python 稳定 麻木的
2021-11-27 23:28:14

我无法以足够的精度计算向量的平均值。我当前的解决方案有效,但速度很慢并且性能不可预测:

mean_sum = mean = math.fsum(values) / n
值 = 值 - 平均值
平均值 = math.fsum(values) / n
而 np.abs(mean) > np.finfo(np.float32).eps:      
      值 = 值 - 平均值
      mean_sum += 均值
      平均值 = math.fsum(values) / n
返回均值和,值

有没有更好的办法?

编辑:所有值都是非负的。所需的精度由下式定义

np.finfo(np.float32).eps

作为结果系列的平均值。我对代码进行了一些编辑以使其更清晰。

3个回答

准确到什么程度?你不只是使用numpy.mean有什么原因吗?这还不够吗?如果需要补偿浮点误差,可以尝试使用Kahan summation这是一些伪代码(PDF)。

有关浮点求和技术的评论,请参见:NJ Higham, SIAM, 1993

如果您担心浮点舍入,则对所有元素进行循环,将正元素添加到一个变量,将负元素添加到另一个变量,然后将两者相加以获得所有元素的总和。将结果除以元素的数量,您就有可能获得的最佳平均值。