从之前的日期预测:价值数据

时间:2012-08-07 11:32:54

标签: python algorithm statistics prediction

我有类似时间段的一些数据集。这是当天人们的介绍,大约一年。数据没有定期收集,相当随机:每年15到30个条目,从5年不同。

从每年的数据中得出的图表大致如下: graph 用matplotlib制作的图表。 我有datetime.datetime, int格式的数据。

是否有可能以任何合理的方式预测未来事情将如何发展?我最初的想法是计算之前所有事件的平均值并预测它将是这个。但是,这并没有考虑当年的任何数据(如果它一直高于平均水平,那么猜测可能会略高一些)。

数据集和我对统计数据的了解有限,因此每一个见解都是有帮助的。

我的目标是首先创建一个原型解决方案,试验我的数据是否足以满足我的目标,在(潜在的)验证之后,我会尝试更精确的方法。

编辑:不幸的是我从来没有机会尝试我收到的答案!我仍然很好奇,如果那种数据足够的话,如果我有机会的话会记住这一点。谢谢你的所有答案。

2 个答案:

答案 0 :(得分:12)

在您的情况下,数据正在快速变化,您可以立即观察新数据。可以使用Holt-winter指数平滑来实现快速预测。

更新公式:

enter image description here

m_t是您拥有的数据,例如每次t的人数。 v_t是第一个导数,即m的趋势。 alphabeta是两个衰减参数。顶部带有tilde的变量表示预测值。在维基百科页面上查看算法的详细信息。

由于您使用python,我可以向您展示一些示例代码来帮助您处理数据。顺便说一句,我使用了一些合成数据如下:

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

高于data_t是从时间0开始的一系列连续数据点; data_y是每次演示时观察到的人数序列。

数据如下所示(我试图让它接近您的数据)。

enter image description here

算法的代码很简单。

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 

好的,现在让我们调用我们的预测器并根据观察结果绘制预测结果:

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

红色显示每个时间点的预测结果。我将alpha设置为0.8,这样最近的观察确实会影响下一次预测。如果您想为历史数据提供更多权重,请使用参数alphabeta。另请注意,t=15处红线上最右边的数据点是最后一个预测,我们还没有观察到。

BTW,this远非完美的预测。这只是你可以快速入手的事情。这种方法的缺点之一是你必须能够获得观察,否则预测会越来越多(可能对所有实时预测都是如此)。希望能帮助到你。

enter image description here

答案 1 :(得分:5)

预测很难。您可能想尝试polynomial extrapolation - 但是当您离“已知”区域越来越远时,估计错误会急剧增加。

另一种可能的解决方案是尝试使用machine learning算法,但它需要您收集大量数据。

从数据中提取要素(例如,功能是一天中的条目数)。并训练算法。 (例如,将其作为预测字段的远期数据提供给它。)

我不了解python,但是在java中 - 有一个名为weka的开源库,它实现了用于机器学习的大多数功能和算法。

您可以稍后估算此方法使用cross validation的准确程度。


话虽如此 - 这个问题通常被称为趋势检测,目前是研究的热门领域,所以there is no silver bullet