2017-04-06 223 views
0

我有整数的ArrayList:[11,15,10,19,如图9所示,1,2,16] 和我似乎无法返回正确的答案。使用Java计算标准偏差?

我的代码:

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

谢谢您的时间,大加赞赏。

+3

我用你的代码正确的输出。 http://ideone.com/XmTDb2 – jyotesh

+0

我已经简化了你的代码:http://ideone.com/hWTBgi。结果是5.998697775350913 – Zefick

+0

也许问题出在您的输入中,请检查您在此处发布的同一列表。 – sirandy

回答

3

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

修复了这一切,你会有所改善这种方法,你可以尽可能多的。但更好的方法完全是使用online algorithm,它可以做到在一个通行证。

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