我需要计算任意数量数据点(至少100百万个)的16位操作的均方误差。 我决定使用滑动平均值,这样我就不必担心加上大量平方误差会导致溢出。 在100百万个样本时,我遇到了浮点精度问题(不准确的结果),因此我改用双精度浮点数。
这是我的代码:
这是我的代码:
int iDifference = getIdeal() - getValue();
m_iCycles++;
// calculate the running MSE as
// http://en.wikipedia.org/wiki/Moving_average
// MSE(i + 1) = MSE(i) + (E^2 - MSE(i))/(i + 1)
m_dMSE = m_dMSE + ((pow((double)iDifference,2) - m_dMSE) / (double)m_iCycles);
有没有更好的方法来实现这个以保持准确性?我考虑将MSE归一化为1,然后仅保留一个总和,在完成时进行最终除法以计算平均值。
pow(double, int)
重载,iDifference*iDifference
可能比pow
调用快几个数量级。 - Mark B