GM(2,1)-灰色预测
GM(2,1)-灰色预测 的真实核心主要位于:
GM(2,1)-灰色预测
1. 方法概述
GM(2,1)-灰色预测 的真实核心主要位于:
core/gm21_calculator.py
从当前代码实现看,这个模块最重要的特点是:它不是经典连续型 GM(2,1) 微分方程解法,而是二阶离散递推模型。因此写论文时不能直接照搬连续灰色微分方程的标准推导,而应以项目代码实际实现为准。
设原始序列为
$$ x^{(0)}=\big(x^{(0)}(1),x^{(0)}(2),\ldots,x^{(0)}(n)\big) \tag{1} $$
2. 二阶离散递推模型
当前源码中真正使用的模型是
$$ x^{(0)}(k)=-a_1x^{(0)}(k-1)-a_2x^{(0)}(k-2)+b, \qquad k\ge 3 \tag{2} $$
其中:
- \(a_1,a_2\) 为递推系数;
- \(b\) 为常数项。
这说明它更接近一个“二阶离散灰色递推”模型,而不是连续二阶白化微分方程。
3. 参数估计
3.1 最小二乘矩阵
代码把样本构造为
$$ B= \begin{bmatrix} x^{(0)}(2) & x^{(0)}(1) & 1\\ x^{(0)}(3) & x^{(0)}(2) & 1\\ \vdots & \vdots & \vdots\\ x^{(0)}(n-1) & x^{(0)}(n-2) & 1 \end{bmatrix} \tag{3} $$
并令
$$ Y= \begin{bmatrix} -x^{(0)}(3)\\ -x^{(0)}(4)\\ \vdots\\ -x^{(0)}(n) \end{bmatrix} \tag{4} $$
再通过最小二乘求解
$$ (a_1,a_2,b)^\top=(B^\top B)^{-1}B^\top Y \tag{5} $$
4. 拟合与预测
4.1 拟合
参数估计完成后,代码按同一递推式重建拟合序列:
$$ \hat x^{(0)}(k)=-a_1\hat x^{(0)}(k-1)-a_2\hat x^{(0)}(k-2)+b \tag{6} $$
并保留前两期原值作为递推初始条件。
4.2 未来预测
未来 \(H\) 期预测仍按同一递推式继续向前推:
$$ \hat x^{(0)}(n+h)=-a_1\hat x^{(0)}(n+h-1)-a_2\hat x^{(0)}(n+h-2)+b, \qquad h=1,\ldots,H \tag{7} $$
5. 误差指标
5.1 残差与相对误差
代码输出
$$ e(k)=x^{(0)}(k)-\hat x^{(0)}(k) \tag{8} $$
$$ \delta(k)=\frac{e(k)}{x^{(0)}(k)} \tag{9} $$
5.2 MAPE 与 RMSE
同时计算
$$ \mathrm{MAPE}=\frac{100\%}{n}\sum_{k=1}^{n}\left|\frac{e(k)}{x^{(0)}(k)}\right| \tag{10} $$
$$ \mathrm{RMSE}=\sqrt{\frac{1}{n}\sum_{k=1}^{n}e(k)^2} \tag{11} $$
这两个指标会和参数 \(a_1,a_2,b\) 一起写入 Params 表。
6. 输出结果与论文应用
6.1 Excel 工作表
当前项目导出:
RawDataFittedForecastParamsChartsPlots
6.2 论文中应如何表述
这套实现更准确的描述应为:
- 采用二阶离散灰色递推模型建立序列预测关系;
- 参数由最小二乘法估计;
- 利用递推式完成样本内拟合与样本外预测;
- 以 MAPE 和 RMSE 评价拟合误差。
7. 实现说明与注意事项
7.1 不要把它写成经典连续 GM(2,1)
这是当前模块最容易写错的地方。代码实现明确是
$$ x_k=-a_1x_{k-1}-a_2x_{k-2}+b \tag{12} $$
因此论文里若直接写成连续二阶灰色微分方程,会和软件实际实现不一致。
7.2 样本量要求比较低,但至少需要 3 个点
因为从第 3 个点起才有足够的滞后项参与回归,所以代码在样本数小于 3 时直接拒绝建模。
8. 论文写作建议
论文中建议把本模块称为“二阶离散灰色递推模型”,不要直接写成经典连续 GM(2,1)。结果部分可重点展示参数 \(a_1,a_2,b\)、MAPE、RMSE 以及拟合/预测曲线。若需要和 GM(1,1) 或 NDGM 做比较,可以把误差指标并列表放在同一张表中。
9. 单篇终审补充
9.1 图题与表题对齐建议
这篇文档在论文终稿中建议直接按当前程序真实导出命名写表题,而不要再泛写成“预测结果表”“误差分析表”。当前实现实际输出的工作表为:
RawDataFittedForecastParamsChartsPlots
其中主结果表应以 Fitted 和 Forecast 为主。Fitted 表中已经包含实际值、拟合值、残差与相对误差,Forecast 表中是样本外预测结果;Params 中同时给出参数与误差统计。图文件名也不是通用的图册目录,而是直接随结果文件生成同名 PNG:
<结果文件名>_series.png<结果文件名>_residuals.png
因此论文中建议把图题写成“GM(2,1) 拟合与预测曲线图”“GM(2,1) 残差图”,并在正文第一次引用时说明图像文件来自结果目录下与工作簿同名的 *_series.png 和 *_residuals.png。
9.2 终审说明
这一实现并不是“连续 GM(2,1) 微分方程求解器”,而是一个离散递推版本的二阶灰色预测模块。其 Excel 导出比正文前面列出的内容更克制,没有单独把回归矩阵、诊断页和论文模板页全部铺开,而是只保留 RawData / Fitted / Forecast / Params / Charts / Plots 六类核心输出。因此论文写作时不要虚写“代码导出了完整中间矩阵链路”,因为当前程序实际没有这样导出。
另外,Charts 与 Plots 两个工作表本质上是图路径索引,不是 Excel 内嵌图。程序在 utils/result_manager.py 中同步生成 repro_*.py,并约定复现实跑时重新输出 *_series.png、*_residuals.png 以及新的 xlsx。论文中若描述“软件结果可复现”,应写成“结果目录包含工作簿、图路径索引与 repro 脚本,脚本再次执行后可重建同构输出”,这才和真实实现一致。
9.3 全量强化补充
本篇终审补充绑定的真实算法目录为 具体的算法3/灰色系统与模糊理论/GM(2,1)-灰色预测,本次采用的代表性结果目录为 具体的算法3/灰色系统与模糊理论/GM(2,1)-灰色预测/results/GM(2,1)-灰色预测分析结果_20260329_171543。
该目录当前同时存在两份工作簿:
gm21_result_20260329_171543.xlsxgm21_repro_20260329_171544.xlsx
两者实测工作表一致,均包含:
RawDataFittedForecastParamsChartsPlots
因此这一轮磁盘证据应明确拆成“主结果 + repro 再生产物”。gm21_result_20260329_171543.xlsx 可作为主结果引用,gm21_repro_20260329_171544.xlsx 则是复现实跑后生成的近邻时间戳结果,不能把两者混写成同一文件。
当前目录中的真实图文件也分成主结果与 repro 两套:
gm21_result_20260329_171543_series.pnggm21_result_20260329_171543_residuals.pnggm21_repro_20260329_171544_series.pnggm21_repro_20260329_171544_residuals.png
这说明本轮真实图证据只有“序列拟合与预测图”和“残差图”两类,不存在更多诊断图。论文中应围绕这两类图组织说明,不要虚构额外趋势分解或参数灵敏度图。
复现实物方面,该目录实际包含:
具体的算法3/灰色系统与模糊理论/GM(2,1)-灰色预测/results/GM(2,1)-灰色预测分析结果_20260329_171543/repro_20260329_171543.py具体的算法3/灰色系统与模糊理论/GM(2,1)-灰色预测/results/GM(2,1)-灰色预测分析结果_20260329_171543/repro_inputs/
这一轮可确认结果目录已保留 repro_inputs 输入副本目录,并由 repro_20260329_171543.py 驱动再生产物输出。因此这一篇可以按“结果目录内输入副本 + repro 脚本 + 同构 xlsx/png 再生产物”的真实结构描述可复现性。
10. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/灰色系统与模糊理论/GM(2,1)-灰色预测/results/GM(2,1)-灰色预测分析结果_20260329_171543。 - 正文应围绕
RawData、Fitted、Forecast、Params、Charts、Plots来写。 - 图证应对应
gm21_result_20260329_171543_series.png与gm21_result_20260329_171543_residuals.png,并把主结果与 repro 再生产物分开说明。 - 复现脚本应按
repro_20260329_171543.py + repro_inputs/的口径说明,结果目录内的输入副本是复现链的一部分。