Ich muss eine automatische Korrelation einer Menge von Zahlen durchführen, was meines Wissens nur die Korrelation der Menge mit sich selbst ist.
Ich habe es mit der Korrelationsfunktion von numpy versucht, aber ich glaube dem Ergebnis nicht, da es fast immer einen Vektor ergibt, bei dem die erste Zahl nicht die größte ist, wie es sein sollte.
Diese Frage besteht also eigentlich aus zwei Fragen:
- Was genau
numpy.correlate
macht das? - Wie kann ich es (oder etwas anderes) verwenden, um eine Autokorrelation durchzuführen?
Antworten:
Um Ihre erste Frage zu beantworten,
numpy.correlate(a, v, mode)
führen Sie die Faltunga
mit der Umkehrung von durchv
und geben Sie die Ergebnisse an, die durch den angegebenen Modus abgeschnitten wurden. Die Definition der Faltung , C (t) = ∑ -∞ <i <∞ a i v t + i wobei -∞ <t <∞, ermöglicht Ergebnisse von -∞ bis ∞, aber Sie können offensichtlich nicht unendlich lange speichern Array. Es muss also abgeschnitten werden, und hier kommt der Modus ins Spiel. Es gibt drei verschiedene Modi: voll, gleich und gültig:t
wo beidea
undv
haben eine gewisse Überlappung.a
oderv
) zurück.a
undv
vollständig überlappen einander. In der Dokumentation zu finden Sienumpy.convolve
weitere Informationen zu den Modi.Ihre zweite Frage, ich denke ,
numpy.correlate
wird Ihnen die Autokorrelation zu geben, wird es geben Sie nur ein wenig mehr als gut. Die Autokorrelation wird verwendet, um herauszufinden, wie ähnlich ein Signal oder eine Funktion zu einem bestimmten Zeitunterschied sich selbst ist. Bei einer Zeitdifferenz von 0 sollte die Autokorrelation am höchsten sein, da das Signal mit sich selbst identisch ist. Sie haben also erwartet, dass das erste Element im Ergebnisfeld der Autokorrelation das größte ist. Die Korrelation beginnt jedoch nicht mit einer Zeitdifferenz von 0. Sie beginnt mit einer negativen Zeitdifferenz, schließt sich zu 0 und wird dann positiv. Das heißt, Sie haben erwartet:Autokorrelation (a) = ∑ -∞ <i <∞ a i v t + i wobei 0 <= t <∞
Aber was du hast war:
Autokorrelation (a) = ∑ -∞ <i <∞ a i v t + i wobei -∞ <t <∞
Was Sie tun müssen, ist die letzte Hälfte Ihres Korrelationsergebnisses zu nehmen, und das sollte die Autokorrelation sein, nach der Sie suchen. Eine einfache Python-Funktion dazu wäre:
Sie müssen natürlich eine Fehlerprüfung durchführen, um sicherzustellen, dass
x
es sich tatsächlich um ein 1-D-Array handelt. Auch diese Erklärung ist wahrscheinlich nicht die mathematisch strengste. Ich habe Unendlichkeiten herumgeworfen, weil die Definition der Faltung sie verwendet, aber das gilt nicht unbedingt für die Autokorrelation. Der theoretische Teil dieser Erklärung mag etwas wackelig sein, aber hoffentlich sind die praktischen Ergebnisse hilfreich. Diese Seiten zur Autokorrelation sind ziemlich hilfreich und können Ihnen einen viel besseren theoretischen Hintergrund bieten, wenn es Ihnen nichts ausmacht, durch die Notation und die umfangreichen Konzepte zu waten.quelle
return numpy.correlate(x, x, mode='same')
np.correlate(x,x,mode='full')[len(x)//2:] != np.correlate(x,x,mode='same')
. Zum Beispielx = [1,2,3,1,2]; np.correlate(x,x,mode='full');
{>>> array([ 2, 5, 11, 13, 19, 13, 11, 5, 2])
}np.correlate(x,x,mode='same');
{>>> array([11, 13, 19, 13, 11])
}. Das richtige ist:np.correlate(x,x,mode='full')[len(x)-1:];
{>>> array([19, 13, 11, 5, 2])
} siehe, das erste Element ist das größte .[len(x)-1:]
beginnt mit der 0-Verzögerung. Da derfull
Modus eine Ergebnisgröße ergibt2*len(x)-1
, ist A.Levy's[result.size/2:]
dieselbe wie[len(x)-1:]
. Es ist jedoch besser, es zu einem Int zu machen[result.size//2:]
.Die Autokorrelation gibt es in zwei Versionen: statistisch und Faltung. Beide machen dasselbe, bis auf ein kleines Detail: Die statistische Version ist so normalisiert, dass sie im Intervall [-1,1] liegt. Hier ist ein Beispiel, wie Sie die statistische erstellen:
quelle
numpy.corrcoef[x:-i], x[i:])[0,1]
in der zweiten Zeile als Rückgabewertcorrcoef
eine 2x2-MatrixVerwenden Sie
numpy.corrcoef
stattdessen die Funktionnumpy.correlate
, um die statistische Korrelation für eine Verzögerung von t zu berechnen:quelle
Ich denke, es gibt zwei Dinge, die dieses Thema verwirren:
Ich habe 5 Funktionen erstellt, die die Autokorrelation eines 1d-Arrays mit partiellen und nicht partiellen Unterscheidungen berechnen. Einige verwenden Formeln aus Statistiken, andere Korrelate im Sinne der Signalverarbeitung, was auch über FFT erfolgen kann. Alle Ergebnisse sind jedoch Autokorrelationen in der Statistikdefinition , sodass sie veranschaulichen, wie sie miteinander verknüpft sind. Code unten:
Hier ist die Ausgabezahl:
Wir sehen nicht alle 5 Linien, da sich 3 davon überlappen (lila). Die Überlappungen sind alle nicht partielle Autokorrelationen. Dies liegt daran, dass Berechnungen aus den Signalverarbeitungsverfahren (
np.correlate
FFT) nicht für jede Überlappung einen anderen Mittelwert / Standard berechnen.Beachten Sie auch, dass das
fft, no padding, non-partial
Ergebnis (rote Linie) anders ist, da die Zeitreihen vor der FFT nicht mit 0s aufgefüllt wurden, sodass es sich um eine kreisförmige FFT handelt. Ich kann nicht im Detail erklären, warum, das habe ich von anderswo gelernt.quelle
Da ich gerade auf dasselbe Problem gestoßen bin, möchte ich ein paar Codezeilen mit Ihnen teilen. Tatsächlich gibt es mittlerweile mehrere ziemlich ähnliche Beiträge zur Autokorrelation im Stapelüberlauf. Wenn Sie die Autokorrelation als
a(x, L) = sum(k=0,N-L-1)((xk-xbar)*(x(k+L)-xbar))/sum(k=0,N-1)((xk-xbar)**2)
[dies ist die Definition in der a_correlate-Funktion von IDL und sie stimmt mit dem überein, was ich in Antwort 2 von Frage Nr. 12269834 sehe ] definieren, scheint das Folgende die richtigen Ergebnisse zu liefern:Wie Sie sehen, habe ich dies mit einer Sinuskurve und einer gleichmäßigen Zufallsverteilung getestet, und beide Ergebnisse sehen so aus, als würde ich sie erwarten. Beachten Sie, dass ich
mode="same"
stattmode="full"
wie die anderen verwendet habe.quelle
Ihre Frage 1 wurde hier bereits ausführlich in mehreren ausgezeichneten Antworten erörtert.
Ich wollte Ihnen einige Codezeilen mitteilen, mit denen Sie die Autokorrelation eines Signals nur anhand der mathematischen Eigenschaften der Autokorrelation berechnen können. Das heißt, die Autokorrelation kann auf folgende Weise berechnet werden:
subtrahieren Sie den Mittelwert vom Signal und erhalten Sie ein unverzerrtes Signal
Berechnen Sie die Fourier-Transformation des unverzerrten Signals
Berechnen Sie die spektrale Leistungsdichte des Signals, indem Sie die Quadratnorm jedes Werts der Fourier-Transformation des unverzerrten Signals nehmen
Berechnen Sie die inverse Fourier-Transformation der spektralen Leistungsdichte
Normalisieren Sie die inverse Fourier-Transformation der spektralen Leistungsdichte durch die Summe der Quadrate des unverzerrten Signals und nehmen Sie nur die Hälfte des resultierenden Vektors
Der Code dafür lautet wie folgt:
quelle
p = np.abs(f)
?Ich bin ein Computerbiologe, und als ich die Auto- / Kreuzkorrelationen zwischen Paaren von Zeitreihen stochastischer Prozesse berechnen musste, stellte ich fest, dass dies
np.correlate
nicht die Arbeit war, die ich brauchte.In der Tat scheint
np.correlate
die Mittelung über alle möglichen Paare von Zeitpunkten in der Entfernung 𝜏 zu fehlen .So habe ich eine Funktion definiert, die das tut, was ich brauchte:
Es scheint mir, dass keine der vorherigen Antworten diesen Fall der Auto- / Kreuzkorrelation abdeckt: Ich hoffe, diese Antwort kann für jemanden nützlich sein, der an stochastischen Prozessen wie mir arbeitet.
quelle
Ich verwende talib.CORREL für eine solche Autokorrelation. Ich vermute, Sie könnten dasselbe mit anderen Paketen tun:
quelle
Verwendung der Fourier-Transformation und des Faltungssatzes
Die Zeitkomplexität ist N * log (N)
Hier ist eine normalisierte und unvoreingenommene Version, es ist auch N * log (N)
Die von A. Levy bereitgestellte Methode funktioniert, aber ich habe sie auf meinem PC getestet. Die zeitliche Komplexität scheint N * N zu sein
quelle
Eine Alternative zu numpy.correlate finden Sie in statsmodels.tsa.stattools.acf () . Dies ergibt eine kontinuierlich abnehmende Autokorrelationsfunktion wie die von OP beschriebene. Die Implementierung ist ziemlich einfach:
Das Standardverhalten ist das Stoppen bei 40 Verzögerungen. Dies kann jedoch mit der
nlag=
Option für Ihre spezifische Anwendung angepasst werden . Am Ende der Seite befindet sich ein Zitat für die Statistiken hinter der Funktion .quelle
Ich denke, die eigentliche Antwort auf die Frage des OP ist in diesem Auszug aus der Numpy.correlate-Dokumentation kurz und bündig enthalten:
Dies impliziert, dass die Numpy.correlate-Funktion bei Verwendung ohne 'mode'-Definition einen Skalar zurückgibt, wenn für ihre beiden Eingabeargumente derselbe Vektor angegeben wird (dh - wenn sie zur Durchführung der Autokorrelation verwendet wird).
quelle
Eine einfache Lösung ohne Pandas:
quelle
Zeichnen Sie die statistische Autokorrelation bei einer Pandas-Datenzeit. Serie von Rückgaben:
quelle
autocorrelation_plot()
in diesem Fall verwenden? (vgl. stats.stackexchange.com/questions/357300/… )