8

我有一些类似时期的数据集。是那天人的介绍,时间大约一年。数据不是定期收集的,而是相当随机的:每年有 15-30 个条目,来自 5 个不同的年份。

从每年的数据中绘制的图表大致如下所示: 图形 使用 matplotlib 制作的图表。我有datetime.datetime, int格式的数据。

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

数据集和我的统计知识是有限的,所以每一个见解都是有帮助的。

我的目标是首先创建一个原型解决方案,以测试我的数据是否足以满足我正在尝试做的事情,并且在(潜在的)验证之后,我会尝试一种更精致的方法。

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

4

2 回答 2

12

就您而言,数据变化很快,您可以立即观察到新数据。可以使用Holt-winter指数平滑法进行快速预测。

更新方程:

在此处输入图像描述

m_t是您拥有的数据,例如,每次的人数tv_t是一阶导数,即 的趋势m。是两个衰减参数alpha。顶部beta的变量表示预测值。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是在每次演示中观察到的人数序列。

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

在此处输入图像描述

该算法的代码很简单。

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是最后一个预测,我们还没有观察到。

顺便说一句,远非完美的预测。这只是您可以快速开始的事情。这种方法的一个缺点是您必须能够获得观察结果,否则预测会越来越偏离(可能对于所有实时预测都是如此)。希望能帮助到你。

在此处输入图像描述

于 2012-11-16T03:23:32.300 回答
5

预测很难。您可能想尝试多项式外推- 但随着您远离“已知”区域,估计错误将急剧增加

另一种可能的解决方案是尝试使用机器学习算法,但这需要您收集大量数据。

从您的数据中提取特征(例如,特征是一天内的条目数)。并训练算法。(例如,给它一个遥远过去的数据一个特征,并将现在作为预测字段)。

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

您可以稍后估计此方法使用交叉验证的准确性。


话虽如此 - 这个问题通常被称为趋势检测,并且是当前研究的热门领域,因此没有灵丹妙药

于 2012-08-07T11:39:58.950 回答