Ciao a tutti,
ho cominciato da poche settimane a "giochicchiare" un po' con java,
nel tentativo di programmare qualche piccola applicazione da sfruttare
per l'università, etc... ad ogni modo mi sono imbattuto in un esercizio dal
quale non riesco proprio ad uscire. Mi chiedevo se qualcuno potesse darmi
una dritta o indicarmi dove ho sbagliato...
scopo: realizzare un programma che per un insieme di soggetti sperimentali (la cui numerosità è definita dall'utente) testati su una serie di compiti indipendenti tra loro, calcoli il coefficiente di correlazione di Pearson tra ogni coppia possibile di soggetti.
per prima cosa ho realizzato un file di testo da cui leggere i dati, con questo formato:
il primo numero indica il numero dei soggetti, il secondo il numero dei trial per ogni soggetto e le righe successive alla prima indicano per ogni soggetto i risultati in ogni trial.codice:5 6 9 2 8 4 7 4 6 8 5 4 7 2 3 5 5 7 4 3 8 2 4 7 5 1
poi ho scritto quanto segue:
il problema come avrete capito è nella parte evidenziata in rosso, che calcola la covarianza in modo sbagliato... ho fatto svariati tentativi e non sono riuscito a ottenere nulla... sapreste dirmi dove ho sbagliato/consigliarmi un modo migliore per farlo? Sono consapevole che il programma non sia il massimo dell'efficienza (avrei potuto usare i metodi), ma l'ho scritto in questo modo perchè mi risulta più chiaro... la domanda in questo caso riguarda solo il risultato finale, non l'efficienza dello stesso =Dcodice:import java.util.*; import java.io.*; public class Fattori { public static void main(String[]args) throws IOException { /**da le istruzioni in caso di avvio del programma senza aver impostato gli args*/ if (args.length != 2) { // se il numero di argomenti è sbagliato stampo le istruzioni System.out.println("Utilizzo:"); System.out.println(" Fattori fileIngresso fileUscita"); System.out.println(""); System.out.println("dove:"); System.out.println("- fileIngresso e' il file contenente i dati"); System.out.println("- fileUscita è il file su cui si andrà a scrivere i risultati"); System.exit(0); } /**creazione variabili e lettura/scrittura */ Scanner s = new Scanner (new FileReader (args[0])); PrintWriter pw = new PrintWriter (new FileWriter (args[1])); int numero_s; int numero_v; int[][]valori; double[][]correlazioni_s; double[]medie; double[]varianze; double[]devst; double[][]cov; /**assegnazione valori alle matrici e calcolo numero correlazioni*/ numero_s = s.nextInt(); numero_v = s.nextInt(); valori = new int[numero_s][numero_v]; correlazioni_s = new double[numero_s][numero_s]; medie = new double [numero_s]; varianze = new double [numero_s]; devst = new double [numero_s]; cov = new double [numero_s][numero_s]; /**inserimento valori in matrice*/ for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_v; j++) { valori [i][j] = s.nextInt(); } } /**stampa matrice*/ for (int i = 0; i<valori.length; i++) { for (int j = 0; j<valori[i].length; j++) { System.out.printf ("%5d ", valori[i][j]); } System.out.printf ("%n"); } System.out.printf ("%n"); /**calcolo le correlazioni prodotto-momento di Bravis-Pearson per i soggetti*/ /**calcolo la media di ogni soggetto = M*/ for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_v; j++) { medie[i] = (double) medie[i] + valori[i][j]; } medie[i] = medie[i]/numero_v; } /**calcolo la varianza di ogni soggetto = S^2*/ for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_v; j++) { varianze[i] = varianze[i] + Math.pow(valori[i][j] - medie[i], 2); } varianze[i] = varianze[i]/numero_v; } /**calcolo la deviazione standard di ogni soggetto = S*/ for (int i = 0; i<numero_s; i++) { devst[i] = Math.sqrt(varianze[i]); } /**calcolo delle covarianze delle coppie di soggetti*/ for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_s; j++) { for (int k = 0; k<numero_v; k++) { cov[i][j] = cov[i][j] + ((valori [i][k]-medie[i])*(valori[j] [k]-medie[j])); } cov[i][j] = cov[i][j]/numero_v; } } /**calcolo correlazioni*/ for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_s; j++) { correlazioni_s[i][j] = cov[i][j]/(devst[i]*devst[j]); } } /**prova stampa di tutto*/ for (int i = 0; i<valori.length; i++) { System.out.printf ("%5.2f ", medie[i]); System.out.printf ("%5.2f ", varianze[i]); System.out.printf ("%5.2f ", devst[i]); System.out.printf ("%n"); } System.out.printf ("%n"); for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_s; j++) { System.out.printf ("%5.2f ", cov[i][j]); } System.out.printf ("%n"); } System.out.printf ("%n"); for (int i = 0; i<numero_s; i++) { for (int j = 0; j<numero_s; j++) { System.out.printf ("%5.2f ", correlazioni_s[i][j]); } System.out.printf ("%n"); } /**chiudo i flussi*/ s.close(); pw.close(); } }
grazie a chiunque avrà la pazienza di darmi una mano,
ciao!