Berechnung der Korrelationskoeffizienten zwischen den zwei multi-dimensional arrays
Ich habe zwei arrays, die die Formen N X T
und M X T
. Ich möchte die Berechnung der Korrelationskoeffizienten über T
zwischen jedem möglichen paar Zeilen n
und m
(aus N
und M
, beziehungsweise).
Was ist die Schnellste, die meisten pythonic Weg, dies zu tun? (Schleife über N
und M
scheint mir zu sein, die weder schnell noch pythonic.) Ich erwarte noch die Antwort zu beinhalten numpy
- und/oder scipy
. Jetzt meine arrays sind numpy
array
s, aber ich bin offen für die Konvertierung in einen anderen Typ.
Erwarte ich, dass meine Ausgabe ein array mit der Form N X M
.
N. B. Wenn ich sage "Korrelationskoeffizient" meine ich die Pearson-Produkt-moment-Korrelationskoeffizient.
Hier sind einige Dinge zu beachten:
- Die
numpy
Funktioncorrelate
erfordert Eingabe-arrays zu eindimensional. - Die
numpy
Funktioncorrcoef
akzeptiert zwei-dimensionale arrays, aber Sie müssen die gleiche Form haben. - Die
scipy.stats
Funktionpearsonr
erfordert Eingabe-arrays zu eindimensional.
"same"
, ''full"
oder den Standard, mit np.correlate
? Haben Sie schreiben die verrückte version von der Lösung?ich bin auf der Suche nach
'valid'
.ja, die durchgeknallten version ist trivial:
for n in range(N):
. . . for m in range(M):
. . . correlate(arr_one[n, :], arr_two[m, :])
. . .InformationsquelleAutor dbliss | 2015-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Korrelation (default 'gültig' Fall) zwischen zwei 2D-arrays:
Kann man einfach einen matrix-Multiplikation
np.Punkt
wie soKorrelation mit der Standard -
"valid"
Fall zwischen den einzelnen paarweisen Zeile Kombinationen (row1,row2) der beiden Eingabe-arrays entspräche der Multiplikation Ergebnis bei jedem (row1,row2) position.Row-wise Korrelationskoeffizient Berechnung für zwei 2D arrays:
Dies ist, basierend auf dieser Lösung
anwenden corr2 Funktionen in Multidimentional-arrays in MATLAB
Benchmarking
Dieser Abschnitt vergleicht die Laufzeit-performance mit dem vorgeschlagenen Vorgehen gegen
generate_correlation_map
& loopypearsonr
basierten Ansatz aufgeführt, der andere Antwort.(entnommen aus der Funktiontest_generate_correlation_map()
ohne den Wert correctness verification-code am Ende). Bitte beachten Sie die Zeiten für das vorgeschlagene Konzept gehören auch ein check beim start-check für die gleiche Anzahl von Spalten in die beiden Eingabe-arrays, als auch in die andere Antwort. Die Laufzeiten aufgeführt sind, weiter.Fall #1:
Fall #2:
Fall #3:
Den anderen durchgeknallten
pearsonr based
Ansatz schien zu langsam, aber hier sind die Laufzeiten für eine kleine datasize -newaxis
war ein alias fürNone
. ich denke, Ihnen fehlt ein, :
von der Scheibe insb1
auf dem zweiten-zum-letzten-Zeile. es wäre interessant, mal unsere Antworten im Vergleich zu den Doppel-loop-Methode.[Nicht] beabsichtigt war, zu machen, dass ein zeilenvektor und das andere war aus einem Spalten-Vektor mit [:,None]. Alles, was erforderlich war, um den Rundfunk ins Spiel kommen. Hinzugefügt Laufzeit-tests, überprüfen Sie diese heraus.
Mal gespannt, ob die änderungen für Sie arbeiten?
schöne Anstrengung, aber ich bin mir nicht sicher, wie informativ das timing der Ergebnisse, die Sie berichten werden. zum Beispiel
test_generate_correlation_map
umfasst sowohl die loop-Methode und meine Funktiongenerate_correlation_map
. und obwohl dies wahrscheinlich würde nicht viel Unterschied,generate_correlation_map
Prüfungen, die zwei Eingänge haben die gleiche Größe der zweiten dimension, in der Erwägung, dass deins nicht. das sagte, ich denke, es ist sicher zu schließen, Ihre Funktion ist schneller als meins. aber kann es wahr sein, dass eine hybrid-Funktion ist der beste -- line-by-line-timing-Informationen sprechen würden.Tun Sie etwas dagegen, wenn ich den Fehler überprüfen Teil von deinem code und den code aktualisieren, schlug in diese Lösung und Laufzeiten? Ich nicht die Mühe zu zählen, wie die Frage am Anfang schon gesagt, dass diese beiden arrays müssen die gleiche Anzahl von Spalten wie T.
InformationsquelleAutor Divakar
@Divakar bietet eine große option für die Berechnung der unskalierten Zusammenhang, was ist das, was ich ursprünglich wollte.
Zur Berechnung der Korrelations-Koeffizient, ein bisschen mehr ist erforderlich:
Hier ist ein test dieser Funktion, die geht:
Überprüfen Sie heraus die änderungen in meiner Lösung.
InformationsquelleAutor dbliss