2017-04-06 221 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。