我在回答question时看到了这个算法。
这是否正确计算标准偏差?有人可以告诉我为什么这在数学上有效吗?最好从这个公式回溯:
public class Statistics {
private int n;
private double sum;
private double sumsq;
public void reset() {
this.n = 0;
this.sum = 0.0;
this.sumsq = 0.0;
}
public synchronized void addValue(double x) {
++this.n;
this.sum += x;
this.sumsq += x*x;
}
public synchronized double calculateMean() {
double mean = 0.0;
if (this.n > 0) {
mean = this.sum/this.n;
}
return mean;
}
public synchronized double calculateStandardDeviation() {
double deviation = 0.0;
if (this.n > 1) {
deviation = Math.sqrt((this.sumsq - this.sum*this.sum/this.n)/(this.n-1));
}
return deviation;
}
}
答案 0 :(得分:2)
我链接到的部分的开头有一个proof on wikipedia。
顺便说一句,我记得从某个地方开始计算这种方式会产生更多错误。
正如您所看到的,this.sumsq
可能变得巨大。
而计算正常方式的中间值总是较小。
无论如何,我确实使用了这个在线计算,因为大多数时候错误并不重要。
答案 1 :(得分:0)
我认为人口标准偏差会在该公式中用N-1代替N,因为当给出均值时,有一个自由度较少。我不是统计学家,所以我没有证据。
公式是正确的 - 标准差是均值方差的平方根。