2. 间歇需求特征分析:零值比例、需求间隔、需求规模、需求波动性
在应用 Croston 方法之前,必须对原始需求序列进行特征诊断。间歇需求并非单一模式,而是由四个核心维度共同刻画:零值比例、需求间隔、需求规模和需求波动性。这四个维度直接影响预测方法的选择与参数配置。
核心观点: 间歇需求预测的难点不在于“预测需求大小”,而在于“预测需求何时发生”。零值比例和需求间隔是区分“慢速流动”与“间歇流动”的关键指标。
2.1 四维特征定义与计算
| 特征维度 | 符号 | 定义 | 计算公式 |
|---|---|---|---|
| 零值比例 | P(0) | 历史序列中需求为零的周期占比 | P(0) = (零值周期数) / (总周期数) |
| 需求间隔 | ADI | 相邻非零需求之间的平均周期数 | ADI = (总周期数) / (非零需求次数) |
| 需求规模 | μz | 非零需求周期的平均需求量 | μz = Σ(非零需求) / (非零需求次数) |
| 需求波动性 | CVz | 非零需求规模的变异系数 | CVz = σz / μz |
实战提示: 当 P(0) > 0.5 时,序列已进入“高度间歇”区间,此时传统移动平均法会严重低估库存需求。Croston 方法正是为解决此问题而设计。
2.2 四维特征交互关系
四个特征并非独立存在,它们共同决定了需求序列的“间歇程度”。下图展示了特征之间的驱动关系与分类边界。
2.3 基于特征的分类体系
根据上述四维特征,可将间歇需求序列分为三类典型模式。不同模式对应不同的 Croston 参数配置策略。
- 慢速流动型: P(0) < 0.3,ADI < 1.32。需求发生频率较高,零值较少。Croston 平滑参数 α 可设较大值(0.2~0.3),快速响应需求变化。
- 间歇流动型: 0.3 ≤ P(0) ≤ 0.6,1.32 ≤ ADI ≤ 2.5。需求时有时无,间隔适中。α 建议设为 0.1~0.2,平衡平滑与响应。
- 稀疏流动型: P(0) > 0.6,ADI > 2.5。需求极为罕见,大部分周期为零。α 必须很小(0.05~0.1),避免过度反应。
常见误区: 不要仅凭 P(0) 判断间歇程度。例如,P(0)=0.7 但 ADI=1.1 的序列,实际需求间隔很短,只是偶尔跳空,应归为慢速流动型。必须同时参考 ADI 和 P(0)。
2.4 需求波动性对预测的影响
需求波动性 CVz 衡量非零需求规模的离散程度。当 CVz > 0.5 时,需求规模呈现高变异,此时 Croston 方法对需求规模的估计误差会显著增大。
| CVz 范围 | 波动等级 | 对 Croston 的影响 | 建议措施 |
|---|---|---|---|
| CVz < 0.3 | 低波动 | 需求规模稳定,估计误差小 | 标准 Croston 即可 |
| 0.3 ≤ CVz ≤ 0.6 | 中等波动 | 规模估计存在一定偏差 | 考虑使用 Croston-TSB 变体 |
| CVz > 0.6 | 高波动 | 规模估计误差大,预测不稳定 | 建议使用合成数据方法或 Bootstrap |
2.5 特征计算代码实现
以下 Python 代码演示如何从原始需求序列中提取四个核心特征。该函数是后续参数配置的前置步骤。
import numpy as np
import pandas as pd
def compute_intermittent_features(series):
"""
计算间歇需求序列的四维特征
参数:
series: array-like, 需求时间序列
返回:
dict: 包含 P(0), ADI, mu_z, CV_z 的字典
"""
series = np.asarray(series, dtype=float)
n = len(series)
# 1. 零值比例 P(0)
zero_count = np.sum(series == 0)
p_zero = zero_count / n
# 2. 需求间隔 ADI
non_zero_indices = np.where(series > 0)[0]
if len(non_zero_indices) < 2:
adi = np.nan # 非零需求太少,无法计算
else:
intervals = np.diff(non_zero_indices)
adi = np.mean(intervals)
# 3. 需求规模 mu_z
non_zero_values = series[series > 0]
if len(non_zero_values) == 0:
mu_z = 0.0
cv_z = np.nan
else:
mu_z = np.mean(non_zero_values)
# 4. 需求波动性 CV_z
sigma_z = np.std(non_zero_values, ddof=1)
cv_z = sigma_z / mu_z if mu_z > 0 else np.nan
return {
'P(0)': round(p_zero, 4),
'ADI': round(adi, 4) if not np.isnan(adi) else np.nan,
'mu_z': round(mu_z, 4),
'CV_z': round(cv_z, 4) if not np.isnan(cv_z) else np.nan
}
# 示例用法
demo_series = [0, 0, 5, 0, 0, 0, 3, 0, 0, 8, 0, 0, 0, 0, 2]
features = compute_intermittent_features(demo_series)
print(features)
# 输出: {'P(0)': 0.7333, 'ADI': 3.3333, 'mu_z': 4.5, 'CV_z': 0.5556}
代码说明: 当非零需求次数少于 2 时,ADI 和 CV_z 无法计算,返回 NaN。实际应用中建议至少需要 5~8 个非零需求点才能获得可靠的特征估计。
2.6 特征诊断流程
在实际项目中,建议按以下步骤完成间歇需求特征诊断:
- 数据清洗: 去除异常值,处理缺失周期,确保序列等间隔。
- 计算四维特征: 使用上述代码计算 P(0)、ADI、μz、CVz。
- 分类判定: 根据 P(0) 和 ADI 判断序列属于慢速/间歇/稀疏流动型。
- 波动评估: 根据 CVz 判断需求规模稳定性,决定是否需要变体方法。
- 参数初选: 基于分类结果,初步确定 Croston 平滑参数 α 的范围。
完成上述诊断后,即可进入第 3 章——Croston 方法的核心算法与参数初始化。