DGM-离散灰色模型
DGM-离散灰色模型 的真实核心主要位于:
DGM-离散灰色模型
1. 方法概述
DGM-离散灰色模型 的真实核心主要位于:
core/dgm_calculator.py
从当前项目代码看,这个模块虽然在注释里提到过背景值与邻近均值,但真正用于拟合与预测的主方程是离散灰色模型 DGM 的闭式递推表达,而不是把连续 GM(1,1) 直接照搬过来。
项目流程大致为:
- 读取时间列与数值列;
- 对原始序列做一次 AGO 累加生成;
- 构造背景值矩阵并最小二乘估计参数 \(a,b\);
- 按离散 DGM 的显式公式计算累计序列预测值;
- 再逆累加得到原序列拟合值与未来预测值;
- 输出拟合、预测、参数、误差指标与图表。
设原始序列为
$$ x^{(0)}=\big(x^{(0)}(1),x^{(0)}(2),\ldots,x^{(0)}(n)\big) \tag{1} $$
2. AGO 与参数估计
2.1 一次累加生成
代码先构造 AGO 序列:
$$ x^{(1)}(k)=\sum_{t=1}^{k}x^{(0)}(t) \tag{2} $$
2.2 背景值
虽然最终预测主式是离散递推闭式,但参数估计阶段仍会先构造相邻均值:
$$ z^{(1)}(k)=\frac{1}{2}\Big(x^{(1)}(k-1)+x^{(1)}(k)\Big),\qquad k=2,\ldots,n \tag{3} $$
再组成回归矩阵
$$ B= \begin{bmatrix} -z^{(1)}(2) & 1\\ \vdots & \vdots\\ -z^{(1)}(n) & 1 \end{bmatrix}, \qquad Y= \begin{bmatrix} x^{(0)}(2)\\ \vdots\\ x^{(0)}(n) \end{bmatrix} \tag{4} $$
并用最小二乘得到参数 \((a,b)\)。
3. 代码里的真实预测公式
3.1 累计序列的离散闭式
当前代码真正用来生成 \(x^{(1)}\) 预测值的公式是
$$ \hat x^{(1)}(k)=\left(x^{(0)}(1)-\frac{b}{a}\right)(1-a)^k+\frac{b}{a} \tag{5} $$
这正是该模块最关键的实现口径:它不是简单写成连续指数解,而是按离散 DGM 的 \((1-a)^k\) 形式计算。
3.2 \(a\approx 0\) 时的线性回退
源码还专门做了一个工程化兜底:若 \(a\) 过小,避免除零或数值不稳定,直接改用近似线性形式
$$ \hat x^{(1)}(k)\approx x^{(0)}(1)+bk \tag{6} $$
因此这个实现比很多“只给主公式、不处理退化情形”的教材版更稳。
3.3 逆累加恢复原序列
最后再通过
$$ \hat x^{(0)}(k)=\hat x^{(1)}(k)-\hat x^{(1)}(k-1) \tag{7} $$
得到原序列的拟合值与未来预测值。
4. 输出结果与导出说明
4.1 结果字典
当前 result_dict 会保留:
raw_dataprocessed_datafitted/forecastmetrics
其中 processed_data 里会把 AGO 处理后的表单独保存,这一点对写论文复现实验很有帮助。
4.2 Excel 工作表
源码会导出:
RawDataProcessedFittedForecastParamsCharts
因此它不是单纯返回未来几期预测值,而是把“原始数据、累加数据、拟合结果、预测结果、参数结果”拆成独立工作表。
5. 实现说明与注意事项
5.1 注释和真正主公式并不完全一致
这个模块最容易误写的地方在于:代码注释提到 z1 与背景值,但真正用于生成预测值的是离散 DGM 闭式 \((1-a)^k\),这一点必须以实际实现为准。
5.2 这里的 DGM 不是简单的 GM(1,1)
虽然参数估计阶段相似,但预测阶段的表达和连续灰色微分方程解并不完全相同,因此写说明时最好明确称它为“离散灰色模型 DGM”,不要直接混写成普通 GM(1,1)。
5.3 退化情形有线性兜底
若 \(a\) 非常接近 0,代码不会继续硬套 \(\frac{b}{a}\) 结构,而是自动改用线性近似,这属于项目里很实际的数值保护逻辑。
6. 论文写作建议
论文中建议把该模型明确写成“离散灰色模型 DGM”,并把式(5)–式(7) 作为核心预测公式。结果部分通常至少应给出参数表、拟合值与预测值表、误差指标表以及拟合/预测曲线图。若模型进入了 \(a\approx 0\) 的线性回退情形,最好在正文或附录中单独说明。
7. 单篇终审补充
7.1 图题与表题对齐建议
RawData表可写为:表X DGM 原始输入数据。Processed表可写为:表X DGM AGO 处理结果。Fitted表可写为:表X DGM 拟合结果。Forecast表可写为:表X DGM 未来预测结果。Params表可写为:表X DGM 参数估计结果。Metrics表可写为:表X DGM 误差指标与模型参数摘要。Plots或Charts表可写为:表X DGM 图表索引与路径。<结果名>_series.png建议写为:图X DGM 实际值、拟合值与预测值对比图。<结果名>_residuals.png建议写为:图X DGM 残差图。
7.2 终审说明
- 当前实现真实导出链路比正文前半部分列出的
RawData / Processed / Fitted / Forecast / Params / Charts更完整,实际上还会额外写出Metrics与Plots;论文若介绍结果文件结构,应按真实导出表述。 Metrics在当前实现里不是单独的统计检验表,而是把参数和摘要信息一并落表,因此正文不要把它误写成严格独立的“模型精度检验表”。- 图表路径来自结果文件同目录下的
<stem>_series.png与<stem>_residuals.png,Plots/Charts只记录路径,不是 Excel 内嵌图。 - 若进入 \(a \approx 0\) 的线性兜底分支,论文应把它写成数值稳定性保护,而不是新的灰色模型公式。
7.3 全量强化补充
本次全量强化绑定的真实结果目录为 具体的算法3/灰色系统与模糊理论/DGM-离散灰色模型/results/DGM-离散灰色模型分析结果_20260329_120442。该目录内主工作簿为 dgm_result_20260329_120442.xlsx,实际工作表为 RawData、Processed、Fitted、Forecast、Params、Plots、Charts、Metrics。其中 Metrics 页真实记录了 a = -0.09698000164108403、b = 10.68790332669277、MAPE(%) = 4.754139303210316、RMSE = 0.8576155320655479,因此正文若需要引用具体误差指标,应优先从这一页取值,而不是凭理论公式推断。
同一目录下主图件为 dgm_result_20260329_120442_series.png 与 dgm_result_20260329_120442_residuals.png。此外,该目录还包含多份 repro 再生产物,例如 repro_dgm_20260329_120502.xlsx、repro_dgm_20260329_133432.xlsx 及其对应 *_series.png、*_residuals.png,说明当前目录既保存主结果,也保存复现后再次生成的工作簿与图件。
复现脚本为 repro_20260329_120442.py,目录内 repro_inputs/dgm_sample.xlsx 真实存在。脚本当前写法为 INPUT_FILE = 'repro_inputs/dgm_sample.xlsx'、PARAMS = {'forecast_steps': 5},并在执行时重新生成新的 repro_dgm_<时间戳>.xlsx。因此 DGM 当前已经具备“主结果工作簿 + 主图件 + repro_inputs 输入副本 + 多轮 repro 再生产物”的完整链路,正文应按这一实际目录结构写明主结果与复现结果的区分。
8. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/灰色系统与模糊理论/DGM-离散灰色模型/results/DGM-离散灰色模型分析结果_20260329_120442。 - 正文应围绕
RawData、Processed、Fitted、Forecast、Params、Plots、Charts、Metrics来写。 - 图证应对应
dgm_result_20260329_120442_series.png与dgm_result_20260329_120442_residuals.png,并把拟合和残差分开解释。 - 复现脚本应按
repro_20260329_120442.py + repro_inputs/dgm_sample.xlsx的口径说明;repro_dgm_<时间戳>.xlsx是复现再生产物。