保姆级教程:用MATLAB搞定GM(1,1)预测模型的三大检验(附完整代码)

📅 2026/7/5 11:24:59 👁️ 阅读次数 📝 编程学习
保姆级教程:用MATLAB搞定GM(1,1)预测模型的三大检验(附完整代码)

保姆级教程:用MATLAB搞定GM(1,1)预测模型的三大检验(附完整代码)

灰色预测模型GM(1,1)在数据分析领域应用广泛,但很多初学者在完成建模后,往往对如何科学评估模型质量感到困惑。本文将手把手教你用MATLAB实现相对残差检验关联度检验后验差检验三大核心评估方法,并提供可直接运行的完整代码。

1. 准备工作与环境配置

在开始检验之前,我们需要先完成GM(1,1)模型的建立。假设你已经有一组原始数据序列X⁽⁰⁾,并完成了累加生成和模型参数求解。这里我们快速回顾一下基础建模步骤:

% 原始数据序列 X0 = [71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6]; % 累加生成 X1 = cumsum(X0); % 构造数据矩阵B和Y n = length(X0); B = [-0.5*(X1(1:end-1)+X1(2:end))', ones(n-1,1)]; Y = X0(2:end)'; % 参数估计 u = (B'*B)\B'*Y; a = u(1); b = u(2);

提示:确保你的MATLAB安装了Statistics and Machine Learning Toolbox,部分检验函数需要这个工具箱支持。

2. 相对残差检验:评估模型拟合精度

相对残差检验是最直观的模型评估方法,它反映了预测值与实际值的偏差程度。

2.1 计算相对残差

% 计算预测值 X1_pred = (X0(1)-b/a)*exp(-a*((1:n)-1)) + b/a; X0_pred = [X0(1), diff(X1_pred)]; % 计算绝对残差和相对残差 abs_residual = X0 - X0_pred; relative_residual = abs_residual ./ X0 * 100; disp('相对残差检验结果:'); disp(table((1:n)', X0', X0_pred', abs_residual', relative_residual', ... 'VariableNames', {'序号','原始值','预测值','绝对残差','相对残差(%)'}));

2.2 结果解读与标准

相对残差检验的判断标准通常为:

相对残差范围模型精度等级
<1%优秀
1%-5%良好
5%-10%合格
>10%不合格

如果发现某些点的相对残差过大,可以尝试以下优化方法:

  1. 检查原始数据是否存在异常值
  2. 考虑使用数据平滑预处理技术
  3. 尝试调整模型参数估计方法

3. 关联度检验:评估模型曲线相似性

关联度检验用于衡量模型预测曲线与实际曲线的相似程度,是灰色系统理论特有的评估方法。

3.1 计算关联系数与关联度

% 计算绝对差值序列 delta = abs(X0 - X0_pred); % 计算两极最小差和最大差 min_delta = min(delta); max_delta = max(delta); % 设置分辨系数rho(通常取0.5) rho = 0.5; % 计算关联系数 gamma = (min_delta + rho * max_delta) ./ (delta + rho * max_delta); % 计算关联度 r = mean(gamma); disp(['关联度检验结果:r = ', num2str(r)]);

3.2 关联度检验标准

关联度的判断标准如下:

  • r > 0.9:模型关联性极强
  • 0.8 < r ≤ 0.9:关联性较强
  • 0.7 < r ≤ 0.8:关联性一般
  • r ≤ 0.7:关联性较弱

注意:当关联度不理想时,可以尝试调整分辨系数rho的值(通常在0.1-1.0之间),观察关联度的变化趋势。

4. 后验差检验:综合评估模型预测能力

后验差检验通过比较原始数据方差与残差方差的关系,对模型进行综合评估。

4.1 计算后验差指标

% 计算原始数据均值与方差 X0_mean = mean(X0); S1 = std(X0); % 计算残差均值与方差 residual = X0 - X0_pred; residual_mean = mean(residual); S2 = std(residual); % 计算后验差比值和小误差概率 C = S2 / S1; P = sum(abs(residual - residual_mean) < 0.6745*S1) / n; disp(['后验差检验结果:C = ', num2str(C), ', P = ', num2str(P)]);

4.2 后验差检验标准

后验差检验有两个关键指标:

方差比C:

C值范围模型精度等级
<0.35优秀
0.35-0.5良好
0.5-0.65合格
>0.65不合格

小误差概率P:

P值范围模型精度等级
>0.95优秀
0.80-0.95良好
0.70-0.80合格
<0.70不合格

5. 三大检验的综合应用与问题排查

在实际应用中,我们需要综合三个检验结果来评估模型质量。下面是一个典型的问题排查流程:

  1. 首先看相对残差:检查是否有异常点
  2. 然后看关联度:评估整体曲线相似性
  3. 最后看后验差:综合判断模型预测能力

常见问题及解决方案:

  • 所有检验都不理想

    • 检查数据是否适合GM(1,1)模型(指数增长特性)
    • 考虑使用其他灰色模型如GM(2,1)或Verhulst模型
  • 部分检验不通过

    • 相对残差过大但关联度好:可能存在个别异常值
    • 关联度低但后验差好:曲线形状差异大但预测精度尚可
% 综合评估函数示例 function [result] = evaluate_model(X0, X0_pred) % 计算各项指标 % ...(包含前面三个检验的代码) % 综合评估 if all(relative_residual < 5) && r > 0.8 && C < 0.5 && P > 0.8 result = '模型综合评估:优秀'; elseif all(relative_residual < 10) && r > 0.7 && C < 0.65 && P > 0.7 result = '模型综合评估:合格'; else result = '模型综合评估:不合格'; end end

在实际项目中,我发现将三大检验结果可视化能更直观地展示模型性能。下面是一个简单的可视化代码示例:

figure; subplot(3,1,1); plot(relative_residual, 'ro-'); title('相对残差检验'); xlabel('序号'); ylabel('相对残差(%)'); subplot(3,1,2); bar(gamma); title(['关联度检验 r=',num2str(r)]); xlabel('序号'); ylabel('关联系数'); subplot(3,1,3); plot(X0, 'bo-'); hold on; plot(X0_pred, 'r*-'); title(['后验差检验 C=',num2str(C),' P=',num2str(P)]); xlabel('序号'); ylabel('值'); legend('原始值','预测值');