我的标准偏差计算能否更有效率?

时间:2016-03-23 18:32:36

标签: java performance statistics java-8

我很好奇我的标准偏差方法是否可以提高效率。通过有效我的意思是快速,并且快速意味着从方法调用到方法返回的延迟。

以下是代码:

public double stdDev(ArrayList<Double> input) {

    double Nrecip   = ( 1.0 / ( input.size()) );
    double sum      = 0.0;
    double average  = 0.0;

    for (Double input : inputs) {
        average += input;
    } average *= Nrecip;

    for (Double input : inputs) {
        sum += ( (input - average)*(input - average) );
    } sum *= Nrecip;

    return Math.sqrt(sum);

}

我很感激任何建议。

2 个答案:

答案 0 :(得分:4)

您可以一次性计算标准偏差。使用double[]也会更有效。

public static double stdDev(double... a) {
    double sum = 0;
    double sq_sum = 0;
    for (int i = 0; i < n; ++i) {
        double ai = a[i];
        sum += ai;
        sq_sum += ai * ai;
    }
    double mean = sum / n;
    double variance = sq_sum / n - mean * mean;
    return Math.sqrt(variance);
}

此解决方案的转换in C here

传递内存一次可以提高性能。

答案 1 :(得分:0)

使用org.apache.commons.math3.stat.descriptive

public double stdDev(ArrayList<Double> input) { 

    DescriptiveStatistics ds = new DescriptiveStatistics(input.toArray(new Double[0]));

    return ds.getStandardDeviation();

}