使用Java计算标准偏差?

时间:2017-04-06 20:03:11

标签: java math arraylist standard-deviation

我有一个整数的ArrayList:[11,15,10,19,9,1,2,16]   我似乎无法回答正确的答案。

我的代码:

static double Q2(ArrayList<Integer> input) {
    Collections.sort(input);

    ArrayList<Double> input2 = new ArrayList<>();
    double sum = 0;
    double sum2 = 0;
    double sd = 0;

    for (int i = 0; i < input.size(); i++) {
        sum = sum + input.get(i);
    }

    double mean = sum / input.size();

    for (int i = 0; i < input.size(); i++) {
        input2.add((Math.pow((input.get(i) - mean), 2)));
    }

    for (int i = 0; i < input2.size(); i++) {
        sum2 = sum2 + input2.get(i);
    }

    double mean2 = sum2 / input2.size();

    sd = Math.sqrt(mean2);

    return sd;

预期输出应为:5.998697775350913

我的输出是:6.010407640085654

感谢您的时间,非常感谢。

1 个答案:

答案 0 :(得分:3)

虽然在数学上是正确的,但从计算上讲,这是一种计算SD的可怕方法。无需先对输入进行排序。无需创建第二个数组来存储平方偏差;你可以在一个循环中添加它们。无需调用Math.Pow而不仅仅是计算z * z。

解决所有问题,你将尽可能地改进这种方法。但更好的方法是使用online algorithm,可以一次性完成。

最后,请注意,在许多情况下,当人们要求您计算SD时,他们实际上需要人口SD,而不是样本SD,这要求您将平方偏差之和除以(n-1)而不是ñ