2012-08-07 16 views
8

Tengo algunos conjuntos de datos de periodos de tiempo similares. Es una presentación de personas en ese día, el período es de aproximadamente un año. Los datos no se han recopilado en intervalos regulares, es bastante bastante aleatorio: de 15 a 30 entradas por año, de 5 años diferentes.Predicción de fecha anterior: datos de valor

El gráfico dibujado a partir de los datos de cada año se ve más o menos así: graph Gráfico hecho con matplotlib. Tengo los datos en el formato datetime.datetime, int.

¿Es posible predecir, de manera sensata, cómo van a ser las cosas en el futuro? Mi pensamiento original fue contar el promedio de todas las ocurrencias previas y predecir que será esto. Sin embargo, eso no tiene en cuenta los datos del año en curso (si ha sido superior al promedio todo el tiempo, la conjetura debería ser un poco mayor).

El conjunto de datos y mi conocimiento de las estadísticas es limitado, por lo que cada idea es útil.

Mi objetivo sería primero crear una solución prototipo, probar si mis datos son suficientes para lo que estoy tratando de hacer y después de la validación (potencial), probaría un enfoque más refinado.

Editar: Lamentablemente nunca tuve la oportunidad de probar las respuestas que recibí! Todavía tengo curiosidad de saber si ese tipo de información sería suficiente y lo tendré en cuenta si alguna vez tengo la oportunidad. Gracias por todas las respuestas.

+2

esta pregunta no es realmente sobre el código, más acerca de las matemáticas, ¿cómo se define la predicción en este sentido? y ¿cuál es la forma matemática en este tipo de curva/gráfico? No creo que este sea el lugar correcto para esta pregunta. –

+1

@Inbar Soy consciente de que esto no encaja perfectamente en la sección de códigos, pero es el único ángulo al que me estoy acercando. Confío en que la gente aquí tenga suficiente experiencia para darme una dirección para la solución. – schme

+0

Esta pregunta sería una mejor opción en http://stats.stackexchange.com/ –

Respuesta

4

La predicción es difícil. Es posible que desee probar polynomial extrapolation, pero el error de estimación aumentará drásticamente a medida que se aleje del área "conocida".

Otra posible solución es tratar de usar los algoritmos machine learning, pero requiere la recopilación de una gran cantidad de datos.

Extraiga funciones de sus datos (una característica es el número de entradas en un solo día, por ejemplo). Y entrena el algoritmo. (Déle una característica de datos muy lejanos, y el presente como el campo predicho, por ejemplo).

No sé acerca de python, pero en Java - hay una biblioteca de código abierto llamada weka que implementa la mayoría de las funcionalidades y el algoritmo utilizado para el aprendizaje automático.

Puede estimar la precisión de este método usando cross validation más adelante.


Dicho esto - este problema se conoce normalmente como la detección de tendencias, y es un campo caliente en la investigación en la actualidad, por lo there is no silver bullet.

+0

¿El aprendizaje automático realmente necesita una gran cantidad de datos? Quiero decir, para cosas como la regresión lineal, puede que no (solo he hecho un poco, así que básicamente estoy preguntando) – darkphoenix

+0

@darkphoenix: Por experiencia personal: cuantos más datos tenga, mejores serán los resultados que obtendrá el algoritmo. Además, para demostrar que realmente funciona, lo haces con pruebas estadísticas. Estos generalmente requieren cientos o miles de instancias clasificadas .. – amit

+2

Para python, hay scikits.learn, creo que también puedes usar naranja. Ambos dependen del numpy. – darkphoenix

12

En su caso, los datos cambian rápidamente, y usted tiene observaciones inmediatas de nuevos datos. Se puede implementar una predicción rápida usando Holt-winter suavizado exponencial.

Las ecuaciones de actualización:

enter image description here

m_t es los datos que tiene, por ejemplo, el número de personas en cada momento t. v_t es la primera derivada, es decir, la tendencia de m. alpha y beta son dos parámetros de desintegración.La variable con tilde en la parte superior indica el valor predicho. Verifique los detalles del algoritmo en la página de wikipedia.

Dado que usa python, puedo mostrarle un código de ejemplo para ayudarlo con los datos. BTW, utilizo algunos datos sintéticos como a continuación:

data_t = range(15) 
data_y = [5,6,15,20,21,22,26,42,45,60,55,58,55,50,49] 

Por encima de data_t es una secuencia de puntos de datos consecutivos comenzando en el tiempo 0; data_y es una secuencia del número observado de personas en cada presentación.

Los datos se muestran a continuación (traté de hacerlo cerca de sus datos).

enter image description here

El código para el algoritmo es sencillo.

def holt_alg(h, y_last, y_pred, T_pred, alpha, beta): 
    pred_y_new = alpha * y_last + (1-alpha) * (y_pred + T_pred * h) 
    pred_T_new = beta * (pred_y_new - y_pred)/h + (1-beta)*T_pred 
    return (pred_y_new, pred_T_new) 

def smoothing(t, y, alpha, beta): 
    # initialization using the first two observations 
    pred_y = y[1] 
    pred_T = (y[1] - y[0])/(t[1]-t[0]) 
    y_hat = [y[0], y[1]] 
    # next unit time point 
    t.append(t[-1]+1) 
    for i in range(2, len(t)): 
     h = t[i] - t[i-1] 
     pred_y, pred_T = holt_alg(h, y[i-1], pred_y, pred_T, alpha, beta) 
     y_hat.append(pred_y) 
    return y_hat 

Ok, ahora vamos a llamar a nuestro predictor y trazar el resultado predicho en contra de las observaciones:

import matplotlib.pyplot as plt 
plt.plot(data_t, data_y, 'x-') 
plt.hold(True) 

pred_y = smoothing(data_t, data_y, alpha=.8, beta=.5) 
plt.plot(data_t[:len(pred_y)], pred_y, 'rx-') 
plt.show() 

El rojo muestra el resultado de predicción en cada momento. Establecí alpha en 0.8, por lo que la observación más reciente afecta mucho a la próxima predicción. Si desea dar más peso al historial de datos, simplemente juegue con los parámetros alpha y beta. También tenga en cuenta que el punto de datos más a la derecha en la línea roja en t=15 es la última predicción, en la que aún no tenemos una observación.

BTW, this está lejos de ser una predicción perfecta. Es solo algo con lo que puedes comenzar rápidamente. Uno de los inconvenientes de este enfoque es que debe poder obtener observaciones; de lo contrario, la predicción se desactivaría cada vez más (probablemente esto sea cierto para todas las predicciones en tiempo real). Espero eso ayude.

enter image description here

Cuestiones relacionadas