灰度预测(gm(1,1))适合小样本(n=4~10)、正数、等距、单调且近似指数规律的时间序列;不适用于剧烈震荡、含异常值、非正数、非等距或明显线性趋势的数据。

灰度预测适合什么数据?先看能不能用
灰度预测(GM(1,1))本质是拟合指数增长/衰减曲线,只依赖时间序列的单调性与近似指数规律。小样本(n=4~10)反而是它的优势场景,但前提是数据不能剧烈震荡或含大量异常值。如果numpy.diff(data)符号频繁翻转、或np.std(data)/np.mean(data) > 0.3,强行套用会严重失真。
- 数据必须是正数序列,负值或零会导致累加生成失败
- 时间间隔需严格等距,不支持缺失时间点插值后再建模
- 若原始序列存在明显线性趋势(比如连续5期差值基本恒定),GM(1,1)不如直接用
sklearn.linear_model.LinearRegression
手动实现GM(1,1)时三个关键步骤不能跳
核心是累加生成(AGO)、紧邻均值生成(IAGO)、构建白化方程求解参数。跳过任一环节都会导致预测值发散。
- 累加生成:
ago = np.cumsum(data),不是简单求和,必须逐项累积 - 紧邻均值:
iago = [(ago[i] + ago[i-1]) / 2 for i in range(1, len(ago))],注意长度比ago少1 - 白化方程系数矩阵构造:左侧是
np.column_stack([-iago, np.ones(len(iago))]),右侧是data[1:](原始序列去掉首项),不是ago[1:]
示例片段:
B = np.column_stack([-iago, np.ones(len(iago))]) Y = data[1:] a_u = np.linalg.lstsq(B, Y, rcond=None)[0] # a为发展系数,u为内生变量
预测结果反向还原容易漏掉这步
模型输出的是累加序列的预测值,必须做累减还原(IAGO逆运算)才能得到原始量级的预测:
- 第一期预测值直接取
pred_ago[0] - 后续各期:用
pred_data[i] = pred_ago[i] - pred_ago[i-1] - 如果忘记这步,你会看到预测值越来越大,且数值远超原始量纲(比如原始数据在10~20之间,预测出来变成几百)
常见错误:把pred_ago直接当预测结果提交,尤其在用scipy.integrate.odeint解微分方程时,输出默认是AGO域结果。
小样本下参数敏感性比想象中高
GM(1,1)对首项和末项极其敏感。当n=5时,仅调整data[-1]±5%,可能导致第3期预测偏差扩大30%以上。
- 不建议对原始数据做归一化(如除以max),会破坏累加关系的物理意义
- 若想提升鲁棒性,可尝试残差修正:用原始序列减去初步预测值,对残差序列再建一个GM(1,1),叠加修正项
- Python里没有现成的
grey.predict()黑盒函数,所有封装库(如gm包)底层仍是上述三步,调参空间极小
实际用的时候,先跑一遍原始序列,再人工微调末位1~2个点试算对比,比盲目增加复杂度更有效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











