【问题标题】:Can my standard deviation calculation be made more efficient?我的标准差计算可以提高效率吗?
【发布时间】:2016-07-11 05:05:33
【问题描述】:

我很好奇我的标准差方法是否可以提高效率。高效是指快速,快速是指从方法调用到方法返回的延迟。

代码如下:

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

}

如果有任何建议,我将不胜感激。

【问题讨论】:

  • 你可以做average += Nrecip*input;,但这不会让任何事情变得更快
  • 您可以使用double 而不是Double 并使用一小部分内存。
  • 只计算一次(input - average) 而不是两次?
  • 只使用一个for循环并使用Var(X) = E[ (X-E[X])² ] = E[X²] - (E[X])²这一事实

标签: java performance statistics java-8


【解决方案1】:

您可以一次计算标准偏差。使用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的转换

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

【讨论】:

  • 很好的答案,谢谢。 double... a 是什么意思?我不熟悉那种语法。另外,我正在使用ArrayList&lt;Double&gt;,因为这种方法通常会滚动使用,因此使用ArrayList 可以进行简单的更新。两种数据结构之间的速度损失是否显着?我以为ArrayList 有固定的阅读时间。
  • @d0rmLife ArrayList 是一个常数时间,创建 new Double 的成本也是如此,但常数因子更高。使用double.. 就像一个数组,但您可以使用double d = stdDev(1,2,3,4,5); 使用double[] 可以使用ArrayList&lt;Double&gt; 的约28% 的内存,这在您开始用完CPU 缓存时会有所不同。
  • @d0rmLife 这里是一个类的示例,它包装了 double[] 但行为类似于 ArrayList trove4j.sourceforge.net/javadocs/gnu/trove/list/array/…
  • 我读对了吗,您可以计算总体所有平方的总和,然后方差 = (sq_sum / n) - (mean*mean)?方差是否可能为负数?
  • @simgineer 仅当存在表示错误时。平均值的平方应始终小于(或等于)平方的平均值。
【解决方案2】:

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

public double stdDev(ArrayList<Double> input) { 

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

    return ds.getStandardDeviation();

}

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2013-08-27
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多