Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA] calcolo dell'indice di correlazione di Pearson

    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:
    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
    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.

    poi ho scritto quanto segue:
    codice:
    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();
    	}
    }
    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 =D
    grazie a chiunque avrà la pazienza di darmi una mano,
    ciao!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [JAVA] calcolo dell'indice di correlazione di Pearson

    Originariamente inviato da soremind7
    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:
    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
    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.
    domanda delle domande: cosa c'è che non va nel codice?
    RTFM Read That F*** Manual!!!

  3. #3
    ho inviato il messaggio per sbaglio prima di finire di scriverlo, ora ho editato... sorry =D

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok...la formula di calcolo della correlazione tra soggetti quale è? cioè su carta come la scrivi?
    RTFM Read That F*** Manual!!!

  5. #5
    facendo qualche prova ulteriore pare che il programma funzioni...
    quel burlone del professore ci ha fornito un esempio pieno di errori -.-
    perdonate il disturbo e grazie per il tentativo di aiuto =D

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prego, ti lascio un consiglio:
    quando hai di questi dubbi scrivi un attimo su carta cosa deve fare la tua formula, dopo di che traducila nel linguaggio di programmazione che hai (quindi rispettando le regole del linguaggio).

    Ti sarai accorto pure tu che con robe simili è facile sbagliare
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.