2010-12-18 4 views
22

Für Daten, von denen bekannt ist, dass sie saisonale oder tägliche Muster haben, würde ich gerne eine Fourier-Analyse verwenden, um Vorhersagen zu treffen. Nach dem Ausführen von fft auf Zeitreihendaten erhalte ich Koeffizienten. Wie kann ich diese Koeffizienten für die Vorhersage verwenden?Verwenden der Fourier-Analyse für die Zeitreihenvorhersage

Ich glaube, FFT nimmt an, dass alle Daten, die es empfängt, eine Periode bilden, wenn ich dann einfach Daten mit iftt regeneriere, regeneriere ich auch die Fortsetzung meiner Funktion, also kann ich diese Werte für zukünftige Werte verwenden?

Einfach ausgedrückt: Ich führe fft für t = 0,1,2, .. 10 dann mit ift on coef, kann ich regenerierte Zeitreihe für t = 11,12, .. 20?

Antwort

18

Es klingt wie Sie wollen eine Kombination von Extrapolation und denoising.

Sie möchten die beobachteten Daten über mehrere Zeiträume hinweg wiederholen. Nun, dann wiederhole einfach die beobachteten Daten. Keine Notwendigkeit für Fourier-Analyse.

Aber Sie wollen auch "Muster" finden. Ich nehme an, dass das bedeutet, die dominierenden Frequenzkomponenten in den beobachteten Daten zu finden. Dann ja, nimm die Fourier-Transformation, bewahre die größten Koeffizienten und beseitige den Rest.

X = scipy.fft(x) 
Y = scipy.zeros(len(X)) 
Y[important frequencies] = X[important frequencies] 

Wie für periodische Wiederholung: Let z = [x, x], das heißt zwei Perioden des Signals x. Dann Z[2k] = X[k] für alle k in {0, 1, ..., N-1} und sonst Nullen.

Z = scipy.zeros(2*len(X)) 
Z[::2] = X 
+1

Sie wiederholen also die wichtigsten Koeffizienten in Z (zweimal im obigen Beispiel), und wenn ifft verwendet wird, um meine Zeitreihe zu regenerieren, wird diese neue Serie länger als das Original sein und per Definition Vorhersagen enthalten. – user423805

+1

Ich denke, mit der Rauschunterdrückung meinst du die wichtigsten Koeffizienten auszuwählen. – user423805

+1

'Z = [X [0], 0, X [1], 0, X [2], 0, ..., X [N-1], 0]'. Wenn du das meinst, dann ja. Und ja, das Beibehalten der wichtigsten Koeffizienten hat einen "Glättungs-" oder "Unschärfe" - oder "Rauschunterdrückungs" -Effekt auf das Signal. –

6

Wenn Sie eine FFT für Zeitreihendaten ausführen, transformieren Sie sie in die Frequenzdomäne. Die Koeffizienten multiplizieren die Terme in der Reihe (Sinus und Kosinus oder komplexe Exponentialfunktion) mit jeweils unterschiedlicher Frequenz.

Extrapolation ist immer eine gefährliche Sache, aber Sie können es gerne versuchen. Sie verwenden vergangene Informationen, um die Zukunft vorherzusagen, wenn Sie das tun: "Sagen Sie das Wetter von morgen voraus, indem Sie auf heute schauen." Seien Sie sich der Risiken bewusst.

Ich würde empfehlen zu lesen "Black Swan".

+2

Ich las Black Swan. Ich spreche nicht unbedingt von Aktienkursen. Sagen wir mal ... Erntedaten, die sehr saisonal sind, oder die berühmten Sonnenfleckendaten. Ich spreche also von etwas Vorhersehbarem. – user423805

+0

Lassen Sie mich etwas weiter erklären: Sagen wir, ich habe eine Frequenz gefunden, die in den Daten ziemlich dominant ist. Wie verknüpfe ich das mit Punkten in den Zeitdomänen-Daten, so kann ich voraus und in der Zukunft springen und Vorhersagen treffen. – user423805

+2

+1. Extrapolation ist gefährlich, ja. Normalerweise machen Menschen Modelle und gehen davon aus, dass sich die Zukunft so verhalten wird, wie das Modell sagt. Modelle hängen von Parametern ab, die mit gegenwärtigen oder früheren Beobachtungen geschätzt werden. Sie "prognostizieren" also nichts, Sie passen nur ein Modell an. –

18

Ich bin mir bewusst, dass diese Frage kann mehr für Sie nicht unbedingt sein, aber für andere, die nach Antworten suchen Ich schrieb ein sehr einfaches Beispiel für fourier Extrapolation in Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce

Bevor Sie das ausführen Stellen Sie sicher, dass Sie alle Abhängigkeiten installiert haben (numpy, matplotlib). Fühlen Sie sich frei, damit zu experimentieren. enter image description here P.S. Lokal stationäres Wavelet ist möglicherweise besser als Fourier-Extrapolation. LSW wird häufig zur Vorhersage von Zeitreihen verwendet. Der Hauptnachteil der Fourier-Extrapolation ist, dass sie einfach Ihre Reihe mit der Periode N wiederholt, wobei N - die Länge Ihrer Zeitreihe ist.

+0

Also sorry, nur um sicherzugehen, dass ich verstehe. x (blaue Linie) sind die beobachteten Daten? Extrapolation (rote Linie) ist die Vorhersage? –

+0

@jeffery_the_wind Ja, die rote Linie ist die Vorhersage und blau sind beobachtete Daten. Offensichtlich gibt es in diesem Beispiel eine Überanpassung, um zu vermeiden, dass Sie die Anzahl der Harmonischen im Modell anpassen können. – tartakynov

+2

Dieses gute visuelle Beispiel demonstriert die in den anderen Posts aufgezeigte Schwäche: Der Frequenzbereich erzeugt aufgrund seiner Beschaffenheit im Zeitbereich feste Zyklen. Die Extrapolation der roten Linie oben ist einfach eine Kopie des Anfangssegments der blauen (beobachteten) Linie, wenn auch geringfügig entnotiert. Um eine aussagekräftige Kurzzeitvorhersage über horizon * h * -Zeiteinheiten zu ermöglichen, sollten bei der Extrapolation nur die signifikantesten ** hohen ** Frequenzkoeffizienten verwendet werden, wobei * h * die Anzahl der historischen Beobachtungen ist. Eine "hohe" Frequenzschwelle kann beliebig in Bezug auf * h * definiert werden. –

0

können Sie die Bibliothek verwenden, die gebucht @tartakynov und nicht genau die gleiche Zeitreihen im forcast zu wiederholen (Overfitting), können Sie einen neuen Parameter an die n_param und fixieren eine untere Schranke genannt Funktion hinzufügen h für die Amplituden der Frequenzen.

def fourierExtrapolation(x, n_predict,n_param): 

in der Regel werden Sie, dass in einem Signal finden, gibt es einige Frequenzen, die wesentlich höhere Amplitude als andere haben, so, wenn Sie wählen diese Frequenzen Sie in der Lage sein wird, die periodische Natur des Signals zu isolieren

können Sie diese zwei Zeilen hinzufügen, die durch bestimmte Anzahl n_param

bestimmt sind
h=np.sort(x_freqdom)[-n_param] 
x_freqdom=[ x_freqdom[i] if np.absolute(x_freqdom[i])>=h else 0 for i in range(len(x_freqdom)) ] 

nur das hinzufügen Sie schön und glatt in der Lage zu prognostizieren

ein weiterer nützlicher Artikel über FFt: forecast FFt in R

+0

Hallo der Link, den Sie zur Verfügung gestellt haben, ist kaputt. Kannst du bitte noch einmal posten, wenn möglich oder wenn du hast? Vielen Dank. – dhinar

+1

@DhivyaNarayanasamy behoben;) –

Verwandte Themen