标准偏差证明的在线算法

时间:2013-06-01 22:50:18

标签: algorithm math statistics standard-deviation online-algorithm

我在回答question时看到了这个算法。

这是否正确计算标准偏差?有人可以告诉我为什么这在数学上有效吗?最好从这个公式回溯:

enter image description here

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;
    }
}

2 个答案:

答案 0 :(得分:2)

我链接到的部分的开头有一个proof on wikipedia

enter image description here

顺便说一句,我记得从某个地方开始计算这种方式会产生更多错误。 正如您所看到的,this.sumsq可能变得巨大。 而计算正常方式的中间值总是较小。

无论如何,我确实使用了这个在线计算,因为大多数时候错误并不重要。

答案 1 :(得分:0)

我认为人口标准偏差会在该公式中用N-1代替N,因为当给出均值时,有一个自由度较少。我不是统计学家,所以我没有证据。

公式是正确的 - 标准差是均值方差的平方根。