2010-12-18 37 views
22

Para datos que se sabe que tienen patrones estacionales o diarios, me gustaría usar el análisis de Fourier para hacer predicciones. Después de ejecutar fft en series de tiempo, obtengo coeficientes. ¿Cómo puedo usar estos coeficientes para la predicción?Uso del análisis de Fourier para la predicción de series de tiempo

Creo que FFT asume que todos los datos que recibe constituyen un período, luego, si simplemente regenero datos usando ifft, también estoy regenerando la continuación de mi función, entonces ¿puedo usar estos valores para valores futuros?

En pocas palabras: corro fft para t = 0,1,2, .. 10 y luego usando ifft en coef, ¿puedo usar series de tiempo regeneradas para t = 11,12, .. 20?

Respuesta

18

Parece que desea una combinación de extrapolación y eliminación de ruido.

Dice que desea repetir los datos observados durante períodos múltiples. Bueno, entonces solo repite los datos observados. No es necesario el análisis de Fourier.

Pero también querrá encontrar "patrones". Supongo que eso significa encontrar los componentes de frecuencia dominantes en los datos observados. Entonces sí, tome la transformada de Fourier, preserve los coeficientes más grandes y elimine el resto.

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

En cuanto a la repetición periódica: Let z = [x, x], es decir, dos periodos de la señal x. Luego Z[2k] = X[k] para todos k en {0, 1, ..., N-1}, y ceros en caso contrario.

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

Así que estás repitiendo los coeficientes más importantes en Z (dos veces en el ejemplo anterior), y si usas ifft para regenerar mis series de tiempo, esta nueva serie será más larga que la original y por definición tendrá predicciones en ella. – user423805

+1

Supongo que por eliminación de ruido te refieres a elegir los coeficientes más importantes. – user423805

+1

'Z = [X [0], 0, X [1], 0, X [2], 0, ..., X [N-1], 0]'. Si eso es lo que quieres decir, entonces sí. Y sí, preservar los coeficientes más importantes tendrá un efecto de "suavizado" o "difuminado" o "eliminación de ruido" en la señal. –

6

Cuando ejecuta una FFT en datos de series temporales, la transforma en el dominio de la frecuencia. Los coeficientes multiplican los términos en la serie (senos y cosenos o exponenciales complejos), cada uno con una frecuencia diferente.

La extrapolación es siempre algo peligroso, pero le invitamos a probarlo. Está utilizando información del pasado para predecir el futuro cuando hace esto: "Predecir el clima del mañana mirando hoy". Solo se consciente de los riesgos.

Recomiendo leer "Black Swan".

+2

He leído Black Swan. No estoy hablando de precios de acciones necesariamente. Digamos ... recolección de datos, que es muy estacional, o los famosos datos de manchas solares. Entonces estoy hablando de algo predecible. – user423805

+0

Permítanme aclarar un poco más: Digamos que identifiqué una frecuencia que es bastante dominante en los datos. ¿Cómo relaciono esto con los puntos en los datos del dominio del tiempo, por lo que puedo saltar hacia adelante y en el futuro y hacer predicciones? – user423805

+2

+1. La extrapolación es peligrosa, sí. Por lo general, las personas hacen modelos y suponen que el futuro se comportará como dice la modelo. Los modelos dependen de los parámetros, que se estiman con observaciones presentes o pasadas. Entonces, no "predice" nada, solo se ajusta a un modelo. –

18

Soy consciente de que esta pregunta puede ser no real para usted más, pero para otros que están en busca de respuestas que escribió un ejemplo muy simple de la extrapolación de Fourier en Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce

Antes de ejecutar el script asegúrese de tener todas las dependencias instaladas (numpy, matplotlib). Siéntase libre de experimentar con eso. enter image description here P.S. La Wavelet estacionaria local puede ser mejor que la extrapolación de Fourier. LSW se usa comúnmente para predecir series de tiempo. La principal desventaja de la extrapolación de fourier es que simplemente repite su serie con el período N, donde N es la longitud de su serie temporal.

+0

Entonces, lo siento, solo asegurándome de que lo entiendo. x (línea azul) son los datos observados? extrapolación (línea roja) es la predicción? –

+0

@jeffery_the_wind Sí, la línea roja es la predicción y el azul se observa datos. Obviamente hay sobreajuste en este ejemplo, para evitar que pueda ajustar la cantidad de armónicos en el modelo. – tartakynov

+2

Este buen ejemplo visual demuestra la debilidad señalada en las otras publicaciones: el dominio de la frecuencia, por su naturaleza, produce ciclos fijos en el dominio del tiempo. La extrapolación de línea roja de arriba es simpy una copia del segmento inicial de la línea azul (observada), aunque ligeramente desensanchada. Por lo tanto, para hacer cualquier predicción significativa a corto plazo sobre unidades horizon * h * time, donde * h * «el número de observaciones históricas, solo los coeficientes de frecuencia ** significativos ** más significativos deben utilizarse en la extrapolación. Un umbral de frecuencia "alto" puede definirse arbitrariamente en relación con * h *. –

0

puede utilizar la biblioteca que @tartakynov publicada y, para no repetir exactamente la misma serie de tiempo en la predicción (overfitting), se puede añadir un nuevo parámetro a la función llamada n_param y fijar un límite inferior h de las amplitudes de las frecuencias.

def fourierExtrapolation(x, n_predict,n_param): 

por lo general se dará cuenta de que, en una señal, hay algunas frecuencias que tienen amplitud significativamente mayor que otros, por lo que, si se selecciona esta frecuencias usted será capaz de aislar la naturaleza periódica de la señal

puede agregar estas dos líneas que están determinadas por un cierto número 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)) ] 

sólo añadir esta manera usted será capaz de pronosticar agradable y suave

otro artículo útil sobre FFt: forecast FFt in R

+0

Hola, el enlace que ha proporcionado está roto. ¿Puedes publicar de nuevo si es posible o si tienes? Gracias. – dhinar

+1

@DhivyaNarayanasamy corregido;) –

Cuestiones relacionadas