问题来源:算法第四版习题1.2.18,累加器的方差里用递推来计算平均值和方差:
-
public
class Accumulator
-
{
-
private
double m;
-
private
double s;
-
private
int N;
-
public void addDateValue(double x)
-
{
-
N++;
-
s=s+
1.0*(N-
1)/N*(x-m)*(x-m);
-
m=m+(x-m)/N;
-
}
-
public double mean()
-
{
-
return m;
-
}
-
public double var()
-
{
-
return s/(N-
1);
-
}
-
public double stddev()
-
{
-
return Math.sqrt(
this.var());
-
}
-
}
均值的更新很好理解,那么方差的更新是怎么做到的呢?
公式推导:
均值定义:
方差定义:
均值的递推:
方差的推导:
其中
这样递推的好处:
1.实时更新数据;2.减小运算量;3.更好的避免四舍五入带来的误差。