3 Stimmen

Perl: Programmiereffizienz bei der Berechnung von Korrelationskoeffizienten für eine große Datenmenge

EDIT: Der Link sollte jetzt funktionieren, entschuldigen Sie die Störung

Ich habe eine Textdatei, die wie folgt aussieht:

Name, Test 1, Test 2, Test 3, Test 4, Test 5
Bob, 86, 83, 86, 80, 23
Alice, 38, 90, 100, 53, 32
Jill, 49, 53, 63, 43, 23.

Ich schreibe ein Programm, das aus dieser Textdatei eine Pearsonsche Korrelationskoeffiziententabelle erstellt, die wie folgt aussieht, wobei der Eintrag (x,y) die Korrelation zwischen Person x und Person y darstellt:

Name,Bob,Alice,Jill
Bob, 1, 0.567088412588577, 0.899798494392584
Alice, 0.567088412588577, 1, 0.812425393004088
Jill, 0.899798494392584, 0.812425393004088, 1

Mein Programm funktioniert, aber der Datensatz, mit dem ich es füttere, hat 82 Spalten und, was noch wichtiger ist, 54000 Zeilen. Wenn ich mein Programm jetzt ausführe, ist es unglaublich langsam und ich erhalte eine Fehlermeldung wegen Speichermangels. Gibt es eine Möglichkeit, wie ich zunächst einmal die Möglichkeit eines Fehlers wegen Speichermangels beseitigen und das Programm vielleicht ein wenig effizienter machen kann? Der Code ist hier: Code .

Vielen Dank für Ihre Hilfe,
Jack

Edit: Für den Fall, dass jemand anderes versucht, Berechnungen in großem Maßstab durchzuführen, konvertieren Sie Ihre Daten in das hdf5-Format. So habe ich dieses Problem schließlich gelöst.

1voto

Chas. Owens Punkte 62716

Ich weiß nicht genug darüber, was Sie vorhaben, um Ihnen gute Ratschläge für die Umsetzung geben zu können, aber Sie könnten sich Folgendes ansehen Statistics::LSNoHistory behauptet sie, eine Methode zu haben pearson_r die den Korrelationskoeffizienten r von Pearson liefert.

0voto

DaGaMs Punkte 1521

Im Anschluss an den obigen Kommentar zu PDL finden Sie hier den Code, mit dem sich die Korrelationstabelle auch für sehr große Datensätze recht effizient berechnen lässt:

use PDL::Stats; # this useful module can be downloaded from CPAN
my $data = random(82, 5400); # your data should replace this
my $table = $data->corr_table(); # that's all, really

Sie müssen möglicherweise Folgendes einstellen $PDL::BIGPDL = 1; in den Header Ihres Skripts ein und stellen Sie sicher, dass Sie das Skript auf einem Rechner mit sehr viel Speicher ausführen. Die Berechnung selbst ist ziemlich schnell, eine 82 x 5400 Tabelle dauerte auf meinem Laptop nur ein paar Sekunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X