计算运行标准偏差

时间:2013-06-11 19:42:37

标签: c++ statistics

我正在将方程式转换为c ++。这对于正在运行的标准偏差是否正确。

this->runningStandardDeviation = (this->sumOfProcessedSquaredSamples - sumSquaredDividedBySampleCount) / (sampleCount - 1);

这是完整的功能:

void BM_Functions::standardDeviationForRunningSamples (float samples [], int sampleCount)
{
    // update the running process samples count
    this->totalSamplesProcessed += sampleCount;

    // get the mean of the samples
    double mean = meanForSamples(samples, sampleCount);

    // sum the deviations
   // sum the squared deviations
   for (int i = 0; i < sampleCount; i++)
   {
        // update the deviation sum of processed samples
        double deviation = samples[i] - mean;
        this->sumOfProcessedSamples += deviation;

        // update the squared deviations sum
        double deviationSquared = deviation * deviation;
        this->sumOfProcessedSquaredSamples += deviationSquared;
    }

    // get the sum squared
    double sumSquared = this->sumOfProcessedSamples * this->sumOfProcessedSamples;

    // get the sum/N
    double sumSquaredDividedBySampleCount = sumSquared / this->totalSamplesProcessed;

    this->runningStandardDeviation = sqrt((this->sumOfProcessedSquaredSamples -     sumSquaredDividedBySampleCount) / (sampleCount - 1));
}

2 个答案:

答案 0 :(得分:8)

用于计算运行均值和方差/ SD的数值稳定且高效的算法是Welford's algorithm

一个C ++实现将是:

std::pair<double,double> getMeanVariance(const std::vector<double>& vec) {
    double mean = 0, M2 = 0, variance = 0;

    size_t n = vec.size();
    for(size_t i = 0; i < n; ++i) {
        double delta = vec[i] - mean;
        mean += delta / (i + 1);
        M2 += delta * (vec[i] - mean);
        variance = M2 / (i + 1);
        if (i >= 2) {
            // <-- You can use the running mean and variance here 
        }
    }

    return std::make_pair(mean, variance);
}

注意:要获得SD,只需选择sqrt(variance)

答案 1 :(得分:1)

您可以检查是否有足够的sampleSount(1会导致除以零)

确保变量具有合适的数据类型(浮点)

否则这看起来是正确的......