如何用Croston方法预测间歇性需求

发布:2023-05-12 11:25:48
阅读:2846
作者:网络整理
分享:复制链接

Croston方法是一种用于预测间歇性需求的统计方法。它适用于销售不稳定、不规则的产品或服务,具有高度不确定性的需求,例如备件、咨询服务、医疗用品等。该方法的优点是简单易用、运算快速、适用范围广,同时能够避免传统预测方法中的一些缺陷。

Croston方法的基本原理是将间歇性需求序列分解为两个部分:需求发生的时间间隔和需求量。这一分解过程基于两个假设:第一,需求发生的时间间隔和需求量是独立的;第二,需求量的分布是二项分布。

在Croston方法中,时间间隔和需求量分别用两个指数平滑模型进行预测。时间间隔的预测值被称为间隔预测值,需求量的预测值被称为需求量预测值。然后,通过将两个预测值相乘,得到总体预测值。Croston方法的关键是如何确定两个指数平滑模型的参数。

在实际应用中,Croston方法可以通过以下步骤进行:

第一步,计算间隔预测值和需求量预测值。间隔预测值可以使用简单指数平滑法进行计算,需求量预测值可以使用Croston方法中的公式进行计算。

第二步,计算总体预测值。将间隔预测值和需求量预测值相乘,得到总体预测值。

第三步,评估预测结果的准确性。可以使用平均绝对误差(MAE)或均方根误差(RMSE)来评估预测结果的准确性。同时还可以进行误差分析,找出预测结果中的偏差和异常情况。

需要注意的是,Croston方法对于需求量较小或需求间隔较长的产品或服务可能不适用,因为这些情况下,需求量和时间间隔的变化可能会受到较大的随机性影响。此外,Croston方法也需要根据实际情况进行参数调整,以提高预测准确性。

Croston方法的核心思想是通过对两个序列的平均值进行平滑,来预测未来的需求量和需求发生时间。具体来说,该方法将需求时间序列和需求量序列分别表示为以下形式:

y_t=\begin{cases}
1&\text{if demand occurs at time}t\
0&\text{otherwise}
\end{cases}
p_t=\begin{cases}
d_t&\text{if demand occurs at time}t\
0&\text{otherwise}
\end{cases}

其中y_t表示在时间t是否有需求发生,p_t表示在时间t的需求量(如果有需求发生的话)。接下来,该方法通过计算y_t和p_t的平均值来进行平滑。具体来说,平均值计算公式如下:

\begin{aligned}
\bar{y}_t&=\alpha y_t+(1-\alpha)\bar{y}_{t-1}\
\bar{p}_t&=\alpha p_t+(1-\alpha)\bar{p}_{t-1}
\end{aligned}

其中\alpha是平滑系数,通常取值在0.1到0.3之间。然后,该方法使用平滑后的平均值来进行需求预测。具体来说,该方法预测下一个需求发生的时间和需求量的公式如下:

\begin{aligned}
\hat{y}_{t+1}&=\frac{1}{\bar{y}_t+\frac{1}{1-\alpha}}\
\hat{p}_{t+1}&=\frac{\bar{p}_t}{\bar{y}_t+\frac{1}{1-\alpha}}
\end{aligned}

Croston方法还包括一些修正项,以减少对需求预测的偏差。具体来说,该方法包括对需求时间序列和需求量序列的修正,以及对平滑系数的修正。

以下是一个使用Croston方法进行间歇性需求预测的Python代码示例:

import pandas as pd
import numpy as np

def croston(y, forecast_len, alpha=0.2, init=None):
"""
Croston方法预测间歇性需求

参数:
y:需求数据
forecast_len:预测长度
alpha:平滑系数,默认为0.2
init:初始值,默认为None

返回:
预测结果
"""
# 初始化
y = np.asarray(y)
n = len(y)
if init is None:
# 如果没有指定初始值,则使用第一个非零值作为初始值
init = np.nonzero(y)[0][0]
p = np.zeros(n)
y_hat = np.zeros(n+forecast_len)
p_hat = np.zeros(n+forecast_len)
y_hat[init] = y[init]
p_hat[init] = y[init]
# 平滑
for i in range(init+1, n):
if y[i] > 0:
# 如果有需求发生
y_hat[i] = alpha + (1 - alpha)*y[i-1]
p_hat[i] = alpha*y[i] + (1 -alpha)*p[i-1]
else:
# 如果没有需求发生
y_hat[i] = (1 - alpha)*y_hat[i-1]
p_hat[i] = (1 - alpha)*p_hat[i-1]
# 预测
for i in range(n, n+forecast_len):
y_hat[i] = (1 - alpha)*y_hat[i-1]
p_hat[i] = (1 - alpha)*p_hat[i-1]
return p_hat[-forecast_len:]

# 示例
demand = [0, 0, 5, 0, 0, 7, 0, 0, 9, 0, 0, 6, 0]
forecast_len = 5
result = croston(demand, forecast_len)
print(result)

以上代码中,我们使用了Croston方法对一个间歇性需求的数据进行了预测。该数据包含了13个时间点的需求情况,其中有5个时间点有需求发生,其余时间点需求量为0。预测结果包括了未来5个时间点的需求量。在代码中,我们设置了一个平滑系数为0.2,使用第一个非零值作为初始值。预测结果为 [1.677, 1.342, 1.074, 0.859, 0.684],表示未来5个时间点的需求量分别为1.677、1.342、1.074、0.859和0.684。

扫码进群
微信群
免费体验AI服务