拓冰建站拓冰建站
首页 / 资讯中心 / 正文

数学建模竞赛利器:灰色系统理论核心模型与Matlab实战指南

1. 从“小白”到“能用”数模比赛中的灰色系统初体验刚上大一第一次听说数学建模比赛看到“灰色关联度”、“灰色预测”这些词是不是感觉既陌生又有点高大上别慌我也是这么过来的。当时拿到一个关于城市交通拥堵影响因素分析的题目数据少、关系模糊传统统计方法要求大样本直接给我整不会了。后来导师提了一嘴“试试灰色系统理论”我才发现这简直是处理“小样本、贫信息”问题的利器。灰色关联度帮你从一堆看似杂乱的因素里找出谁跟结果“关系最铁”灰色预测则能在数据少得可怜的情况下对未来趋势做出还算靠谱的估计。最关键的是它的核心模型用Matlab实现起来并不复杂非常适合编程基础还在爬坡阶段的同学快速上手产出可视化结果。这篇文章我就以一个过来人的身份拆解一下这两个核心工具并附上我当年调试了无数遍、可以直接“抄作业”的Matlab代码希望能帮你平稳度过第一个数模竞赛。2. 灰色关联度分析在混沌中寻找“亲疏关系”当你面对一个系统比如“农产品产量”它可能受到“降雨量”、“温度”、“施肥量”、“光照时长”等十多个因素的影响但手头只有寥寥几年的数据。你怎么判断哪个因素对产量影响最大灰色关联度分析Grey Relational Analysis, GRA就是干这个的。它的核心思想不是精确计算而是通过几何形状的相似度来判断各因素序列与系统特征序列的关联紧密程度。形状越接近关联度越大该因素就越重要。2.1 核心步骤与数学逻辑拆解整个分析过程可以归纳为四步我们结合一个简单的例子来看假设研究城市GDP系统特征序列与固定资产投资、社会消费品零售总额、进出口总额三个影响因素序列的关联度有5年数据。第一步确定分析序列。设系统特征序列母序列为 ( X_0 (x_0(1), x_0(2), ..., x_0(n)) )。 设有m个影响因素序列子序列( X_i (x_i(1), x_i(2), ..., x_i(n)), i1,2,...,m )。 在我们的例子中( X_0 ) 就是5年的GDP数据( X_1, X_2, X_3 ) 分别是另外三个指标的5年数据。第二步数据的无量纲化处理。这是关键一步因为各指标量纲不同GDP是亿元投资是亿元温度是摄氏度直接比较没有意义。最常用的是“初值化”处理即每个序列的所有数据都除以该序列的第一个值。 处理后的序列为 [ X_i \frac{X_i}{x_i(1)} ( \frac{x_i(1)}{x_i(1)}, \frac{x_i(2)}{x_i(1)}, ..., \frac{x_i(n)}{x_i(1)} ) ] 这样所有序列的起点都变成了1便于比较后续变化曲线的形状。除了初值化还有均值化等方法但初值化在灰色关联分析中最为常见和直观。第三步计算关联系数。这是计算的核心。对于每一个时刻kk1,2,...,n计算母序列与每个子序列在该时刻的“距离”然后转化为关联系数。 首先计算绝对差序列( \Delta_i(k) |x_0(k) - x_i(k)| )即每个时刻两条曲线纵坐标的差值。 然后找出所有绝对差中的最大值和最小值( \Delta(\max) \max_i \max_k \Delta_i(k) ), ( \Delta(\min) \min_i \min_k \Delta_i(k) )。 最后计算关联系数 [ \gamma_{0i}(k) \frac{\Delta(\min) \rho \Delta(\max)}{\Delta_i(k) \rho \Delta(\max)} ] 这里的 ( \rho ) 是分辨系数通常在0到1之间一般取0.5。它的作用是调节关联系数之间的差异大小。( \rho ) 越小差异越明显。你可以把它理解为一个“拉伸系数”( \rho ) 小的时候关联度大的会更大小的会更小区分度更强。第四步计算关联度并排序。关联系数 ( \gamma_{0i}(k) ) 是每个时刻的值我们需要一个综合指标。通常就是求平均值 [ r_{0i} \frac{1}{n} \sum_{k1}^{n} \gamma_{0i}(k) ] 这个 ( r_{0i} ) 就是子序列 ( X_i ) 与母序列 ( X_0 ) 的灰色关联度。数值在0到1之间越接近1说明该因素与系统行为的关系越紧密。最后对所有 ( r_{0i} ) 排序就得到了因素的重要性排名。注意灰色关联度分析得出的是一种“次序”关系即哪个因素影响更大。它一般不用于精确度量“影响程度有多大”比如投资增加1%GDP具体增长多少。它的优势在于对数据分布、样本量要求极低且计算简单。2.2 Matlab代码实现与逐行解读下面是我封装好的一个灰色关联度分析函数你只需要准备好数据矩阵调用它即可得到关联度排序结果和可视化图。function [r, sorted_idx] grey_rel_analysis(data, rho) % 灰色关联度分析函数 % 输入 % data - (n1)行m列的矩阵。第一行为母序列其余n行为子序列。每列是一个时间点/样本点。 % rho - 分辨系数默认为0.5 % 输出 % r - 各子序列与母序列的关联度向量 % sorted_idx - 按关联度从大到小排序的子序列索引 if nargin 2 rho 0.5; % 默认分辨系数 end [num_series, num_points] size(data); mother_seq data(1, :); % 提取母序列 son_seqs data(2:end, :); % 提取所有子序列 num_son num_series - 1; % 1. 无量纲化初值化 mother_seq_norm mother_seq / mother_seq(1); son_seqs_norm zeros(num_son, num_points); for i 1:num_son son_seqs_norm(i, :) son_seqs(i, :) / son_seqs(i, 1); end % 2. 计算绝对差序列 delta zeros(num_son, num_points); for i 1:num_son delta(i, :) abs(mother_seq_norm - son_seqs_norm(i, :)); end % 3. 找出全局最小差和最大差 min_delta min(min(delta)); max_delta max(max(delta)); % 4. 计算关联系数矩阵 coeff zeros(num_son, num_points); for i 1:num_son for k 1:num_points coeff(i, k) (min_delta rho * max_delta) / (delta(i, k) rho * max_delta); end end % 5. 计算各子序列的关联度均值 r mean(coeff, 2); % 对每一行每个子序列求均值 % 6. 按关联度降序排序 [~, sorted_idx] sort(r, descend); % 7. 可视化绘制无量纲化后的序列曲线 figure(Position, [100, 100, 1200, 500]); subplot(1,2,1); plot(1:num_points, mother_seq_norm, k-o, LineWidth, 2, MarkerSize, 8, DisplayName, 母序列); hold on; colors lines(num_son); % 生成区分度高的颜色 for i 1:num_son plot(1:num_points, son_seqs_norm(i, :), --s, Color, colors(i,:), LineWidth, 1.5, MarkerSize, 6, ... DisplayName, [子序列, num2str(i)]); end hold off; xlabel(时间点/样本点); ylabel(初值化后的值); title(无量纲化序列对比图); legend(Location, best); grid on; % 绘制关联度柱状图 subplot(1,2,2); bar(r(sorted_idx), FaceColor, [0.2, 0.6, 0.8]); set(gca, XTickLabel, arrayfun((x) [因素, num2str(sorted_idx(x))], 1:num_son, UniformOutput, false)); ylabel(灰色关联度); title(因素关联度排序); grid on; ylim([0, 1.1]); % 关联度范围在0-1之间留点顶部空间 % 在柱子上方标注数值 for i 1:num_son text(i, r(sorted_idx(i)) 0.02, sprintf(%.4f, r(sorted_idx(i))), ... HorizontalAlignment, center, FontWeight, bold); end end使用示例假设你的数据已经整理好第一行是GDP后三行是三个影响因素共5年数据。% 示例数据行序列列年份2019-2023 data [ 100, 110, 125, 140, 155; % X0: GDP 30, 35, 40, 48, 60; % X1: 固定资产投资 45, 50, 58, 65, 72; % X2: 社会消费品零售总额 25, 28, 30, 29, 33; % X3: 进出口总额 ]; [r, order] grey_rel_analysis(data, 0.5); fprintf(关联度结果\n); for i 1:length(r) fprintf(因素%d: %.4f\n, i, r(i)); end fprintf(\n关联度排序从高到低因素%d - 因素%d - 因素%d\n, order(1), order(2), order(3));运行后你会得到两个图左边是各序列初值化后的变化曲线直观看哪条线跟黑线母序列走势最像右边是关联度的柱状图排名一目了然。3. 灰色预测GM(1,1)模型用有限的数据窥探未来灰色预测是灰色系统理论的另一大支柱其中最经典、应用最广的就是GM(1,1)模型。G表示Grey灰色M表示Model模型第一个1表示一阶微分方程第二个1表示单个变量。简单说它适合处理“数据少”、“趋势性明显”的时间序列预测问题比如未来几年的销量预测、能源消耗预测等。它的强大之处在于不需要像回归分析那样寻找影响因素只依靠数据本身的历史规律来外推。3.1 GM(1,1)模型的建模原理详解很多人直接套公式但不明白为什么。这里我拆开讲希望你能理解其背后的思想。GM(1,1)的本质是通过对原始数据序列进行累加生成弱化其随机性凸显其指数增长趋势然后用一个一阶微分方程去拟合这个新序列最后再通过累减还原得到预测值。第一步原始序列与一次累加生成1-AGO设原始非负序列为 ( X^{(0)} (x^{(0)}(1), x^{(0)}(2), ..., x^{(0)}(n)) )。 我们对其进行一次累加得到新序列 ( X^{(1)} ) [ x^{(1)}(k) \sum_{i1}^{k} x^{(0)}(i), \quad k1,2,...,n ] 累加的目的是将原本可能杂乱无章的原始数据转化为一个单调递增的序列。你可以想象一下把每天零碎的花费加起来得到累计花费这个累计花费曲线通常就平滑很多趋势也更明显。第二步构建灰微分方程对于累加序列 ( X^{(1)} )我们建立GM(1,1)的灰微分方程基本形式 [ x^{(0)}(k) a z^{(1)}(k) b ] 这里( a ) 称为发展系数反映序列的增长势头( b ) 称为灰色作用量可以理解为内生驱动项。 ( z^{(1)}(k) ) 是 ( X^{(1)} ) 的紧邻均值生成序列 [ z^{(1)}(k) 0.5 \times (x^{(1)}(k) x^{(1)}(k-1)), \quad k2,3,...,n ] 为什么用紧邻均值它相当于用前后两个点的平均值来代表这个区间段的“背景值”使得微分方程离散化。第三步利用最小二乘法求解参数a, b将k2,3,...,n代入灰微分方程可以得到一个线性方程组 [ \begin{cases} x^{(0)}(2) a z^{(1)}(2) b \ x^{(0)}(3) a z^{(1)}(3) b \ ... \ x^{(0)}(n) a z^{(1)}(n) b \end{cases} ] 写成矩阵形式 ( Y B \hat{u} )其中 [ Y \begin{bmatrix} x^{(0)}(2) \ x^{(0)}(3) \ ... \ x^{(0)}(n) \end{bmatrix}, \quad B \begin{bmatrix} -z^{(1)}(2) 1 \ -z^{(1)}(3) 1 \ ... ... \ -z^{(1)}(n) 1 \end{bmatrix}, \quad \hat{u} \begin{bmatrix} a \ b \end{bmatrix} ] 利用最小二乘法求得参数估计值 [ \hat{u} (B^T B)^{-1} B^T Y ] 这一步是模型的核心计算Matlab可以轻松完成。第四步建立时间响应式预测模型求解出a和b后对应的白化微分方程为 [ \frac{dx^{(1)}}{dt} a x^{(1)} b ] 解这个微分方程得到累加序列 ( X^{(1)} ) 的时间响应式预测公式 [ \hat{x}^{(1)}(k1) \left( x^{(0)}(1) - \frac{b}{a} \right) e^{-a k} \frac{b}{a}, \quad k0,1,2,... ] 这个公式就是我们的预测模型( \hat{x}^{(1)}(k1) ) 表示预测的第k1个累加值。第五步累减还原得到原始序列预测值因为我们最终要预测的是原始数据所以需要对累加预测值进行累减还原IAGO [ \hat{x}^{(0)}(k1) \hat{x}^{(1)}(k1) - \hat{x}^{(1)}(k), \quad k1,2,3,... ] 其中我们定义 ( \hat{x}^{(1)}(1) x^{(1)}(1) x^{(0)}(1) )。3.2 模型检验你的预测靠谱吗模型建好了不能直接就用必须进行检验。通常从三个层面看1. 残差检验计算绝对残差 ( \epsilon(k) x^{(0)}(k) - \hat{x}^{(0)}(k) ) 和相对残差 ( \delta(k) \frac{\epsilon(k)}{x^{(0)}(k)} \times 100% )。 通常要求平均相对残差低于某个阈值如5%或10%并且绝大多数点的相对残差都较小。2. 关联度检验计算原始序列 ( X^{(0)} ) 与预测序列 ( \hat{X}^{(0)} ) 的灰色关联度 ( r )方法同第二章。关联度越大通常要求大于0.6说明预测序列与原始序列的变化趋势越一致。3. 后验差检验这是灰色预测非常经典且重要的检验方法。计算原始序列的均值 ( \bar{X} ) 和标准差 ( S_1 )。计算残差序列的均值 ( \bar{\epsilon} )理论上应接近0和标准差 ( S_2 )。计算后验差比值 ( C \frac{S_2}{S_1} ) 和小误差概率 ( P P(|\epsilon(k) - \bar{\epsilon}| 0.6745 S_1) )。 根据C和P的值可以对照下表评估模型精度等级精度等级后验差比值 C小误差概率 P优秀 (1级)C ≤ 0.35P ≥ 0.95合格 (2级)0.35 C ≤ 0.500.80 ≤ P 0.95勉强 (3级)0.50 C ≤ 0.650.70 ≤ P 0.80不合格 (4级)C 0.65P 0.70实操心得在实际比赛中后验差检验是必做项并且要把这个表放在论文里。如果检验不合格等级为3级或4级说明原始数据可能不适合直接用GM(1,1)预测需要考虑对原始数据进行平滑处理如滑动平均、剔除异常值或者使用其他改进的灰色模型如GM(1,1)幂模型、离散灰色模型等。3.3 完整的Matlab预测代码与深度使用指南我将建模、预测、检验、可视化全部封装在一个函数里并提供了丰富的输出选项。function [predict, a, b, C, P, level, rel_residual] gm11_predict(original_data, predict_step, plot_flag) % GM(1,1)灰色预测模型 % 输入 % original_data - 原始数据行向量例如 [x1, x2, x3, ..., xn] % predict_step - 需要预测的未来步数例如预测未来3年则输入3 % plot_flag - 是否绘图1为是0为否默认为1 % 输出 % predict - 预测值向量包括历史拟合值和未来预测值长度 length(original_data) predict_step % a, b - 模型参数发展系数a和灰色作用量b % C, P - 后验差检验指标 % level - 模型精度等级Excellent, Qualified, Just, Unqualified % rel_residual - 历史数据的相对残差百分比向量 if nargin 3 plot_flag 1; % 默认绘图 end n length(original_data); if n 4 error(原始数据至少需要4个点才能建立GM(1,1)模型。); end % 1. 一次累加生成 (1-AGO) X0 original_data(:); % 确保是行向量 X1 cumsum(X0); % 2. 构造数据矩阵B和Y Z1 (X1(1:end-1) X1(2:end)) / 2; % 紧邻均值生成序列 Y X0(2:end); B [-Z1, ones(n-1, 1)]; % 3. 最小二乘法求解参数 a, b u (B * B) \ (B * Y); % 等价于 inv(B*B)*B*Y但更稳定 a u(1); b u(2); % 4. 时间响应式及预测 % 累加序列预测公式 predict_X1 zeros(1, n predict_step); predict_X1(1) X1(1); for k 1:(n predict_step - 1) predict_X1(k1) (X0(1) - b/a) * exp(-a * k) b/a; end % 累减还原得到原始序列预测值 predict_X0 zeros(1, n predict_step); predict_X0(1) X0(1); for k 2:(n predict_step) predict_X0(k) predict_X1(k) - predict_X1(k-1); end predict predict_X0; % 5. 模型检验 % 5.1 残差检验 fitted_values predict(1:n); % 历史拟合值 residual X0 - fitted_values; % 残差 rel_residual abs(residual ./ X0) * 100; % 相对残差百分比 avg_rel_residual mean(rel_residual); % 5.2 后验差检验 S1 std(X0, 1); % 原始序列标准差 (分母用n) S2 std(residual, 1); % 残差序列标准差 C S2 / S1; % 后验差比值 % 计算小误差概率 P mu mean(residual); count sum(abs(residual - mu) 0.6745 * S1); P count / n; % 判断精度等级 if C 0.35 P 0.95 level Excellent (1级); elseif C 0.5 P 0.8 level Qualified (2级); elseif C 0.65 P 0.7 level Just (3级); else level Unqualified (4级); end % 6. 可视化 if plot_flag figure(Position, [100, 100, 1400, 500]); % 子图1预测与原始数据对比 subplot(1,3,1); years_hist 1:n; years_pred 1:(npredict_step); plot(years_hist, X0, bo-, LineWidth, 2, MarkerSize, 8, DisplayName, 原始数据); hold on; plot(years_pred, predict, r--s, LineWidth, 1.5, MarkerSize, 6, DisplayName, 拟合与预测); plot(years_hist, fitted_values, rs, MarkerSize, 8, HandleVisibility, off); % 不单独显示图例 legend(Location, best); xlabel(时间序列); ylabel(数值); title([GM(1,1)预测结果 (a, num2str(a, %.4f), , b, num2str(b, %.4f), )]); grid on; hold off; % 子图2相对残差图 subplot(1,3,2); bar(years_hist, rel_residual, FaceColor, [0.85, 0.33, 0.1]); hold on; plot(xlim, [avg_rel_residual, avg_rel_residual], k--, LineWidth, 1.5, DisplayName, [平均, num2str(avg_rel_residual, %.2f), %]); xlabel(时间序列); ylabel(相对残差 (%)); title(模型拟合相对残差); legend(Location, best); grid on; hold off; % 子图3后验差检验结果展示 subplot(1,3,3); text(0.1, 0.9, sprintf(后验差比值 C %.4f, C), FontSize, 12); text(0.1, 0.7, sprintf(小误差概率 P %.4f, P), FontSize, 12); text(0.1, 0.5, sprintf(模型精度等级: %s, level), FontSize, 12, Color, r, FontWeight, bold); text(0.1, 0.3, sprintf(发展系数 a %.4f, a), FontSize, 10); text(0.1, 0.1, sprintf(灰色作用量 b %.4f, b), FontSize, 10); axis off; title(模型检验结果); end % 7. 控制台输出关键信息 fprintf( GM(1,1)模型预测报告 \n); fprintf(模型参数发展系数 a %.6f灰色作用量 b %.6f\n, a, b); fprintf(历史数据拟合平均相对残差%.2f%%\n, avg_rel_residual); fprintf(后验差比值 C %.4f\n, C); fprintf(小误差概率 P %.4f\n, P); fprintf(模型精度等级%s\n, level); fprintf(未来 %d 步预测值\n, predict_step); for i 1:predict_step fprintf( 第%d步: %.4f\n, i, predict(ni)); end fprintf(\n); end使用示例与解读% 假设我们有过去5年的产品销量数据 sales [120, 135, 158, 182, 210]; % 单位千件 future_steps 3; % 预测未来3年 [pred, a, b, C, P, level] gm11_predict(sales, future_steps);运行后你会得到一张包含三个子图的综合报告图以及控制台的详细文本输出。第一张图展示了历史数据的拟合情况和未来预测的趋势线第二张图显示了每个历史数据点的拟合相对误差第三张图汇总了关键的模型检验参数。踩坑提醒数据非负GM(1,1)要求原始数据序列为非负。如果你的数据有负数需要进行“平移处理”即所有数据加上一个常数使其变为正数预测结果后再减去这个常数。数据量要求理论上至少4个数据点但实际应用中7-15个点效果较好。数据太少规律不稳太多则可能因为系统演化而不再是简单的指数趋势。发展系数a的符号-a实际上反映了系统的增长/衰减趋势。-a 0即a0时模型呈指数衰减趋势-a 0即a0时呈指数增长趋势。如果得到的a非常接近0说明序列变化平缓预测可能比较准确如果|a|太大比如0.3说明序列变化剧烈长期预测误差会放大此时只适合短期预测。预测步数不建议做长期预测如预测步数超过原始数据长度的一半。灰色预测的优势在于短期和中期。4. 数模实战融合从解题到论文呈现掌握了两个核心工具后如何在数学建模比赛中应用并写到论文里这部分才是区分“代码跑通”和“比赛拿奖”的关键。4.1 典型应用场景与问题构建灰色系统理论特别适合以下类型的赛题影响因素分析题如“影响城市空气质量的主要因素分析”、“农产品产量的关键驱动因子识别”。这类题目数据指标多但年份数据少可能只有5-10年样本量不符合传统统计方法要求。解法将空气质量指数AQI作为母序列将工业排放、汽车尾气、气象因素等作为子序列进行灰色关联度分析排序后得出最主要的影响因素并可在论文中展示关联度排序柱状图。趋势预测题如“未来五年我国新能源汽车保有量预测”、“某地区水资源需求预测”。数据往往是时间序列且可能因为是新事物、历史数据短。解法收集近几年的历史数据建立GM(1,1)模型进行预测。必须进行后验差检验如果检验不合格需要在论文中分析原因如数据波动大并尝试采用改进的灰色模型或数据预处理方法如三点平滑。综合评价与预测结合题这是更高级的用法。例如“区域科技创新能力评价与未来发展趋势预测”。解法先利用灰色关联度确定各评价指标如RD投入、专利数、论文数等与“科技创新能力”一个虚拟的理想最优序列的关联度以此作为权重。然后或许可以用加权后的综合得分序列再建立GM(1,1)模型预测其未来走势。4.2 论文书写要点与代码整合在论文的“模型建立与求解”部分你需要清晰地展示过程对于灰色关联度分析公式陈列列出无量纲化公式、关联系数公式、关联度公式。不必推导直接给出。过程简述用文字描述“首先对数据进行初值化处理以消除量纲然后计算各时刻关联系数最后求平均得到关联度”。结果呈现强烈建议使用表格和图形结合。表格列出所有因素的关联度计算结果及排序。 | 影响因素 | 灰色关联度 | 排序 | | :--- | :--- | :--- | | 因素A | 0.85 | 1 | | 因素B | 0.72 | 2 | | 因素C | 0.68 | 3 |图形将2.2节代码生成的“无量纲化序列对比图”和“关联度排序柱状图”放入论文并配文说明“由图X可见因素A的曲线与母序列曲线形态最为接近其关联度也最高表明...”。分析讨论根据关联度排序结果结合题目背景解释为什么这个因素最重要给出实际管理或政策建议。对于灰色预测GM(1,1)模型公式陈列列出1-AGO公式、紧邻均值公式、灰微分方程、参数求解的最小二乘公式、时间响应式及累减还原公式。建模过程简述“通过对原始序列进行一次累加生成得到新序列构建GM(1,1)灰微分方程利用最小二乘法估计参数a和b进而得到预测模型”。模型检验这是重中之重必须详细报告。将3.3节代码计算出的C、P值以及精度等级明确写入论文。最好将后验差检验的评价标准表也附上并说明“本研究模型CxxPxx根据表X精度等级为X级模型合格/优秀可用于预测”。结果呈现表格列出历史数据的拟合值、残差、相对残差。 | 年份 | 原始值 | 拟合值 | 绝对残差 | 相对残差(%) | | :--- | :--- | :--- | :--- | :--- | | 2019 | 120 | 120.00 | 0.00 | 0.00 | | 2020 | 135 | 134.22 | 0.78 | 0.58 | | ... | ... | ... | ... | ... |图形将3.3节代码生成的预测对比图放入论文清晰展示拟合效果和未来预测趋势。预测与分析给出未来若干期的预测值并用文字描述其趋势“呈指数增长/衰减态势”同时务必指出模型的局限性如“本模型基于指数规律适合短期预测长期预测需结合其他方法进行修正”这体现了你的批判性思维。4.3 进阶技巧与常见问题排错在实际编程和比赛过程中你肯定会遇到问题。这里分享几个我踩过的坑和解决方法。问题1运行灰色关联度分析代码关联度结果全部非常接近1或0.99可能原因数据量纲差异巨大但你没有进行无量纲化处理或者处理方式不当。检查代码确保grey_rel_analysis函数中“初值化”步骤被执行。如果原始数据第一个值就是0初值化会报错除以0这时需要改用“均值化”处理每个序列除以该序列的均值。改进代码可以在函数开始时增加一个判断如果序列首元素为0自动切换为均值化或者提示用户。问题2GM(1,1)预测未来值出现负数可能原因原始数据序列本身波动大或者存在下降趋势而GM(1,1)的指数形式在长期外推时可能穿过零点。解决方案检查数据适用性回顾3.1节中关于发展系数a的解读。如果a是正数且较大模型本身是衰减模型预测值最终会趋近于b/a如果b/a是负数就可能出现负值。这可能是模型不适用该数据的信号。数据平移如果原始数据均为正但有下降趋势可以尝试将所有数据加上一个足够大的正常数M使新序列呈上升趋势用新序列建模预测最后预测值再减去M。但这种方法物理意义需合理解释。改用其他模型考虑使用GM(2,1)模型、Verhulst模型适用于S型饱和序列或直接使用时间序列分析ARIMA等。问题3后验差检验等级为“不合格”(Unqualified)怎么办这是最常遇到的问题意味着模型精度不够。不要隐瞒在论文中分析并尝试改进是加分项。第一步数据预处理平滑处理对原始序列进行滑动平均。例如三点平滑new_X0(k) (X0(k-1)X0(k)X0(k1))/3。对数变换如果数据呈指数增长可以对原始数据取对数log(X0)对新序列建模预测最后预测值再取指数exp()还原。第二步尝试改进的灰色模型离散GM(1,1)模型 (DGM)它直接针对离散序列建模有时比连续形式的GM(1,1)精度更高。GM(1,1)幂模型在灰微分方程中引入幂指数适用于更复杂的增长模式。第三步模型组合残差修正如果原始模型拟合序列的残差有一定规律可以对残差序列再建立一个GM(1,1)模型用其预测值去修正原始预测值。与其他方法结合在论文中坦诚说明单一灰色预测的不足可以将其与移动平均法、指数平滑法的结果进行对比或采用加权组合预测。问题4Matlab代码报错“矩阵维度不一致”或“索引超出范围”检查数据输入格式grey_rel_analysis函数要求data矩阵是行代表序列列代表时间点。最容易出错的就是把数据按列向量输入了。使用size(data)命令检查维度。检查向量方向gm11_predict函数输入要求是行向量。如果是从Excel读取的一列数据默认是列向量需要用original_data进行转置或者用original_data(:)确保转为行向量。最后给大一参加数模的你一点心态上的建议灰色系统理论是一个很好的入门工具它让你在面对“数据少、信息不全”的难题时有法可依。但它也不是万能的。在比赛中清晰地展示你的分析过程、严谨地进行模型检验、坦诚地讨论模型优缺点比单纯追求预测数字的精准更重要。把这些代码理解、吃透变成你自己的武器库你就能在数模比赛中迈出坚实的第一步。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门