就您而言,数据变化很快,您可以立即观察到新数据。可以使用Holt-winter指数平滑法进行快速预测。
更新方程:
m_t
是您拥有的数据,例如,每次的人数t
。v_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,因此最近的观察确实对下一个预测有很大影响。如果你想给历史数据更多的权重,只需使用参数alpha
和beta
。还要注意,红线最右边的数据点t=15
是最后一个预测,我们还没有观察到。
顺便说一句,这远非完美的预测。这只是您可以快速开始的事情。这种方法的一个缺点是您必须能够获得观察结果,否则预测会越来越偏离(可能对于所有实时预测都是如此)。希望能帮助到你。