Ich habe versucht, die für das maschinelle Lernen erforderlichen Funktionen durch Fourier-Transformation aus Zeitreihendaten zu finden. Es gab einige Artikel, die automatisch periodische Funktionen erstellten und analysierten, aber ich nahm mir Zeit, um herauszufinden, wie ich mit tatsächlichen Daten umgehen sollte, und erstellte sie als Memorandum. Ich habe es auch zusammengefasst, einschließlich des Verständnisses der Konzepte und Begriffe. Es kann mehrdeutig sein, weil es ein grobes Verständnis ist. Bitte weisen Sie auf Fehler hin.
Um die Fourier-Transformation kurz zusammenzufassen: __ Eine Umwandlung des periodischen Signals von Zeitreihendaten für den Zeitbereich in ein Spektrum im Frequenzbereich __ werden. Durch Anwenden einer Fensterfunktion (im Allgemeinen eines summenden Fensters) wird sie auch zwangsweise als periodisch angesehen.
Die Hochgeschwindigkeits-Fourier-Transformation bezieht sich auf eine diskrete Fourier-Transformation, die mit hoher Geschwindigkeit berechnet werden kann, wenn die Anzahl der Daten die Potenz von 2 ist. Ich verstehe die Details von Formeln und Algorithmen nicht, aber wenn Sie eine große Datenmenge haben, können Sie erwarten, die Berechnungsgeschwindigkeit zu verbessern, indem Sie auf 0 auffüllen und die Anzahl der Daten auf die Potenz von 2 ausrichten.
Zunächst werden die Rohdaten so wie sie sind einer Fourier-Transformation unterzogen. Hier wird Numpys fft verwendet. (Numpy Version ist '1.18.1') https://numpy.org/doc/stable/reference/generated/numpy.fft.fft.html FFT ist eine schnelle Fourier-Transformation, aber wenn Sie einen Wert an numpy übergeben, wird sie Fourier-transformiert, auch wenn es sich nicht um eine Zweierpotenz handelt. Mit anderen Worten wird angenommen, dass FFT ausgeführt wird, wenn die Potenz von 2 Leistung ist, und DFT ausgeführt wird, wenn es nicht die Potenz von 2 ist. Diese Daten sind 30fps 1 Sekunde Daten Das heißt, die Probendaten 30 werden einer Fourier-Transformation unterzogen. Dieses Mal werden eine Spalte und 30 Zeilen einer bestimmten CSV-Datei als Daten behandelt.
Datenabruf
#Import der benötigten Bibliotheken
import numpy as np
#Lade Daten
data = np.loadtxt('____.csv', delimiter=',', dtype=float)
features = data[0:30,0:1]
features[0:30,0:1]
Die 30 Daten, die Sie analysieren möchten, wurden in Features importiert. Übrigens sind die Daten in Features die folgenden Array-Daten.
features
array([[0.32640783],[0.32772677],[0.32963271],[0.32872528],[0.33125733],[0.3250282 ],[0.33900562],[0.33105499],[0.33294834],[0.34554142],[0.33217829],[0.33006385],[0.33765947],[0.33173415],[0.33826796][0.34325231],[0.35284764],[0.34785128],[0.349527 ],[0.34782048],[0.35720176],[0.36520328],[0.37276383],[0.37766436],[0.37410199],[0.37990772],[0.38644416],[0.38045958],[0.37864619],[0.39122537]])
Wir haben mit der Implementierung fortgefahren und dabei auf die zugehörigen Artikel verwiesen. Der Implementierungscode und die Ergebnisse lauten wie folgt.
main
#Abtastfrequenz
rate = 30 # [1/s]
#Beispielzeit[s]
t = np.arange(0, 1, 1/rate)
#Signal
signal = np.ravel(features[0:30,0:1])
plt.plot(t, signal)
plt.xlim(0, 1)
plt.xlabel('time [s]', fontsize=20)
plt.title('Time series of signal', fontsize=20)
plt.show()
#print(np.ravel(signal))
# power spectrum
p = np.abs(np.fft.rfft(signal))
hammingWindow = np.hamming(30) #Summen Fenster
plt.plot(t, hammingWindow*signal)
plt.show()
p2 = np.abs(np.fft.rfft(hammingWindow*signal))
#Gibt bei gegebener Abtastrate (die Umkehrung von) die Frequenz jeder Komponente zurück
f = np.fft.rfftfreq(signal.size, d=1./rate)
print(p)
print(np.fft.rfft(hammingWindow*signal),p2)
plt.xlabel("Frequency [Hz]", fontsize=20)
plt.ylabel("Amplitude spectrum", fontsize=20)
plt.yscale("log")
plt.plot(f, p)
plt.show()
plt.yscale("log")
plt.plot(f, p2)
plt.show()
#Schnelle Fourier-Transformation
F = np.fft.fft(hammingWindow*signal)
#Berechnen Sie das Amplitudenspektrum
Amp = np.abs(F)
freq = np.linspace(0, 1.0/0.03, 30) #Frequenzachse
print(np.fft.rfft(signal))
plt.plot(freq, Amp)
plt.show()
Zunächst wurden die Daten (Merkmale) im Zeitbereich grafisch dargestellt.
Wenn Sie es betrachten, können Sie sehen, dass es keine Periodizität gibt ... Da der Zweck darin besteht, es zu implementieren, werden wir so weitermachen, wie es ist. Außerdem ist eine Form, die an ein summendes Fenster angepasst ist, das Periodizität verleiht, so.
Es sieht aus wie ein Zyklus. (Weil die Kanten ausgerichtet sind)
Das Ergebnis der Fourier-Transformation jedes von ihnen in ein Amplitudenspektrum ist wie folgt.
[10.49214916 0.35316679 0.16715576 0.10588365 0.04224876 0.08174254 0.0362962 0.03914191 0.04407553 0.07351728 0.02862219 0.05424663 0.06239112 0.03642959 0.04382539 0.01436891]
[5.44620123 2.3808305 0.0238307 0.02004583 0.03723908 0.02777476 0.00710696 0.01448964 0.00951674 0.02489049 0.01539931 0.01742193 0.01562835 0.01323487 0.01355436 0.01185119]
Die linke Achse ist ein logarithmischer Graph. Ein ähnliches Amplitudenspektrum wurde erhalten.
Wie oben beschrieben, wurde das Amplitudenspektrum durch Durchführen der Fourier-Transformation erhalten. Das Leistungsspektrum ist das Quadrat des Amplitudenspektrums. Wenn Sie also das Leistungsspektrum wünschen, können Sie das Amplitudenspektrum quadrieren.
Im Folgenden waren die Begriffe Fourier-Transformation und Numpy beim Auffinden des Amplitudenspektrums kompliziert, daher werde ich sie zusammenfassen.
np.fft.fft: Gibt das Ergebnis der Fourier-Transformation zwischen Real- und Imaginärteil zurück np.fft.rfft: Gibt nur den Realteil zurück (1/2 Array von np.fft.fft)
Daher haben abs (np.fft.fft) und abs (np.fft.rfft) die gleiche Größe, aber unterschiedliche Rücklauflängen. np.fft.rfft ist die Hälfte von np.fft.fft. Es ist nicht notwendig, da es sich um eine komplexe konjugierte Beziehung handelt.
F (w) = np.fft.fft (w): Fourierspektrum (Fourier-transformiert)
|F(w)| = np.abs(F(w)): Schwingungsspektrum(F(w)Absolutwert von)
|F(w)|^2: Leistungsspektrum[F(w)*(F(w)Konjugieren Sie die komplexe Anzahl von)], Quadrat des Amplitudenspektrums, Leistung(Leistung)Die Dimension von haben
Tatsächlich ist die Fourier-Analyse im Datenanalysetool von Excel installiert. Als ich überprüfte, ob es dasselbe wie numpy war, wurden derselbe Realteil und Imaginärteil wie np.fft.fft zurückgegeben. Es kann besser sein, wenn das Programmieren schwierig ist. Die Werte werden jedoch zwischen dem Realteil und dem Imaginärteil gemischt, und eine neue Berechnung ist erforderlich, um das Amplitudenspektrum zu erhalten. Beachten Sie auch, dass in Excel die Anzahl der Daten nur ausgeführt werden kann, wenn es sich um eine Zweierpotenz handelt.
Es kann angenommen werden, dass die Niederfrequenzkomponente einen großen Umriss in der Diagrammform bildet und die Hochfrequenzkomponente verrauscht ist. Es wurde während einer Literaturrecherche gesehen. Wenn daher nur das Spektrum der Niederfrequenzkomponente 0 Hz bis 2 Hz als Ergebnis der Fourier-Umwandlung umgekehrt Fourier-transformiert wird, Ich dachte, ich könnte ein Diagramm in der Nähe der Originaldaten zeichnen, also habe ich es implementiert. Die ersten drei Daten von dem, was zuvor rffted wurde, bleiben unverändert, und die anderen werden auf 0 gesetzt.
irfft
plt.plot(t, np.fft.irfft([1.04921492e+01+0.j,8.98589353e-02+0.34154378j,-6.04938542e-02+0.15582535j,0,0,0,0,0,0,0,0,0,0,0,0,0]))
plt.show()
Ergebnis
Es hat eine ähnliche Form im Vergleich zum Diagramm der Originaldaten. Daher kann gesagt werden, dass es reproduziert werden könnte (Eigenschaften könnten durch die Frequenzkomponente extrahiert werden).
https://ja.wikipedia.org/wiki/離散フーリエ変換 https://numpy.org/doc/stable/reference/generated/numpy.fft.fft.html https://kyotogeopython.zawawahoge.com/html/基礎編/Numpyの基礎(7)便利なライブラリ群.html https://aidiary.hatenablog.com/entry/20110716/1310824587 https://www.geidai.ac.jp/~marui/r_program/spectrum.html
Recommended Posts