Использование анализа Фурье для прогнозирования временных рядов - PullRequest
31 голосов
/ 18 декабря 2010

Для данных, которые, как известно, имеют сезонные или дневные закономерности, я хотел бы использовать анализ Фурье для прогнозирования.После запуска FFT на данных временных рядов, я получаю коэффициенты.Как я могу использовать эти коэффициенты для прогнозирования?

Я полагаю, что БПФ предполагает, что все полученные данные составляют один период, а затем, если я просто регенерирую данные с использованием ifft, я также регенерирую продолжение своей функции, поэтому могу ли я использовать эти значения для будущих значений?

Проще говоря: я запускаю fft для t = 0,1,2, .. 10, затем использую ifft для coef, могу ли я использовать регенерированные временные ряды для t = 11,12, .. 20?

Ответы [ 4 ]

36 голосов
/ 27 января 2015

Я знаю, что этот вопрос может быть не актуален для вас, но для тех, кто ищет ответы, я написал очень простой пример экстраполяции Фурье в Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce

Прежде чем вы запуститескрипт убедитесь, что у вас установлены все зависимости (numpy, matplotlib).Не стесняйтесь экспериментировать с этим.enter image description here PS Локально стационарный вейвлет может быть лучше, чем экстраполяция Фурье.LSW обычно используется для прогнозирования временных рядов.Основным недостатком экстраполяции Фурье является то, что он просто повторяет ваш ряд с периодом N, где N - длина вашего временного ряда.

23 голосов
/ 18 декабря 2010

Звучит так, как будто вам нужна комбинация экстраполяции и с шумоподавлением.

Вы говорите, что хотите повторить наблюдаемые данные в течение нескольких периодов.Ну, тогда просто повторите наблюдаемые данные.Нет необходимости в анализе Фурье.

Но вы также хотите найти «шаблоны».Я предполагаю, что это означает нахождение доминирующих частотных компонентов в наблюдаемых данных.Тогда да, возьмите преобразование Фурье, сохраните самые большие коэффициенты и исключите остальные.

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

Что касается периодического повторения: пусть z = [x, x], то есть два периода сигнала x.Тогда Z[2k] = X[k] для всех k в {0, 1, ..., N-1} и нулях в противном случае.

Z = scipy.zeros(2*len(X))
Z[::2] = X
7 голосов
/ 18 декабря 2010

Когда вы запускаете БПФ для данных временных рядов, вы преобразуете их в частотную область.Коэффициенты умножают члены ряда (синусы и косинусы или сложные экспоненты), каждый с разной частотой.

Экстраполяция всегда опасна, но вы можете попробовать ее.Вы используете прошлую информацию, чтобы предсказать будущее, когда делаете это: «Предскажите погоду завтрашнего дня, взглянув на сегодня».Просто знайте о рисках.

Я бы рекомендовал прочитать "Черный лебедь" .

1 голос
/ 09 сентября 2015

вы можете использовать библиотеку, опубликованную @tartakynov, и, чтобы не повторять точно такой же временной ряд в прогнозе (переоснащение), вы можете добавить новый параметр в функцию с именем n_param и установить нижнюю границу hдля амплитуд частот.

def fourierExtrapolation(x, n_predict,n_param):

обычно вы обнаружите, что в сигнале есть некоторые частоты, которые имеют значительно более высокую амплитуду, чем другие, поэтому, если вы выберете эти частоты, вы сможетеВыделив периодическую природу сигнала

, вы можете добавить эти две строки, которые определяются определенным числом n_param

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: прогноз FFt в R

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...