Algorithm 标准差证明的在线算法

Algorithm 标准差证明的在线算法,algorithm,math,statistics,standard-deviation,online-algorithm,Algorithm,Math,Statistics,Standard Deviation,Online Algorithm,我在回答这个问题时看到了这个算法 这是否正确计算标准偏差?有人能告诉我为什么这在数学上有效吗?最好从这个公式中返回: 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 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;
    }
}

在我链接到的部分的开头有一个

顺便说一句,我从某个地方记得这样计算会产生更多的误差。 正如您所看到的,
这个.sumsq
可以变得巨大。 而通常的计算方法总是有较小的中间值


无论如何,我确实经常使用这种在线计算,因为大多数时间误差都没有那么重要。

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


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

Bingo。如果你真的开始关心数值稳定性,你可能会想出一个两步更新;要从k Vark中获得(k+1)Vark+1,请添加(xk+1-muk)2,然后进行更新,以便从新平均值而不是旧平均值中获得差异的平方和。不确定我在wikipedia页面上怎么错过了这一点,但这完全有意义。谢谢