2017-04-06 11 views
0

私は整数のArrayListを持っています:[11,15,10,19,9,2,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を計算するためのひどい方法です。入力を最初にソートする必要はありません。二乗偏差を保存するために2番目の配列を作成する必要はありません。あなたは1つのループでそれらを追加することができます。 z * zを計算する代わりにMath.Powを呼び出す必要はありません。

これをすべて修正すれば、できるだけこのアプローチを改善することができます。しかし、より良いアプローチは、online algorithmを使用することです.1回のパスでそれを実行できます。

最後に、人々があなたにSDを計算するように頼んだら、多くの場合、サンプルSDではなく実際に人口SDを求めているので、二乗偏差の合計を(n-1) nの

関連する問題