从先前的日期:数值数据中预测

8
我有几组来自类似时间段的数据集。这是关于当天人数的演示,时间段大约为一年。数据不是在固定时间间隔内收集的,而是相当随机的:每年15-30个条目,来自5个不同的年份。
从每年的数据绘制的图表大致如下所示: graph 使用matplotlib生成的图表。 我用datetime.datetime, int格式保存了这些数据。
有没有可能以任何明智的方式预测未来的情况?我的最初想法是计算所有先前发生事件的平均值,并预测它将是这样。然而,这并没有考虑到当前年份的任何数据(如果一直比平均水平高,猜测可能会稍微高一些)。
由于数据集和我对统计学的知识有限,因此每一个见解都很有帮助。
我的目标是首先创建一个原型解决方案,尝试确定我的数据是否足够完成我想做的事情,在(可能的)验证之后,我将尝试更精细的方法。
编辑:不幸的是,我从未有机会尝试过我收到的答案!不过,如果我有机会,我仍然很好奇那种数据是否足够,并会记在心中。感谢所有的答案。

2
这个问题并不是关于代码的,更多地涉及到数学。在这种情况下,你如何定义预测?以及在这种类型的曲线/图形上,有什么数学方法?我认为这不是提问的正确场所。 - Inbar Rose
1
@Inbar 我知道这不完全符合代码部分的要求,但这是我唯一的思路。我相信这里的人有足够的专业知识来为我提供解决方案的方向。 - schme
这个问题更适合在http://stats.stackexchange.com/上提问。 - David Robinson
2个回答

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时,红线上的最右侧数据点是最后一次预测,在那时我们还没有观察到数据。
顺便说一下,这个远非完美的预测。它只是让您快速开始的东西。这种方法的缺点之一是您必须能够获得观察结果,否则预测误差会越来越大(可能对所有实时预测都是如此)。希望有所帮助。 enter image description here

5
预测是困难的。您可能想尝试多项式外推 - 但随着您越来越远离“已知”区域,估计误差将急剧增加
另一个可能的解决方案是尝试使用机器学习算法,但这需要您收集大量数据。
从数据中提取特征(例如一天内的条目数),并训练算法(例如,将过去的数据作为特征,将现在的数据作为预测字段)。
我不知道Python,但在Java中 - 有一个名为weka的开源库,实现了大多数用于机器学习的功能和算法。
稍后,您可以使用交叉验证来估计此方法的准确性。

说到这个问题,通常被称为趋势检测,是当前研究的热门领域,因此没有银弹


机器学习真的需要大量数据吗?我的意思是,对于诸如线性回归之类的东西,可能并不需要(我只做过一点点,所以基本上是在问)。 - darkphoenix
@darkphoenix:从个人经验来看——拥有更多的数据,算法得出的结果会更好。同时,要证明它确实有效——需要进行统计测试。这通常需要数百或数千个分类实例。 - amit
2
对于Python,有scikits.learn,我相信你也可以使用Orange。两者都依赖于NumPy。 - darkphoenix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接