2017-04-06 2 views
0

J'ai une ArrayList d'entiers: [11, 15, 10, 19, 9, 1, 2, 16] et je ne peux pas sembler retourner la bonne réponse.Calculer la déviation standard en utilisant Java?

Mon code:

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; 

La sortie devrait être prévue: 5,998697775350913

Ma sortie est: 6,010407640085654

Merci pour votre temps, beaucoup apprécié.

+3

J'ai obtenu la bonne sortie en utilisant votre code. http://ideone.com/XmTDb2 – jyotesh

+0

J'ai simplifié votre code: http://ideone.com/hWTBgi. Le résultat est 5.998697775350913 – Zefick

+0

Peut-être que le problème est dans votre saisie, vérifiez que c'est la même liste que vous publiez ici. – sirandy

Répondre

3

Bien que cela soit mathématiquement correct, il s'agit d'une façon terrible de calculer SD. Il n'est pas nécessaire de trier les entrées en premier. Il n'est pas nécessaire de créer un second tableau pour stocker les écarts au carré; vous pouvez simplement les ajouter au fur et à mesure. Il n'est pas nécessaire d'appeler Math.Pow au lieu de simplement calculer z * z.

Corrigez tout cela, et vous aurez amélioré cette approche autant que vous le pouvez. Mais une meilleure approche consiste à utiliser un online algorithm, qui peut le faire en un seul passage. Enfin, sachez que dans de nombreux cas, lorsque les gens vous demandent de calculer le SD, ils veulent réellement la population SD, pas l'échantillon SD, qui vous oblige à diviser la somme des écarts au carré par (n-1) à la place. de n.