ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MATLAB实战:最小二乘拟合与灰色预测在时间序列分析中的应用

MATLAB实战:最小二乘拟合与灰色预测在时间序列分析中的应用 1. 项目概述从一道赛题看数据预测的实战路径最近在整理过往的数学建模竞赛资料时翻到了2020年亚太地区大学生数学建模竞赛APMCM的B题。这道题的核心是要求参赛者基于给定的历史数据序列构建预测模型来估计未来趋势。题目没有限定具体方法但“最小二乘拟合”和“灰色预测”是当时许多队伍会优先考虑的两个经典且有效的工具。这让我想起无论是学生时代的竞赛还是后来工作中遇到的实际业务预测问题这两个方法常常是工具箱里的“开罐器”——简单、直接往往能快速打开局面为更复杂的分析奠定基础。简单来说这道题提供了一个典型场景你手头有一串按时间排列的数据可能是某产品的月销量、某个城市的季度用电量或者是一种传染病的周新增病例数。你的任务就是利用这串已知的数据去合理地推测接下来一段时间的数据会怎么走。最小二乘拟合和灰色预测正是解决这类问题的两把风格迥异但都极具威力的“钥匙”。前者基于严格的统计假设寻找数据背后的函数关系后者则擅长处理“小样本、贫信息”的不确定系统从杂乱中挖掘规律。如果你正在学习数据分析、数学建模或者工作中需要做一些简单的趋势分析和短期预测掌握这两个方法及其在MATLAB中的实现绝对是提升效率的利器。它们不需要你具备高深的机器学习知识却能解决大量实际问题。接下来我就结合这道赛题和多年的使用经验为你拆解这两个方法的原理、在MATLAB中的实操步骤以及如何根据数据特点进行选择和优化。2. 核心思路解析为什么是这两个方法面对一道预测题选择模型是第一步也是最关键的一步。模型选对了事半功倍选错了可能南辕北辙。在2020APMCM B题这类典型的时间序列预测问题中最小二乘拟合和灰色预测之所以成为热门选择背后有深刻的逻辑。2.1 最小二乘拟合寻找确定的函数关系最小二乘法的核心思想非常直观找到一条曲线或一个函数使得所有数据点到这条曲线的垂直距离即误差的平方和最小。它隐含了一个重要的假设你所研究的数据背后存在一个确定的、可以用某个数学函数模型来描述的关系而观测数据只是在这个关系上叠加了一些随机噪声。例如题目给的数据可能呈现出明显的线性增长、指数增长、或者多项式波动趋势。这时我们就可以假设线性关系y a*x b指数关系y a * exp(b*x)可通过取对数转化为线性多项式关系y a0 a1*x a2*x^2 ... an*x^n最小二乘法的任务就是根据已知的(x, y)数据点计算出上述模型中未知参数如a, b, a0, a1...的最佳估计值使得拟合曲线最“贴近”数据。为什么在赛题中常用原理清晰易于实现其数学原理求导令偏导为零在高等数学中即有涉及且MATLAB等工具内置了强大的拟合函数如polyfit,fit一行代码就能出结果。结果可解释性强拟合出的参数有明确的物理或经济意义。比如线性拟合的斜率代表增长率这非常有利于在论文中进行分析和阐述。适用于趋势明显的序列如果历史数据展现出强烈的确定性趋势如稳定增长、周期性变化最小二乘拟合能很好地捕捉这种趋势并进行外推。注意最小二乘拟合的“外推”风险较高。它假设未来的数据依然严格遵循你拟合出的函数关系这在实际中往往不成立。特别是用高阶多项式拟合时超出原始数据范围的外推结果可能变得极其荒谬这被称为“龙格现象”。2.2 灰色预测应对信息匮乏的不确定性灰色系统理论是由邓聚龙教授提出的专门研究“部分信息已知部分信息未知”的“小样本、贫信息”不确定性系统。灰色预测模型尤其是最常用的GM(1,1)模型的核心思想是通过对原始杂乱无章的数据进行某种生成变换如一次累加使其呈现出近似指数增长的规律然后建立微分方程模型最后再通过累减还原得到预测值。它的流程可以概括为原始序列 - 累加生成 - 建立灰微分方程 - 求解时间响应函数 - 累减还原 - 预测序列。为什么在赛题中同样备受青睐对数据量要求极低理论上只需要4个以上的数据点就能建立GM(1,1)模型。这对于很多数据收集困难或历史数据短暂的赛题场景如预测某种新兴产品的销量是巨大的优势。不要求典型的概率分布不同于许多统计方法要求数据服从正态分布等灰色模型对数据的分布没有严格要求。擅长处理趋势性数据对于具有单调增长或衰减趋势的数据GM(1,1)模型往往能取得不错的短期预测效果。模型简洁最终的预测公式是一个指数函数形式计算和实现都非常简单。两者的本质区别与应用场景选择你可以这样理解最小二乘拟合是在“数据噪声”中寻找“确定的函数信号”而灰色预测是在“杂乱的信息”中挖掘“潜在的规律趋势”。在选择时可以遵循以下经验如果你的数据量相对充足比如超过20个点且通过散点图能清晰判断其可能符合某种函数形式线性、指数等优先使用最小二乘拟合。它的数理基础更坚实解释性更好。如果你的数据量很少比如只有5-10个点且数据表现出一定的增长或衰减趋势但说不清具体是什么函数灰色预测GM(1,1)模型往往是更稳妥的起点。在实际竞赛或工作中将两者结合对比是很好的策略。分别用两种方法建模对比它们的预测结果、拟合精度和残差。如果结果相近则预测可信度较高如果差异较大就需要深入分析数据特点或者考虑更复杂的模型如ARIMA、神经网络。3. MATLAB实战最小二乘拟合详解理论说得再多不如动手跑一遍。MATLAB为最小二乘拟合提供了极其方便的工具。我们以一个假设的赛题数据为例假设我们有某产品2019年1月到2020年6月共18个月的销售额数据单位万元存储在向量y中时间点x 1:18。3.1 数据可视化与模型选择第一步永远不是直接拟合而是看图。x 1:18; y [5.2, 5.8, 6.5, 7.1, 7.6, 8.5, 9.2, 9.8, 10.5, 11.3, 12.1, 13.0, 13.7, 14.6, 15.5, 16.4, 17.2, 18.1]; % 示例数据 figure; plot(x, y, bo-, LineWidth, 1.5, MarkerSize, 8); xlabel(时间月); ylabel(销售额万元); title(销售额历史数据趋势); grid on;观察散点图如果点大致分布在一条直线附近考虑线性拟合如果增长越来越快考虑指数或多项式拟合。本例数据看起来接近线性增长。3.2 线性拟合实战使用polyfit函数进行多项式拟合。线性即一次多项式。% 1. 线性拟合 (一次多项式) p1 polyfit(x, y, 1); % p1是一个包含两个元素的向量 [a, b]对应 y a*x b y_fit1 polyval(p1, x); % 计算拟合值 % 绘制拟合结果 figure; plot(x, y, bo, MarkerSize, 8); hold on; plot(x, y_fit1, r-, LineWidth, 2); legend(原始数据, 线性拟合, Location, northwest); xlabel(时间月); ylabel(销售额万元); title(线性最小二乘拟合); grid on; % 显示拟合方程 disp([线性拟合方程: y , num2str(p1(1)), * x , num2str(p1(2))]); % 计算拟合优度 R² SS_res sum((y - y_fit1).^2); % 残差平方和 SS_tot sum((y - mean(y)).^2); % 总平方和 R2_linear 1 - SS_res / SS_tot; disp([线性拟合 R² , num2str(R2_linear)]);polyfit的第三个参数1代表拟合多项式的次数。polyval用于计算多项式在指定点的值。R²越接近1说明拟合效果越好。3.3 多项式与非线性拟合进阶如果线性拟合R²不高或者数据有明显弯曲可以尝试更高次多项式或非线性模型。二次多项式拟合p2 polyfit(x, y, 2); y_fit2 polyval(p2, x); % ... 类似地计算R²并绘图比较指数拟合通过线性化对于模型y a * exp(b*x)两边取自然对数ln(y) ln(a) b*x。这就变成了对(x, ln(y))的线性拟合。log_y log(y); p_exp polyfit(x, log_y, 1); % 对ln(y)做线性拟合 b p_exp(1); a exp(p_exp(2)); % 注意p_exp(2)是 ln(a) y_fit_exp a * exp(b * x); disp([指数拟合方程: y , num2str(a), * exp(, num2str(b), * x)]);使用Curve Fitting Toolbox进行更灵活的拟合如果你的MATLAB安装了Curve Fitting Toolbox可以使用fit函数和fittype指定任意形式的模型并进行可视化评估。% 例如拟合一个自定义的指数模型 ft fittype(a*exp(b*x)); [fitresult, gof] fit(x, y, ft, StartPoint, [1, 0.1]); % 需要列向量并提供参数初始值 disp(fitresult); disp(gof); % 查看拟合优度指标 figure; plot(fitresult, x, y); % 一键生成带拟合曲线和残差图的专业图形 legend(数据, 拟合曲线);3.4 预测与注意事项拟合完成后使用polyval或fitresult函数进行预测。% 预测未来3个月x19,20,21的销售额 x_future 19:21; y_linear_future polyval(p1, x_future); y_exp_future a * exp(b * x_future); disp(线性模型预测未来3个月销售额); disp(y_linear_future); disp(指数模型预测未来3个月销售额); disp(y_exp_future);关键注意事项过拟合陷阱不要盲目追求高阶多项式。一个n次多项式可以完美穿过n1个点R²1但这意味着模型记住了所有噪声失去了泛化预测能力。通常多项式次数不超过3或4。外推风险任何模型的外推预测都需要谨慎。特别是指数模型长期外推可能会产生不切实际的巨大数值。务必在论文中说明预测的局限性。残差分析一个好的拟合其残差观测值-拟合值应该是随机分布的不应有任何明显的模式。绘制残差图是必要的诊断步骤。residuals y - y_fit1; figure; plot(x, residuals, s-); xlabel(时间); ylabel(残差); title(线性拟合残差图); hold on; plot([min(x), max(x)], [0,0], k--); % 绘制y0参考线 grid on;如果残差图呈现明显的曲线或漏斗形状说明当前模型可能不合适。4. MATLAB实战灰色预测GM(1,1)模型详解灰色预测的MATLAB实现需要我们自己编写核心算法。下面我将一步步拆解并提供一个完整、健壮的GM(1,1)函数。4.1 GM(1,1)模型的数学步骤与代码实现假设我们有原始非负序列X0 [x0(1), x0(2), ..., x0(n)]。步骤1一次累加生成1-AGO目的是弱化随机性凸显趋势。X1(k) sum_{i1}^{k} X0(i), 其中 k1,2,...,n。function X1 AGO(X0) X1 cumsum(X0); % cumsum是MATLAB的累加函数 end步骤2构造数据矩阵B与常数向量Y基于累加序列X1建立近似的灰微分方程dX1/dt aX1 u。 其中a是发展系数u是灰色作用量。通过最小二乘法求解[a, u]。 数据矩阵B和向量Y的构造如下B [ -Z(2), 1; -Z(3), 1; ...; -Z(n), 1]Y [ X0(2); X0(3); ...; X0(n) ]其中Z是X1的紧邻均值生成序列Z(k) 0.5 * (X1(k) X1(k-1)), k2,3,...,n。n length(X0); X1 cumsum(X0); Z zeros(1, n-1); for i2:n Z(i-1) 0.5 * (X1(i) X1(i-1)); end B [-Z; ones(1, n-1)]; % 转置使其成为列向量构成的矩阵 Y X0(2:end);步骤3求解参数a和u使用最小二乘法公式P [a; u] (B * B) \ (B * Y)。P (B * B) \ (B * Y); % 或者使用 P B \ Y; (MATLAB的左除运算符) a P(1); u P(2);步骤4建立时间响应式预测模型求解灰微分方程得到累加序列的预测公式X1_hat(k1) (X0(1) - u/a) * exp(-a*k) u/a, 其中 k0,1,2,...% 计算累加序列的拟合值 X1_hat zeros(1, n); X1_hat(1) X0(1); % 第一个点相同 for k1:n-1 X1_hat(k1) (X0(1) - u/a) * exp(-a*k) u/a; end步骤5累减还原得到原始序列的拟合和预测值X0_hat(1) X0(1)X0_hat(k1) X1_hat(k1) - X1_hat(k), 其中 k1,2,...X0_hat zeros(1, n); X0_hat(1) X0(1); for k1:n-1 X0_hat(k1) X1_hat(k1) - X1_hat(k); end步骤6预测未来要预测未来第m个点相对于原始序列长度使用时间响应式先预测累加值再累减。function X0_pred GM11_Forecast(X0, m) % X0: 原始序列 % m: 要预测的未来点数 % 返回: [原始序列拟合值 未来预测值] % ... 此处省略前面计算a, u, X0_hat的代码 ... % 预测未来 n length(X0); X1_pred zeros(1, nm); X0_pred zeros(1, nm); X0_pred(1:n) X0_hat; % 前n个是拟合值 for k0:nm-1 X1_pred(k1) (X0(1) - u/a) * exp(-a*k) u/a; end for k1:nm-1 X0_pred(k1) X1_pred(k1) - X1_pred(k); end X0_pred X0_pred(n1:end); % 只返回未来的预测值拟合值已在前面的变量中 end4.2 完整函数封装与精度检验一个完整的、带有精度检验的GM(1,1)函数应该如下所示function [X0_hat, future_pred, a, u, C, P] GM11(X0, predict_num) % GM(1,1)灰色预测模型 % 输入 % X0: 原始数据序列 (行向量或列向量) % predict_num: 需要预测的未来数据点数 % 输出 % X0_hat: 原始序列的拟合值 % future_pred: 未来预测值 % a: 发展系数 % u: 灰色作用量 % C: 后验差比 % P: 小误差概率 % 1. 数据预处理 X0 X0(:); % 转为行向量 n length(X0); % 2. 累加生成 X1 cumsum(X0); % 3. 构造数据矩阵B和Y Z (X1(1:end-1) X1(2:end)) / 2; B [-Z; ones(1, n-1)]; Y X0(2:end); % 4. 求解参数 P (B * B) \ (B * Y); a P(1); u P(2); % 5. 时间响应式及拟合 X1_hat zeros(1, n); X1_hat(1) X0(1); for k 1:n-1 X1_hat(k1) (X0(1) - u/a) * exp(-a*k) u/a; end X0_hat zeros(1, n); X0_hat(1) X0(1); for k 1:n-1 X0_hat(k1) X1_hat(k1) - X1_hat(k); end % 6. 预测未来 total_len n predict_num; X1_pred_all zeros(1, total_len); for k 0:total_len-1 X1_pred_all(k1) (X0(1) - u/a) * exp(-a*k) u/a; end X0_pred_all zeros(1, total_len); X0_pred_all(1) X0(1); for k 1:total_len-1 X0_pred_all(k1) X1_pred_all(k1) - X1_pred_all(k); end future_pred X0_pred_all(n1:end); % 7. 精度检验后验差检验 % 计算残差 epsilon X0 - X0_hat; % 计算原始序列标准差 S1 std(X0); % 计算残差标准差 S2 std(epsilon); % 后验差比 C S2 / S1; % 小误差概率 mean_epsilon mean(epsilon); delta abs(epsilon - mean_epsilon); P sum(delta 0.6745 * S1) / n; % 8. 输出精度等级 disp([发展系数 a , num2str(a)]); disp([灰色作用量 u , num2str(u)]); disp([后验差比 C , num2str(C)]); disp([小误差概率 P , num2str(P)]); if P 0.95 C 0.35 disp(精度等级好 (Good)); elseif P 0.80 C 0.50 disp(精度等级合格 (Qualified)); elseif P 0.70 C 0.65 disp(精度等级勉强合格 (Just Qualified)); else disp(精度等级不合格 (Unqualified)); end end4.3 模型使用示例与解读% 示例使用上面的函数 X0 [5.2, 5.8, 6.5, 7.1, 7.6, 8.5, 9.2, 9.8, 10.5, 11.3, 12.1, 13.0, 13.7, 14.6, 15.5, 16.4, 17.2, 18.1]; predict_num 3; [X0_hat, future_pred, a, u, C, P] GM11(X0, predict_num); % 绘图对比 figure; t_hist 1:length(X0); t_pred length(X0)1 : length(X0)predict_num; plot(t_hist, X0, bo-, LineWidth, 1.5, MarkerSize, 8, DisplayName, 原始数据); hold on; plot(t_hist, X0_hat, rs--, LineWidth, 1.5, MarkerSize, 6, DisplayName, GM(1,1)拟合); plot(t_pred, future_pred, g^:, LineWidth, 2, MarkerSize, 10, DisplayName, GM(1,1)预测); xlabel(时间序列); ylabel(数值); title(GM(1,1)灰色预测模型); legend(Location, best); grid on; disp([未来, num2str(predict_num), 个点的预测值为]); disp(future_pred);运行后控制台会输出参数a,u以及精度指标C和P。根据P和C的值对照精度等级表可以判断模型对本数据的适用性。发展系数a是关键通常当-a 0.3时GM(1,1)模型可用于中长期预测当0.3 -a 0.5时适用于短期预测当-a 0.5时模型一般不适用需考虑其他模型或对原始数据进行处理。5. 综合对比与模型选择策略在实际应用或竞赛中我们很少只用一个模型。将最小二乘拟合尝试多种函数形式与灰色预测的结果进行对比分析是提升论文说服力和预测可靠性的关键。5.1 结果对比分析表我们可以将不同模型的拟合优度、预测结果和特点整理成表格便于在论文中呈现。模型拟合方程 (示例)拟合优度 R² / 后验差比 C未来3期预测值核心特点与适用条件线性最小二乘y 0.76x 4.6R² 0.998[19.0, 19.8, 20.5]假设线性趋势外推稳定要求数据呈线性关系。二次多项式y -0.002x² 0.78x 4.5R² 0.998[19.0, 19.7, 20.4]可捕捉轻微弯曲高阶易过拟合外推可能失真。指数拟合y 5.0 * exp(0.045x)R² 0.997[19.3, 20.2, 21.1]假设恒定增长率长期外推会急剧膨胀适用于增长加速初期。GM(1,1)灰色预测X1(k1)...C0.04, P1.0[19.1, 20.0, 20.9]小样本优势对指数趋势敏感适合单调序列的短期预测。从上表可以直观看出对于这组示例数据几种模型的拟合效果都很好R²高C值小P值大。短期预测结果相近这增加了预测的可信度。长期来看指数模型和灰色模型的预测值会逐渐拉开与线性模型的差距这就需要结合业务背景判断哪种趋势更合理。5.2 模型选择的决策流程面对一组时间序列数据我通常遵循以下流程来选择或组合模型数据可视化与初步判断绘制时序图。观察数据是平稳、线性增长/下降、指数增长/下降还是有周期性、季节性波动数据量有多少稳定性检验可选但推荐计算序列的均值、方差是否随时间变化。如果变化很大直接使用线性或指数拟合可能有问题需要考虑差分或对数变换。尝试基线模型数据量少n10且趋势单调优先尝试GM(1,1)。计算其发展系数a和精度等级。如果合格可作为主要模型。数据量适中n10且趋势明显尝试线性拟合和指数拟合。比较R²和残差图。选择R²高、残差随机分布的模型。数据有波动尝试二次或三次多项式但要警惕过拟合。或者考虑将数据拆分为趋势项和周期项分别处理。模型评估与对比拟合期内计算均方误差MSE、平均绝对百分比误差MAPE等指标对比不同模型。如果可能将最后1-2个历史数据留作“验证集”不参与建模用模型预测这几个点并与真实值比较评估模型的预测能力。残差分析与模型改进分析最优模型的残差序列。如果残差不是白噪声存在自相关或趋势说明模型未完全提取信息可考虑对残差序列再次建模如建立AR模型形成组合模型。对于GM(1,1)如果精度不合格可以尝试对原始数据做平移变换所有数据加上一个常数c使序列更平滑、对数变换或使用GM(1,1)的改进模型如离散GM(1,1)DGM或分数阶GM(1,1)。预测与报告采用效果最好的1-2个模型进行预测。在报告中不仅要给出预测值还要给出预测区间对于统计模型或说明模型的适用条件与局限性特别是对于灰色模型。对于竞赛可以展示多种方法的结果并讨论其一致性。如果不一致分析可能的原因。5.3 在数学建模竞赛中的实战技巧结合APMCM等赛题特点分享几点心得图文并茂论文中一定要有时序图、拟合对比图、残差图。一张清晰的图胜过千言万语。表格总结像上面那样用表格对比不同模型的结果和指标显得专业且有条理。代码附录将核心的MATLAB代码如封装好的GM11函数、拟合与预测代码整理好放在附录增加论文的可靠性和可重复性。灵敏度分析这是加分项。例如对于灰色预测可以分析初始值X0(1)的变化对预测结果的影响对于最小二乘可以分析增加/减少一个数据点对模型参数的影响。这展示了你对模型鲁棒性的思考。结合背景不要只做数学推导。将预测结果与题目背景结合。例如预测的是销量那么可以讨论“根据我们的线性模型下季度销售额预计达到XX建议采购部门提前准备YY库存”。让模型落地。承认不确定性没有模型是完美的。在结论部分务必指出预测的假设和可能的风险。例如“我们的预测基于历史趋势不变的假设如果市场发生重大政策变化预测可能需要调整。”6. 常见问题与排查技巧实录在实际操作中你一定会遇到各种报错和不如预期的结果。这里记录了一些典型问题及解决方法。6.1 最小二乘拟合常见问题问题1polyfit拟合高阶多项式时出现警告“多项式未正确条件化”或系数出现NaN/Inf。原因当多项式次数过高或x值范围很大时构造的范德蒙德矩阵可能病态导致最小二乘求解数值不稳定。解决中心化并缩放x数据x_scaled (x - mean(x)) / std(x);然后用polyfit拟合x_scaled和y。预测时也需要先将新x值进行同样的缩放。使用fit函数并指定Normalize, on选项。根本方法是降低多项式次数或使用样条拟合等更稳定的方法。问题2指数拟合y a*exp(b*x)时y值有零或负数取对数时报错。原因log(y)要求y0。解决如果数据接近零或为负是由于测量误差或波动可以考虑将所有y值加上一个足够大的正常数c使yc 0拟合log(yc)。但需注意这改变了模型形式解释结果时要小心。使用非线性最小二乘直接拟合不经过线性化。例如用fit函数fit(x, y, exp1)。这种方法对初始值敏感需要合理设置StartPoint。问题3拟合优度R²很高但预测新数据误差很大。原因典型的过拟合。模型过分迎合了历史数据中的噪声。解决绘制拟合曲线和原始数据图观察曲线是否“抖动”得厉害。使用交叉验证。将数据分为训练集和验证集用训练集拟合用验证集评估预测误差。优先选择形式简单的模型如线性 vs 高阶多项式。奥卡姆剃刀原理如无必要勿增实体。6.2 灰色预测GM(1,1)常见问题问题1精度检验不合格P值小C值大。原因原始数据序列可能不适合标准的GM(1,1)模型。可能数据波动太大或者不是单调序列。解决数据变换尝试对原始序列X0进行平移变换Y0 X0 c其中c是一个常数使得新序列Y0的所有值都为正且更平滑。用Y0建模预测结果再减去c。常数c可以通过试错法选择目标是使新序列的级比sigma(k)Y0(k-1)/Y0(k)落在可容覆盖区间(exp(-2/(n1)), exp(2/(n1)))内。残差修正如果原始模型拟合序列X0_hat与X0的残差序列epsilon有规律可以对epsilon建立另一个GM(1,1)模型来修正预测。这就是残差GM(1,1)模型。考虑其他灰色模型如针对近似非单调摆动序列的GM(2,1)模型或离散灰色模型DGM(1,1)。问题2预测结果出现负值但实际数据应为正如销量。原因GM(1,1)的时间响应式是指数形式理论上不会从正变负。出现负值通常发生在累减还原步骤由于计算舍入误差导致尤其是在发展系数a的绝对值较大、预测步长较长时。解决检查代码中累减还原的公式是否正确X0_hat(k1) X1_hat(k1) - X1_hat(k)。如果预测值只是微小的负数如-0.001可以视为计算误差直接置零。如果预测值显著为负说明模型已不适用不应使用该模型进行如此长期的预测。应缩短预测期或更换模型。问题3MATLAB报错“矩阵接近奇异或缩放错误”。原因在求解参数P (B*B) \ (B*Y)时矩阵(B*B)的行列式接近于零不可逆。这通常是因为数据序列X0变化太小例如几乎为常数导致B矩阵的两列线性相关。解决检查数据。如果数据几乎不变预测意义不大可以直接用均值作为预测值。在计算中增加一个微小的正则化项使用岭回归思想P (B*B lambda*eye(2)) \ (B*Y)其中lambda是一个很小的正数如1e-6eye(2)是2x2单位矩阵。这可以稳定数值解。6.3 MATLAB通用技巧与调试技巧1如何快速比较多个模型的拟合效果使用subplot在一个图形窗口中绘制多个子图。figure; subplot(2,2,1); plot(x, y, bo, x, y_fit_linear, r-); title(线性拟合); legend(数据,拟合); subplot(2,2,2); plot(x, y, bo, x, y_fit_poly2, g-); title(二次多项式拟合); legend(数据,拟合); subplot(2,2,3); plot(x, y, bo, x, y_fit_exp, m-); title(指数拟合); legend(数据,拟合); subplot(2,2,4); plot(t_hist, X0, bo, t_hist, X0_hat, cd--); title(GM(1,1)拟合); legend(数据,拟合);技巧2如何计算更多评估指标除了R²和灰色后验差常用的还有均方误差 (MSE):mean((y - y_fit).^2)平均绝对误差 (MAE):mean(abs(y - y_fit))平均绝对百分比误差 (MAPE):mean(abs((y - y_fit) ./ y)) * 100注意y不能为0在论文中提供多个评估指标可以使分析更全面。技巧3代码调试——确保向量维度一致MATLAB中很多错误源于矩阵维度不匹配。在编写拟合和预测代码时养成使用size()或length()函数检查变量维度的习惯。特别是在使用plot绘图时确保x和y的长度相同。在矩阵运算(B*B) \ (B*Y)中确保B是(n-1) x 2矩阵Y是(n-1) x 1列向量。最后无论是竞赛还是实际工作理解模型的假设和局限性比单纯调包跑出结果更重要。最小二乘拟合假设了函数形式和误差分布灰色预测则适用于具有指数趋势的贫信息系统。当你清晰地知道手中的工具适用于什么材料、在什么情况下可能会失灵时你才真正掌握了它。希望这篇基于一道经典赛题展开的长文能帮你不仅学会如何在MATLAB中实现这两个预测模型更能建立起一套面对数据选择模型、评估模型、改进模型的完整思维框架。
返回列表