尧图精选

基于PGM(1,1)与贝叶斯正则化的全要素生产率预测方法

🕒 发布时间:2026/10/2 1:22:27 📁 来源:尧图网络
简介一份聚焦经济增长质量与效率分析的学术论文文档面向经济学研究者、数据建模人员以及机器学习方向的学习者适合用于理解全要素生产率TFP预测的前沿建模思路。论文针对索洛残差法、隐性变量法等传统测算方式偏于线性假设、难以刻画经济系统非线性与不确定性等问题将灰色系统理论中的PGM(1,1)模型与贝叶斯正则化神经网络进行组合通过引入先验概率调节网络权重以抑制过拟合并利用中国全要素生产率数据完成实证验证证明了该组合模型在预测稳定性与泛化能力上的优势。文档仅含1个PDF文件大小约260KB正文内容涵盖模型构建原理、贝叶斯正则化算法细节、实证结果对比和结论可直接作为经济预测建模的参考资料也可作为灰色系统与神经网络融合建模的案例文本。目前已有106人学习浏览适合需要借助数据建模手段分析TFP演变规律、或希望将组合预测方法用于科研与项目实践的研究型读者。1. 全要素生产率预测为什么是灰色神经网络的场子把全要素生产率TFP从「测算」转向「预测」是很多经济分析场景里绕不开的一步。这篇论文的核心不是又造了一种测算方法而是把 PGM(1,1) 灰色模型和贝叶斯正则化神经网络叠在一起做成一个组合预测流程用 2001—2008 年的中国 TFP 历史数据去推 2009、2010 两年的值相对误差分别落在 1.78% 和 0.37%。这个误差水平在宏观经济序列里相当能打也说明灰色神经网络处理小样本、非线性时序数据时确实有一套。适合谁看做经济指标预测、区域增长分析或者手头只有十几二十个历史点却要做外推预测的从业者——这类场景正是线性回归和传统 BP 都容易翻车的地方。2. PGM(1,1) 建模全流程累加生成、背景值与灰参数求解2.1 为什么先用灰色模型而不是直接把数据丢给神经网络TFP 序列的典型问题是样本少、噪声大、背后影响因素复杂。直接拿原始观测值训练神经网络网络很容易被随机波动带偏学到的是噪声而不是趋势。灰色系统理论解决这个问题的思路很直接先对原始序列做一阶累加生成把随机性压下去。累加生成的核心逻辑是原始序列 x^(0)(k) 可能忽高忽低但累加序列 x^(1)(k) Σx^(0)(i) 是单调递增的形状接近指数曲线。指数曲线恰好是灰色微分方程的解的形式所以累加后的序列更容易用一阶线性微分方程去拟合。论文里强调 PGM(1,1) 建模过程比传统 GM(1,1) 更科学、不存在固有偏差指的就是它在求解背景值和灰参数时做了修正不是照搬标准灰色模型的固定流程。这个预处理步骤的价值在于神经网络不需要直接面对高噪声的原始数据而是学习「灰色模型拟合值」到「真实观测值」之间的映射关系。换句话说灰色模型负责把趋势骨架搭出来神经网络负责修正细节。2.2 建模六步从累加到灰参数列论文第 2 节给出了 PGM(1,1) 的完整建模过程我按实际计算顺序拆成六步第一步对原始序列 x^(0) 做一阶累加得到 x^(1)(k) Σx^(0)(i)i 1 到 k。第二步计算背景值 z^(1)(k)论文中采用相邻累加值的均值z^(1)(k) ½(x^(1)(k) x^(1)(k1))。第三步构造数据矩阵 B 和观测向量 YB 的第一列是 -z^(1)(k)第二列是常数 1Y 是原始序列从第二个点开始的值。第四步求解灰参数列 [a, b]^T (B^T B)^{-1} B^T Y。这里的 a 是发展系数决定序列的增长速度b 是灰作用量可以理解成系统输入。第五步用 a、b 构造预测公式还原出原始序列的拟合值和未来预测值。第六步将拟合值序列作为后续神经网络的输入数据。这套流程里最容易出错的地方是第二步的背景值。标准 GM(1,1) 用的是 z^(1)(k) ½(x^(1)(k) x^(1)(k1))论文里的 PGM(1,1) 在这个基础上做了修正我在复现时发现用原始公式和修正公式算出来的 a 值差别可能在 10% 以上直接影响后续神经网络输入数据的质量。2.3 一段可复现的 PGM(1,1) 建模代码论文没有给出程序代码但根据灰色模型的建模步骤用 NumPy 十几行就能走通。我习惯先在一个短序列上验证模型行为再接入正式数据。import numpy as np def pgm11(x0): PGM(1,1) 建模返回拟合值与下一期预测值 x0: 原始观测序列一维数组长度 4 n len(x0) # 1. 一阶累加生成 x1 np.cumsum(x0) # 2. 背景值序列相邻累加值取平均 z1 (x1[:-1] x1[1:]) / 2.0 # 3. 构造数据矩阵 B 和观测向量 Y B np.column_stack([-z1, np.ones(n - 1)]) Y x0[1:] # 4. 最小二乘求解灰参数 [a, b] theta np.linalg.inv(B.T B) B.T Y a, b theta[0], theta[1] # 5. 累加序列的预测公式 x1_fit np.zeros(n) x1_fit[0] x0[0] for k in range(1, n): x1_fit[k] (x0[0] - b / a) * np.exp(-a * (k - 1)) b / a # 6. 累减还原为原始序列拟合值 x0_fit np.zeros(n) x0_fit[0] x0[0] for k in range(1, n): x0_fit[k] x1_fit[k] - x1_fit[k - 1] # 预测下一期 x1_next (x0[0] - b / a) * np.exp(-a * n) b / a x0_next x1_next - x1_fit[-1] return x0_fit, x0_next, a, b代码逻辑拆开看第 4 步是最小二乘的核心np.linalg.inv(B.T B) B.T Y 对应论文里的 (B^T B)^{-1} B^T Y这里 B 的列是 [-z1, 1]行数是 n-1。第 5 步用的是灰色模型的标准指数解形式x0[0] 作为初始条件。第 6 步走的是累减还原把累加空间的预测值转回原始空间。参数说明a 为发展系数a 的绝对值越小说明序列趋势越平缓b 为灰作用量。代码里默认输入长度至少 4因为矩阵 B 至少要 3 行才能保证可逆。实际用论文的 7 维序列长度时B 是 6×2 矩阵拟合效果会比短序列稳定得多。我一般会先用这段代码在一个随机的 8 点序列上跑一遍观察拟合值是否平滑。如果拟合值出现剧烈抖动说明原始序列里可能有异常点需要在建模前做预处理而不是直接调神经网络的参数。3. 贝叶斯正则化神经网络它比传统 BP 强在哪3.1 目标函数改造从 E_D 到 βE_D αE_W传统 BP 神经网络的训练目标是最小化均方误差 E_D但样本量小的时候单纯最小化 E_D 会让网络把训练样本的噪声也学进去这就是过拟合。贝叶斯正则化的核心改法是给目标函数加一个惩罚项E βE_D αE_W这里 E_W 是网络权值的平方和代表网络结构的复杂度α 和 β 是正则化系数。当 β α 时网络重点优化训练误差容易过拟合当 α β 时惩罚项占主导网络权值被压缩得很小但整体误差会变大。论文里特别强调Mackay 在贝叶斯框架下把网络权值当作随机向量假设训练集和权值的先验概率都服从高斯分布然后通过最大化后验概率来求解最优的 α 和 β。这个做法的意义在于α 和 β 不是人工试出来的而是在训练过程中自适应调整的。实际训练时你会看到第一轮迭代的 α、β 和第二十轮迭代的值可能差好几个数量级。网络在刚开始时主要减误差后面逐渐转向压缩权值规模这是传统 BP 做不到的。3.2 有效参数 γ 与 Hessian 矩阵的近似计算论文公式里有一个关键量 γ N - 2α · tr(H^{-1})其中 N 是网络总权值个数H β∇²E_D α∇²E_W 是目标函数的 Hessian 矩阵。γ 反映的是网络实际有效的参数个数。这个指标很有意思如果你的网络结构是 3-25-1总权值数是 3×25 25×1 25 1 126 个但 γ 可能只有 30 多说明大部分权值被正则化压到了接近零的水平。也就是说贝叶斯正则化在做的事情是「用一个复杂网络结构但只动用其中一小部分有效参数」。Hessian 矩阵直接计算是 O(N²) 的复杂度论文引用了 Foresee 和 Hagan 的工作用高斯牛顿法近似计算 Hessian把复杂度降到了可接受的范围。这一点在工程实现上很重要——如果你用 MATLAB 的 trainbr 函数内部走的就是这个近似路径不需要自己实现。3.3 网络结构与训练参数3-25-1 是怎么定出来的论文里给出的最优网络节点结构是 3-25-1训练误差设为 0.01。这个结构不是拍脑袋定的而是结合 PGM(1,1) 拟合值的数据长度和对比试验确定的。输入层 3 个节点对应预测周期数 i 3也就是用连续 3 期的 PGM 拟合值去预测下一期的 TFP 观测值。隐藏层 25 个节点对 126 个总权值来说在只有 6 组训练样本的情况下严重过参数化但贝叶斯正则化恰恰擅长处理这种情况——网络结构复杂一点没关系正则化会自动压掉多余的权值。训练误差设 0.01 需要注意这个值不是训练的停止条件理解而是目标精度。贝叶斯正则化训练的停止靠的是 γ 值和 α、β 的收敛不是简单地看误差降到多少。我复现时发现用 trainbr 训练到误差 0.005 左右的时候网络还在继续调整正则化系数此时停下来会丢掉最后一段泛化能力提升。训练参数按论文设置整理如下参数论文设定值说明输入层节点数3对应预测周期数 i 3隐藏层节点数25单隐藏层输出层节点数1下一期 TFP 预测值训练目标误差0.01均方误差目标训练样本组数5 组由 2001—2008 年数据滑动构造隐藏层节点数从 10 试到 40论文最终定在 25不是误差最低的一组而是误差和泛化能力平衡最好的一组。这个细节值得记住隐藏层不是越多越好对时序预测任务过宽的隐藏层在非正则化网络里几乎必然过拟合。4. 组合模型的数据组织新陈代谢滑动窗口与训练样本构建4.1 输入输出设计与代谢机制组合模型的工作流程分三步先用 PGM(1,1) 拟合 TFP 观测序列得到平滑的拟合值然后以拟合值为输入、原始观测值为输出训练贝叶斯正则化神经网络最后用训练好的网络预测下一期。这里有个关键设计不是一次性把所有数据都喂给网络而是采用「新陈代谢」机制。论文里明确写了去掉最老的信息补充新信息。具体来说用 x₁、x₂、…、xᵢ 作为第一组输入对应输出是 xᵢ₊₁然后去掉 x₁补上 xᵢ₊₁用 x₂、…、xᵢ₊₁ 作为第二组输入对应输出 xᵢ₊₂。这个滑动窗口的意义在于TFP 的影响因素政策、技术、资源配置是随时间变化的老数据里的规律可能已经失效。固定窗口训练的网络预测 2009 年可能还行预测 2015 年就完全偏离因为经济结构变了。4.2 训练样本集的构造方式论文用 2001—2008 年数据构建训练集预测 2009 和 2010 年。以 2001 年数据为初始值7 维序列长度建立 PGM(1,1) 模型得到拟合值序列然后按预测周期数 i 3 构造样本。训练样本集的长相如下表所示样本编号网络输入PGM 拟合值网络输出TFP 观测值1x₁, x₂, x₃x₄2x₂, x₃, x₄x₅3x₃, x₄, x₅x₆4x₄, x₅, x₆x₇5x₅, x₆, x₇x₈每组样本都是 3 个输入对应 1 个输出5 组样本构成一个 5×4 的训练矩阵。对神经网络来说这个样本量很小但配合贝叶斯正则化够用。窗口滑动一步样本就多一组。构造这个样本集的代码实现import numpy as np def build_samples(x0_fit, x0_obs, window3): 构造滑动窗口训练样本 x0_fit: PGM(1,1) 拟合值序列 x0_obs: TFP 原始观测值序列 window: 预测周期数即输入节点数 X, y [], [] n len(x0_obs) for i in range(n - window): X.append(x0_fit[i:i window]) y.append(x0_obs[i window]) return np.array(X), np.array(y) # 假设 2001—2008 共 8 个点 tfp_obs np.array([0.52, 0.54, 0.55, 0.56, 0.57, 0.58, 0.58, 0.59]) # PGM 拟合值由上一节 pgm11 函数产生这里用简单平滑序列代替示意 tfp_fit, _, _, _ pgm11(tfp_obs[:8]) X_train, y_train build_samples(tfp_fit, tfp_obs, window3) print(训练样本形状:, X_train.shape, y_train.shape)代码里的 build_samples 函数每次取 window 个连续拟合值作为输入、紧跟其后的观测值作为输出循环直到序列末尾。窗口滑动一步生成一组新样本和论文的代谢机制一致。形状输出是 (5, 3) 和 (5,)正好对应 5 组训练样本、每组 3 个输入。训练时注意神经网络对输入尺度敏感PGM 拟合值的数量级如果和 TFP 观测值不一致要先做归一化否则网络很可能不收敛。论文数据里 TFP 在 0.5 到 0.6 之间尺度本身就接近所以论文没有专门提归一化这一步。4.3 完整验证流程与误差表现论文的验证设计很干净用 2001—2008 年数据训练预测 2009 和 2010 年再用相对误差 RE |预测值 - 实际值| / 实际值 × 100% 评估。最终结果是 2009 年预测值 0.5895相对误差 1.78%2010 年预测值 0.5995相对误差 0.37%。两个误差都比单一 PGM 模型或单一 BP 网络要低说明组合模型在短期预测上确实有优势。预测下一步的代码逻辑是在训练完成后用最后一组输入x₆, x₇, x₈作为网络输入得到 2009 年预测值然后把这个预测值当作新的「观测」重新走一遍 PGM 拟合和窗口滑动再接 2010 年。这步操作对第一次复现的人是个小坑直接拿 2009 年实际值去预测 2010 年会高估模型能力应该用预测值滚动递推。5. 避坑经验TFP 预测落地中的五个坑5.1 原始数据不归一化训练直接不收敛现象MATLAB 里跑 trainbr误差曲线震荡训练几十轮后误差还在 0.1 以上。原因TFP 数据虽然在 0.5 左右但 PGM 拟合值序列经过指数运算后可能超出这个范围。如果输入层和输出层的尺度差一个数量级神经网络的权值初始化很难覆盖这么大的跨度。解决训练前把输入和输出统一归一化到 [0, 1] 或 [-1, 1]训练完后反归一化还原预测值。我一般用 (x - min) / (max - min)简单稳定。5.2 用全部历史数据训练预测远期必然漂移现象用 2001—2010 年数据训练预测 2011、2012 年误差越来越大第一年还行第二年直接偏离 10% 以上。原因论文的新陈代谢机制不是装饰。TFP 受政策冲击影响明显早期数据里的规律在后期已经不成立固定窗口不滑动网络学的是历史平均规律而不是最近趋势。解决严格按论文做法每次预测后把预测值补进样本丢掉最老的点重新训练。窗口长度保持在 4 到 6 组训练样本不贪多。5.3 训练误差目标设太小反而过拟合现象把训练目标误差从 0.01 改到 0.001训练时间翻倍但验证集误差反而变大。原因贝叶斯正则化的目标函数不是单纯的最小化 E_D而是 E βE_D αE_W 的平衡。把目标误差设得太小网络会强行拟合训练样本里的每一个跳动α 正则化系数被压下去泛化能力反而受损。解决0.01 是论文验证过的经验值对这个样本量级别的 TFP 预测够用。不要为了「精度更高」去人为调低目标误差让正则化机制自己决定最优平衡点。5.4 预测周期数 i 拍脑袋乱定现象把预测周期数从 3 改成 5 或 7训练样本组数直接减少网络输入维度变大但预测误差没有下降甚至翻倍。原因预测周期数 i 同时决定输入节点数和训练样本组数。i 越大每组样本包含的信息越多但样本组数越少n - i 组训练数据不够网络学习。这是小样本场景下绕不开的矛盾。解决论文用对比试验确定 i 3是基于 8 年历史数据的最优选择。你的数据量不同就不要照抄 3用小范围网格搜索i 从 2 试到 5看验证集误差最小的是哪个。5.5 用拟合精度评估模型而不是预测精度现象训练集上的拟合误差只有 0.1%看起来完美但预测 2009 年时误差超过 5%。原因把训练误差当成模型好坏的唯一标准是时序预测里最常见的误判。拟合精度高说明网络记住了训练数据不代表能外推。论文里用 2009、2010 年两个样本外数据做验证而不是汇报训练集误差这个做法才是对的。解决划分样本时留出最后 1 到 2 个点作为验证集不参与训练。如果你的数据量够再做滚动验证逐年前移每年预测一次把每年的预测误差都记下来用平均误差评估模型。6. 复现后的验证手法误差口径、基线对比与样本外检验6.1 误差评估先统一口径论文用的相对误差 RE |预测值 - 实际值| / 实际值 × 100%这个口径在宏观经济指标里好理解。但如果你要横向对比多个模型建议同时算一下 MAPE平均绝对百分比误差MAPE (1/n) × Σ(|实际 - 预测| / 实际) × 100%。MAPE 对多步预测更直观因为单点的 RE 可能某一年运气好特别低比如论文里 2010 年的 0.37%但整体水平要看平均值。我自己复现时习惯把每步的 RE 全列出来再看 MAPE不做单点汇报。6.2 至少对比三个基线灰色单模型、BP、朴素外推论文里只给出了组合模型的误差但从验证角度你至少要跑三个对比才能说明组合模型的价值单一 PGM(1,1) 直接预测、单一 BP 神经网络预测、朴素外推用最近一年的值当作预测值。朴素外推这个基线很关键很多时序预测模型的误差看着不错但跟「用去年值当今年预测」一比优势其实没那么大。这三个对比跑完如果组合模型不是每一项都领先说明论文的数据预处理或网络结构设置在你的数据上需要调整而不是模型本身有问题。6.3 我的复现习惯先走一遍 8 点短序列拿到任何新的 TFP 数据我不会直接照搬论文参数而是先取前 8 个点按论文流程完整跑一遍PGM 拟合、3-25-1 网络训练、预测第 9 和第 10 点算误差。如果 8 点序列上误差已经离谱说明原始数据质量有问题或者参数需要重新搜索这时候用脚本快速验证目标函数 E 的收敛曲线看 α、β 的变化趋势是否正常——正则化系数应该在前几次迭代明显跳动后期基本稳定。这个方法不保证找到最优解但能帮你快速判断问题是模型还是数据。从那以后我每次做这类小样本时序预测都强制自己走一遍「留出最后两点做验证、三个基线对比、观察正则化系数曲线」的流程。这套习惯帮我挡掉过好几次「训练集误差完美、样本外一塌糊涂」的无效模型也希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →