web-dev-qa-db-ja.com

時系列予測にフーリエ解析を使用する

季節的な、または毎日のパターンがあることがわかっているデータの場合、予測に使用するフーリエ解析を使用します。時系列データでfftを実行した後、係数を取得します。これらの係数を予測に使用するにはどうすればよいですか?

FFTは、受信するすべてのデータが1つの期間を構成すると想定しているので、ifftを使用してデータを単純に再生成する場合、関数の継続も再生成するため、これらの値を将来の値に使用できますか?

簡単に言えば、t = 0,1,2、.. 10でfftを実行し、coefでifftを使用すると、t = 11,12、.. 20で再生成された時系列を使用できますか?

33
BBDynSys

外挿およびノイズ除去の組み合わせが必要なようです。

観測されたデータを複数の期間にわたって繰り返したいと言います。それでは、観測データを繰り返してください。フーリエ解析の必要はありません。

しかし、「パターン」も見つけたいと思うでしょう。私はそれが観測されたデータの支配的な周波数成分を見つけることを意味すると思います。はい、フーリエ変換を行い、最大の係数を保存し、残りを削除します。

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

定期的な繰り返しについて:z = [x, x]、つまり、信号の2つの周期x。その後、Z[2k] = X[k]は{0、1、...、N-1}のすべてのkに、それ以外の場合はゼロになります。

Z = scipy.zeros(2*len(X))
Z[::2] = X
23
Steve Tjoa

私はこの質問があなたにとってもう実際ではないかもしれないことを知っていますが、答えを探している他の人のために、Python https:/ /Gist.github.com/tartakynov/83f3cd8f44208a1856ce

スクリプトを実行する前に、すべての依存関係(numpy、matplotlib)がインストールされていることを確認してください。試してみてください。 enter image description here 追伸ローカルに静止したウェーブレットは、フーリエ外挿よりも優れている場合があります。 LSWは時系列の予測によく使用されます。フーリエ外挿の主な欠点は、期間Nでシリーズを繰り返すだけで、Nは時系列の長さです。

37
tartakynov

時系列データに対してFFTを実行すると、それが周波数領域に変換されます。係数は、それぞれが異なる周波数を持つ、シリーズの項(サインとコサインまたは複素指数)を乗算します。

外挿は常に危険なことですが、試してみてください。これを行うときに、過去の情報を使用して未来を予測しています。「今日を見て明日の天気を予測します」。リスクに注意してください。

"Black Swan" を読むことをお勧めします。

7
duffymo

@tartakynovが投稿したライブラリを使用できます。また、予測で正確に同じ時系列を繰り返さない(オーバーフィット)には、n_paramという関数に新しいパラメーターを追加し、下限h周波数の振幅。

def fourierExtrapolation(x, n_predict,n_param):

通常、信号には、他の周波数よりも大幅に高い振幅を持つ周波数がいくつかあるため、この周波数を選択すると、信号の周期的な性質を分離できます。

特定の番号n_paramで決定されるこの2行を追加できます

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)) ]

これを追加するだけで、ニースでスムーズに予測できます

fFtに関する別の役立つ記事: Rでの予測FFt

1
Pablo