2009-11-14 4 views
61

Potrebbe suggerire qualche semplice pacchetto di statistiche Java?Statistiche semplici - Pacchetti Java per calcolare media, deviazione standard, ecc.

Non ho necessariamente bisogno di cose avanzate. Sono rimasto piuttosto sorpreso dal fatto che non sembra esserci una funzione per calcolare la media nel pacchetto java.lang.Math ...

Cosa state usando per questo?


EDIT

quanto riguarda:

Quanto è difficile scrivere una semplice classe che calcola mezzi e degli standard deviazioni?

Bene, non difficile. Ho fatto questa domanda solo dopo averli codificati a mano. Ma ha solo aggiunto alla mia frustrazione Java di non avere a portata di mano queste funzioni più semplici quando ne avevo bisogno. Non ricordo la formula per calcolare stdev a memoria :)

+5

Non si dovrebbe avere a ricordare a memoria. Qualsiasi linguaggio che valga la pena dovrebbe consentire di accedere facilmente alle statistiche descrittive di base. Vedere le persone chiedere "quanto è difficile scrivere una deviazione standard" è una funzione divertente ... –

risposta

72
+0

grazie. Lo prendo non c'è davvero una ragione per guardare oltre. Sei soddisfatto di Apache Commons, o è così così, abbastanza buono, potrebbe essere meglio? –

+0

Ho appena scoperto questa libreria, precisamente per calcolare la media, la deviazione standard. Molto facile da prendere. +1 – Grundlefleck

+0

L'ho trovato adatto alle mie esigenze. Anche se non ho mai affrontato personalmente questo problema o mi sono preoccupato, ho un collaboratore che lo ha trovato più lento nel calcolare la media di una matrice piuttosto che semplicemente fare un ciclo per aggiungere i valori, dividendoli poi per la dimensione dell'array. Tuttavia, il suo codice stava calcolando la media di cose che probabilmente non avrebbero mai causato errori di overflow di interi. Presumo che Commons Math sia un po 'più intelligente e non permetterà agli interi di traboccare. –

16

Proprio rispondendo a questa parte della domanda:

sono rimasto molto sorpreso che non ci fa non sembra essere una funzione per calcolare la media nel pacchetto java.lang.Math ...

Non credo di essere stato sorpreso di trovarlo. Esistono molti "algoritmi utili" che le librerie di classi Java non implementano. Non implementano tutto. E in questo, non sono diversi dagli altri linguaggi di programmazione.

In realtà sarebbe una brutta cosa se Sun ha provato a implementare troppo in J2SE:

  1. Ci vorrebbe più designer/developer/tempo tecnico documenter ... senza ritorno chiare" sugli investimenti ".

  2. Aumenterebbe l'ingombro di Java; per esempio. la dimensione di "rt.jar". (O se cercassero di mitigarlo, risulterebbe in una maggiore complessità della piattaforma ...)

  3. Per le cose nello spazio matematico, spesso è necessario implementare gli algoritmi in modi diversi (con diverse API) per soddisfare requisiti diversi.

  4. Per cose complesse, potrebbe essere meglio per Sun non provare a "standardizzare" le API, ma lasciarlo a qualche altro gruppo interessato/esperto per farlo; per esempio. la gente di Apache.

+0

+1 da parte mia - bene detto. – duffymo

1

Penso che non ci siano metodi e classi diretti in java. Dobbiamo costruirlo per conto nostro. Per le tue esigenze questo codice ti aiuterà.Calculate Standard Deviation in java

+0

Risposto due anni dopo la risposta di John Paulett. Chiaramente ci sono librerie disponibili per farlo. Non attuerò il tuo a meno che non per scopi didattici. – cowls

1
import java.util.*; 
public class stdevClass { 
    public static void main(String[] args){ 
     int [] list = {1,-2,4,-4,9,-6,16,-8,25,-10}; 
     double stdev_Result = stdev(list); 
     System.out.println(stdev(list)); 
    } 

    public static double stdev(int[] list){ 
     double sum = 0.0; 
     double mean = 0.0; 
     double num=0.0; 
     double numi = 0.0; 
     double deno = 0.0; 

     for (int i : list) { 
      sum+=i; 
     } 
     mean = sum/list.length; 

     for (int i : list) { 
      numi = Math.pow((double) i - mean), 2); 
      num+=numi; 
     } 

     return Math.sqrt(num/list.length); 
    } 
}