1. 项目概述:回归分析与残差图在MATLAB中的实战应用
最近在整理资料,发现很多同学在准备数学建模竞赛或者处理数据分析项目时,对回归分析的理解还停留在“调用一个函数,得到一个方程”的层面。特别是当面试官问到“如何评估你的模型好坏?”或者“残差图能告诉你什么?”这类问题时,往往只能给出教科书式的答案,缺乏实战层面的深度解读。这就像你只学会了开车,却不懂怎么看仪表盘和听发动机的声音来判断车况。回归分析的核心价值,恰恰在于模型建立之后的诊断与优化,而残差图就是那个最直观、最强大的“诊断仪表盘”。
这个内容,就是为你解决这个问题而准备的。无论你是正在备战数学建模竞赛的学生,还是需要处理实际数据问题的工程师、分析师,甚至是准备技术面试(比如Handler岗位常问的数据处理能力)的求职者,都能从中获得直接的帮助。我们将以MATLAB这个在科研和工程领域广泛使用的工具为载体,不仅手把手教你如何实现线性回归、多项式回归等常见模型,更会深入剖析每一步背后的统计原理,并重点讲解如何绘制、解读各类残差图,从而真正理解模型的局限、发现数据的秘密,并据此优化你的分析结果。这不仅仅是代码的堆砌,更是一套完整的数据建模思维和问题排查的方法论。
2. 回归分析的核心思路与MATLAB工具箱选型
2.1 回归分析的本质:从“拟合”到“解释”
很多人把回归分析简单地等同于“找一条线去拟合数据点”。这个理解没错,但太浅了。回归分析的深层目标,是量化一个或多个自变量(X)与因变量(Y)之间的关系,并利用这种关系进行预测或解释。关键在于“量化”和“解释”。我们不仅要得到Y = b0 + b1*X1 + ... 这样的方程,更要关心每个系数b1是否显著不为零(说明X1真的对Y有影响)、整个模型能在多大程度上解释Y的波动(R²)、以及我们的预测有多大的不确定性(置信区间)。
在MATLAB中,实现回归的途径有很多,新手容易挑花眼。这里我基于多年的使用经验,给你梳理一下核心选择:
- 基础拟合工具:
fitlm函数。这是进行线性回归的“瑞士军刀”,也是我最为推荐的起点。它的语法清晰,输出信息全面,特别是能直接生成包含系数估计、标准误、t统计量、p值等完整信息的表格,对于模型诊断至关重要。 - 快捷可视化工具:
plot和scatter配合基础拟合。对于快速查看数据趋势和简单线性关系,可以先画散点图,然后使用图形窗口的“工具”->“基本拟合”选项。但这仅限于探索,无法进行深入的统计推断。 - 曲线拟合工具箱:
cftool。这是一个交互式图形界面工具,非常适合尝试多种模型(线性、指数、多项式、自定义等)并直观比较拟合效果。它的优势在于交互体验好,劣势在于自动化程度低,且不便于将流程脚本化。 - 机器学习回归器:
fitrlinear,fitrtree等。这些属于Statistics and Machine Learning Toolbox中的函数,适用于更复杂的、非线性的或者高维的回归问题,如Lasso回归、决策树回归等。但对于经典的线性回归问题,fitlm通常更直接。
对于绝大多数数学建模和数据分析面试场景,掌握fitlm的深度应用就足以应对90%的问题。它能处理的不仅仅是简单线性回归,还包括多元线性回归、交互项、分类变量(通过虚拟变量)等。因此,本项目的核心将围绕fitlm展开。
注意:使用
fitlm前,请确保你的MATLAB安装了Statistics and Machine Learning Toolbox。可以通过ver命令查看已安装的工具箱列表。
2.2 模型设定与公式语法:准确表达你的假设
在调用fitlm之前,你必须明确你的模型公式。这是很多新手栽跟头的地方。MATLAB使用了Wilkinson符号来表示公式,非常灵活但也需要适应。
假设我们有一个因变量y,和三个自变量x1,x2,x3。
- 完整模型(包含所有自变量和截距项):
mdl = fitlm(tbl, ‘y ~ x1 + x2 + x3’)。这里的tbl是一个包含这些变量的表(table)类型数据。~可以理解为“由...解释”。 - 无截距模型:
mdl = fitlm(tbl, ‘y ~ x1 + x2 + x3 - 1’)。公式末尾的-1表示移除截距项。除非你有极强的理论依据(例如当x全为0时y必须为0),否则通常建议保留截距项。 - 包含交互作用:
mdl = fitlm(tbl, ‘y ~ x1 + x2 + x1:x2’)或更简洁的mdl = fitlm(tbl, ‘y ~ x1*x2’)。x1:x2表示两者的交互项,x1*x2等价于x1 + x2 + x1:x2,即同时包含主效应和交互效应。 - 多项式项:
mdl = fitlm(tbl, ‘y ~ x1 + x1^2’)。但注意,这会将x1^2视为一个独立的新变量。更好的做法是先用x1_sq = x1.^2;生成新变量,然后放入公式,这样更清晰。
为什么公式设定如此重要?因为它直接对应了你的研究假设。面试中,面试官可能会给你一个数据集,问“你会如何建立模型来探究A和B对C的影响?” 这时,你不仅需要说出要用回归,更要能清晰地描述你的模型公式,例如:“我首先会建立一个包含A和B主效应的线性模型C ~ A + B,然后为了检验它们是否存在协同效应,我会加入交互项,即C ~ A*B,并通过比较两个模型的显著性来决定最终形式。” 这种回答体现了你对建模过程的掌控力。
3. 残差分析:模型诊断的灵魂与MATLAB实现
3.1 残差是什么?为什么它比R²更重要?
拟合完模型,很多人看一眼R²(决定系数)接近1,就觉得大功告成。这是一个巨大的误区。R²高只能说明模型对现有数据的拟合程度好,但无法告诉你模型是否“正确”。一个错误的模型也可能因为过拟合而得到很高的R²。
残差,定义为观测值(y)与模型预测值(ŷ)的差:e = y - ŷ。它是模型未能解释的信息的载体。残差分析的核心思想是:如果模型是完美的,那么残差应该看起来像是纯粹随机的“噪声”,不包含任何模式或规律。因此,我们通过检查残差图来验证这个假设。
常见的残差图及其诊断目的:
- 残差 vs. 拟合值图:检查残差的方差是否恒定(同方差性)。如果图形呈现漏斗形、扇形等模式,说明存在异方差性,模型假设被违反。
- 残差 vs. 自变量图:检查模型是否正确地捕捉了该自变量与因变量的关系。如果残差随该自变量呈现曲线趋势,说明可能需要加入该自变量的高次项或交互项。
- 残差的正态概率图(Q-Q图):检查残差是否服从正态分布。这对于假设检验(如系数的t检验)的可靠性至关重要。
- 残差的序列图(按观测顺序):如果数据是按时间顺序收集的,此图用于检测残差中是否存在时间相关的模式(自相关),例如周期波动。
3.2 在MATLAB中提取与计算残差
拟合模型后,所有的残差信息都存储在返回的线性模型对象mdl中。最常用的几种残差:
- 普通残差:
mdl.Residuals.Raw。就是最基础的y - ŷ。 - 标准化残差:
mdl.Residuals.Standardized。将普通残差除以其标准误的估计值。它近似服从标准正态分布(均值为0,标准差为1),在图形中更容易识别异常值(通常认为绝对值大于3的标准化残差可能是异常值)。 - 学生化残差:
mdl.Residuals.Studentized。与标准化残差类似,但在计算每个残差的标准误时,排除了该观测点自身的影响,对于检测强影响点更为有效。
在诊断时,我通常优先使用标准化残差,因为它消除了量纲的影响,使得不同模型间的残差图可以进行比较,也方便我们使用“±3”的经验法则来快速扫描异常点。
3.3 绘制专业的残差诊断图组合
MATLAB提供了非常便捷的函数plotResiduals(mdl)来绘制残差图,但它默认的图形可能不够全面。下面我分享一套自己常用的、用于生成完整诊断报告的手动绘图代码块。这套图能一次性展示多个维度的信息。
% 假设 mdl 是已经拟合好的线性模型对象 figure(‘Position‘, [100, 100, 1200, 800]) % 设置大图窗 % 1. 残差 vs. 拟合值图 subplot(2, 3, 1); plot(mdl.Fitted, mdl.Residuals.Raw, ‘bo‘); hold on; plot(xlim, [0 0], ‘r--‘, ‘LineWidth‘, 1.5); % 添加y=0参考线 xlabel(‘拟合值‘); ylabel(‘残差‘); title(‘残差 vs. 拟合值‘); grid on; % 添加局部加权散点平滑线(LOWESS)以观察趋势 [SortedFit, idx] = sort(mdl.Fitted); SortedRes = mdl.Residuals.Raw(idx); smoothedRes = smooth(SortedFit, SortedRes, 0.3, ‘loess‘); % 平滑系数0.3 plot(SortedFit, smoothedRes, ‘g-‘, ‘LineWidth‘, 2); legend(‘数据点‘, ‘零线‘, ‘趋势线‘, ‘Location‘, ‘best‘); % 2. 残差的正态概率图 (Q-Q图) subplot(2, 3, 2); probplot(‘normal‘, mdl.Residuals.Standardized); title(‘标准化残差的正态概率图‘); grid on; % 添加参考线 h = get(gca, ‘Children‘); set(h(1), ‘Marker‘, ‘.‘, ‘MarkerSize‘, 12); % 调整数据点样式 % 3. 残差的直方图 subplot(2, 3, 3); histogram(mdl.Residuals.Standardized, ‘Normalization‘, ‘pdf‘, ‘FaceColor‘, [0.2 0.6 0.8]); hold on; x = linspace(-4, 4, 100); y = normpdf(x, 0, 1); plot(x, y, ‘r-‘, ‘LineWidth‘, 2); xlabel(‘标准化残差‘); ylabel(‘概率密度‘); title(‘残差分布 vs. 标准正态分布‘); legend(‘残差分布‘, ‘标准正态分布‘); grid on; % 4. 残差 vs. 顺序图 (假设数据是按顺序采集的) subplot(2, 3, 4); plot(mdl.Residuals.Standardized, ‘bo-‘); hold on; plot(xlim, [0 0], ‘r--‘, ‘LineWidth‘, 1.5); plot(xlim, [3 3], ‘k:‘); % +3标准差线 plot(xlim, [-3 -3], ‘k:‘); % -3标准差线 xlabel(‘观测序号‘); ylabel(‘标准化残差‘); title(‘残差序列图‘); grid on; % 5. 残差 vs. 某个重要自变量 (例如第一个自变量) subplot(2, 3, 5); % 这里需要从原始数据中提取自变量X1。假设你的数据表叫tbl,自变量列名是‘X1‘。 plot(tbl.X1, mdl.Residuals.Standardized, ‘bo‘); hold on; plot(xlim, [0 0], ‘r--‘, ‘LineWidth‘, 1.5); xlabel(‘自变量 X1‘); ylabel(‘标准化残差‘); title(‘残差 vs. X1‘); grid on; % 6. 拟合值 vs. 观测值图 subplot(2, 3, 6); plot(mdl.Fitted, mdl.Response, ‘bo‘); hold on; % 绘制y=x的参考线,完美拟合的点会落在这条线上 maxVal = max([mdl.Fitted; mdl.Response]); minVal = min([mdl.Fitted; mdl.Response]); plot([minVal maxVal], [minVal maxVal], ‘r--‘, ‘LineWidth‘, 1.5); xlabel(‘模型预测值‘); ylabel(‘实际观测值‘); title(‘预测 vs. 观测‘); grid on; axis equal; % 使坐标轴比例相同,便于观察这段代码生成的是一个2x3的图形矩阵,几乎涵盖了所有关键的诊断视角。在面试中,如果你能现场解释这套图中每一幅的含义以及可能反映的模型问题,绝对会是巨大的加分项。
4. 从数据到模型:一个完整的实战案例解析
4.1 案例背景与数据准备
我们用一个模拟的案例来贯穿整个流程。假设我们研究某产品的销售额(Sales,单位:千元),它可能受到广告投入(AdBudget,单位:万元)、销售人员数量(Salesmen)和地区经济指数(EconIndex)的影响。我们收集了24个月的数据。
首先,我们在MATLAB中生成模拟数据,并引入一些真实数据中常见的特点:一点非线性关系、一点异方差和几个可能的异常点。
% 生成模拟数据 rng(2023); % 设定随机种子,确保结果可复现 n = 24; AdBudget = 10 + 5*randn(n,1); % 广告投入,正态分布 Salesmen = round(5 + 3*randn(n,1)); % 销售人员,取整 EconIndex = 100 + 15*randn(n,1); % 经济指数 % 生成销售额:包含线性部分、一个非线性项(广告的平方)、以及异方差误差 trueSales = 50 + 3.5*AdBudget + 2.1*Salesmen + 0.8*EconIndex + 0.05*(AdBudget-mean(AdBudget)).^2; % 添加异方差性:误差标准差随广告投入增大而增大 error = randn(n,1) .* (5 + 0.3*AdBudget); Sales = trueSales + error; % 故意加入两个异常点 Sales(5) = Sales(5) + 80; % 异常点1:正向极端值 Sales(17) = Sales(17) - 60; % 异常点2:负向极端值 % 将数据组合成表,这是fitlm推荐的数据格式 tbl = table(AdBudget, Salesmen, EconIndex, Sales, ‘VariableNames‘, {‘AdBudget‘, ‘Salesmen‘, ‘EconIndex‘, ‘Sales‘}); % 快速查看数据前几行和基本统计 disp(‘数据预览:‘); disp(head(tbl)); summary(tbl)4.2 初步建模与结果解读
我们首先建立一个包含所有自变量的多元线性回归模型。
% 建立多元线性回归模型 mdl_initial = fitlm(tbl, ‘Sales ~ AdBudget + Salesmen + EconIndex‘); % 显示模型摘要 disp(mdl_initial)fitlm的输出会非常详细,你需要重点关注以下几个部分:
- 模型公式:确认你的模型设定是否正确。
- 系数估计与统计检验:
Estimate: 系数值。例如AdBudget的系数为3.5,意味着在控制其他变量不变的情况下,广告投入每增加1万元,销售额平均增加3.5千元。pValue: p值。用于检验该系数是否显著不为零。通常以0.05为阈值,p值小于0.05则认为该变量有显著影响。注意:如果某个变量的p值很大(比如>0.1),并不意味着可以立即删除它。需要结合业务知识和模型诊断综合判断。tStat: t统计量,是系数估计值除以其标准误。
- 模型整体统计量:
R-squared: 决定系数,在0~1之间,越接近1说明模型解释的变异比例越高。但如前所述,要谨慎看待高R²。Adjusted R-squared: 调整R²,考虑了自变量个数的影响,用于比较不同变量数的模型。F-statistic vs. constant model: 模型整体的F检验,对应的p值若很小(<0.05),说明至少有一个自变量对因变量有显著解释力。
4.3 运行残差诊断并发现问题
现在,我们运行上一节中提供的残差图绘制代码,将mdl替换为mdl_initial。仔细分析生成的六张图:
- 残差 vs. 拟合值图:你可能会观察到残差的波动范围(垂直方向的散布)随着拟合值的增大而变宽,呈现轻微的“漏斗”形状。这提示我们可能存在异方差性,即误差项的方差并非常数。这与我们生成数据时加入的
(5 + 0.3*AdBudget)误差项是吻合的。 - 正态概率图:数据点应该大致沿着红色的参考直线分布。如果两端严重偏离直线,说明残差分布与正态分布有差异。我们的数据中由于加入了两个异常点,可能会在两端出现偏离。
- 残差序列图:观察是否有明显的趋势或周期性。我们的数据是模拟的横截面数据,理论上不应有趋势。但可以检查是否有超过±3的异常点(图中用虚线标出),很可能对应我们加入的第5和第17个观测点。
- 残差 vs. 自变量图(以AdBudget为例):这里可能揭示更严重的问题。你可能会看到残差与
AdBudget之间存在明显的U型或倒U型曲线关系。这强烈暗示,模型中对AdBudget的处理可能过于简单,仅用线性项不足以捕捉其真实影响,可能需要加入AdBudget的二次项 (AdBudget^2)。
4.4 模型优化与再诊断
基于残差图的诊断,我们决定优化模型:
- 处理非线性:为
AdBudget添加二次项。 - 处理异方差:考虑使用加权最小二乘法,或者对因变量进行变换(如对数变换)。这里我们先尝试更简单直观的添加二次项,因为异方差有时是由模型设定错误(如遗漏非线性项)引起的。
% 优化模型1:加入广告投入的二次项 tbl.AdBudget_sq = tbl.AdBudget.^2; % 创建新变量 mdl_improved = fitlm(tbl, ‘Sales ~ AdBudget + AdBudget_sq + Salesmen + EconIndex‘); % 再次查看模型摘要,关注AdBudget_sq的系数和p值 disp(‘优化模型(加入二次项)结果:‘); disp(mdl_improved) % 再次绘制残差诊断图 % ... (使用同样的绘图代码,将 mdl_initial 替换为 mdl_improved)观察新的模型摘要,AdBudget_sq的系数应该是显著的(p值很小)。再看新的残差图:
- 残差 vs. 拟合值图:漏斗形状可能会减弱。
- 残差 vs. AdBudget图:之前的曲线模式应该基本消失,残差随机分布在0线周围。
- 正态概率图:可能会有所改善,但异常点可能仍然存在。
4.5 异常值与强影响点处理
异常值会扭曲回归线,影响系数估计。我们需要识别并决定如何处理它们。除了看残差序列图,MATLAB提供了更系统的工具。
% 查找异常值(基于标准化残差) outliers = find(abs(mdl_improved.Residuals.Standardized) > 3); fprintf(‘基于标准化残差 > 3 识别的异常观测点序号:%s\n‘, mat2str(outliers)); % 查找强影响点 - 利用Cook距离 % Cook‘s Distance 衡量删除第i个观测点后,对所有系数估计值的影响程度。 cookd = mdl_improved.Diagnostics.CooksDistance; figure; plot(cookd, ‘bo-‘); xlabel(‘观测序号‘); ylabel(‘Cook‘s Distance‘); title(‘Cook‘s Distance 图‘); grid on; hold on; % 通常认为 Cook‘s Distance > 4/(n-p-1) 的点为强影响点,其中n为样本量,p为自变量数 [n, p] = size(mdl_improved.Variables); threshold = 4 / (n - p - 1); plot(xlim, [threshold threshold], ‘r--‘, ‘LineWidth‘, 1.5); legend(‘Cook距离‘, ‘建议阈值‘, ‘Location‘, ‘best‘); influential_pts = find(cookd > threshold); fprintf(‘基于Cook距离 > %.3f 识别的强影响点序号:%s\n‘, threshold, mat2str(influential_pts));处理异常/强影响点需要谨慎:
- 检查数据:首先确认这些点是否是数据录入错误。如果是,则修正。
- 业务理解:这些点是否代表了某种特殊的、合理的业务场景(如大型促销活动)?如果是,可能需要单独建模或引入哑变量。
- 稳健回归:如果异常点无法合理解释或删除,可以考虑使用稳健回归方法,如
fitlm中的‘RobustOpts‘参数。 - 删除后重拟合:作为敏感性分析,可以删除这些点后重新拟合模型,观察核心结论(如系数的符号和显著性)是否发生根本性变化。如果变化不大,说明模型是稳健的。
% 敏感性分析:删除识别出的异常点后重新拟合 tbl_clean = tbl; tbl_clean([outliers; influential_pts], :) = []; % 删除异常点和强影响点(注意去重) mdl_clean = fitlm(tbl_clean, ‘Sales ~ AdBudget + AdBudget_sq + Salesmen + EconIndex‘); disp(‘删除异常点后的模型:‘); disp(mdl_clean)比较mdl_improved和mdl_clean的系数估计、R²等。如果差异在可接受范围内,可以保留原始模型并注明存在个别异常点;如果差异显著,则需要报告清洁数据的模型结果,并说明异常点的影响。
5. 面试常见问题深度剖析与实战应答
结合“Handler面试题”这个场景,面试官考察的绝不仅仅是你会不会写MATLAB代码,而是你如何运用统计思维解决实际数据问题。以下是我总结的几个高频问题和应答思路。
5.1 问题一:“请解释一下R²和调整R²的区别,在什么情况下你会更看重调整R²?”
踩坑回答:“R²是决定系数,越大越好。调整R²是考虑了变量个数的R²。”(过于肤浅,没有体现理解深度)
高分回答: “R²衡量的是模型所能解释的因变量变异占总变异的比例。它的一个固有缺陷是,只要向模型中增加自变量,无论这个变量是否有用,R²都永远不会下降,总是会上升或保持不变。这可能导致我们倾向于选择包含更多无关变量的‘过度拟合’模型。 调整R²则引入了对自变量个数(k)和样本量(n)的惩罚。其公式是 1 - [(1-R²)(n-1)/(n-k-1)]。当增加一个对模型解释力贡献很小的变量时,调整R²可能会下降。 因此,在比较具有不同数量自变量的模型时,调整R²是比R²更可靠的指标。例如,在进行变量选择(如前向选择、后向剔除)时,或者当我需要向非技术背景的同事解释一个简洁模型并不比复杂模型差时,我会优先引用调整R²。在MATLAB的fitlm输出中,两者都会给出,我会同时关注,但以调整R²作为模型简洁性和解释力平衡的主要参考。”
5.2 问题二:“残差图显示存在异方差性,你会如何处理?”
踩坑回答:“那就用加权最小二乘法吧。”(过于武断,没有分析原因和尝试其他更简单的方案)
高分回答: “发现异方差性后,我的处理是一个阶梯式的过程: 首先,我会检查模型设定。异方差常常是因为遗漏了重要的非线性项或交互项。就像我们案例中,最初没有加入广告投入的二次项,残差图就显示了异方差和曲线模式。所以,我的第一步是绘制残差与各个自变量的关系图,寻找可能的非线性模式,并尝试在模型中添加多项式项或交互项。 其次,如果模型设定看起来合理,我会考虑对因变量进行变换。常用的有对数变换(log(y))、平方根变换(sqrt(y))等。特别是当数据是正数且范围较大时,对数变换常常能稳定方差。变换后需要重新拟合模型并检查残差图。 第三,如果变换因变量不理想或不可行(比如解释变换后的系数很困难),我会采用稳健标准误或加权最小二乘法。在MATLAB中,fitlm函数可以通过‘RobustOpts‘参数使用稳健回归(如‘ols‘默认,或‘andrews‘, ‘bisquare‘等),这能在异方差存在时,给出更可靠的系数显著性检验。加权最小二乘法则需要我对方差结构有一个先验的估计。 最后,我会向业务方说明情况。异方差不影响系数的无偏估计,但会影响标准误和假设检验。我会报告使用稳健标准误的结果,并指出这一模型局限。”
5.3 问题三:“你如何判断一个观测点是不是强影响点?除了删除,还有什么处理方法?”
踩坑回答:“看它残差大不大。大了就删掉。”(错误且危险的做法)
高分回答: “我主要依赖几个统计量综合判断:
- 标准化/学生化残差:绝对值大于3的观测点可能是异常值。
- 杠杆值:衡量一个观测点在自变量空间中的“偏远”程度。在MATLAB中可以通过
mdl.Diagnostics.Leverage获取。高杠杆点不一定残差大,但能‘撬动’回归线。 - Cook距离:这是我最看重的综合指标,它结合了残差大小和杠杆值,量化了删除该点对全部系数估计的整体影响。通常认为 Cook‘s Distance > 4/(n-k-1) 的点需要重点关注,
n是样本数,k是变量数。 对于识别出的强影响点,删除并非首选。我的处理流程是:核实-理解-分析-决策。
- 核实:首先检查是否为数据错误。
- 理解:从业务角度理解这个点为何特殊。它可能代表了一个重要的细分市场或极端事件。
- 分析:进行敏感性分析。拟合包含和不包含该点的两个模型,比较核心结论的稳定性。如果结论不变,可以保留并在报告中注明。
- 决策:如果该点确实扭曲了分析且无法合理解释,可以考虑删除。或者,使用稳健回归方法,如MATLAB的
fitlm设置‘RobustOpts‘, ‘on‘,这些方法对异常点不那么敏感。另一种高级做法是引入哑变量,为这个特殊的观测点单独分配一个系数,这相当于允许模型为它‘开小灶’,而不影响其他数据的拟合。”
5.4 问题四:“给你一组新数据,如何用MATLAB快速部署训练好的回归模型进行预测?”
实操性回答: “在MATLAB中,一旦我们有了训练好的线性模型对象mdl,预测就非常简便。主要使用predict函数。 假设我有新数据new_tbl,其变量名和类型与训练数据tbl一致。
% 进行点预测 [y_pred, y_pred_ci] = predict(mdl, new_tbl); % y_pred 是预测值向量 % y_pred_ci 是预测值的95%置信区间,是一个Nx2的矩阵 % 如果想得到单个新观测值的预测,可以构造一个单行表 new_obs = table(15, 8, 110, ‘VariableNames‘, {‘AdBudget‘, ‘Salesmen‘, ‘EconIndex‘}); [y_single_pred, y_single_ci] = predict(mdl, new_obs); % 对于需要批量自动化预测的场景,可以将模型保存下来 save(‘trained_regression_model.mat‘, ‘mdl‘); % 在部署环境中加载模型 loadedModel = load(‘trained_regression_model.mat‘); y_pred_deploy = predict(loadedModel.mdl, new_data);这里的关键是确保新数据的格式(表变量名和类型)与训练时完全一致。predict函数会自动处理模型中的公式,包括我们添加的二次项。此外,获取置信区间y_pred_ci对于评估预测的不确定性至关重要,在向业务方汇报时,提供‘预测值大约在X到Y之间’比只给一个点估计更有价值。”
通过将MATLAB的实操技能与背后的统计原理、问题诊断思路以及业务场景结合,你就能在数学建模竞赛或技术面试中,展现出远超普通代码操作员的深度和解决问题的能力。回归分析的真谛不在于得到一个漂亮的方程,而在于通过残差等工具,与数据持续对话,不断质疑和优化你的模型,使其更贴近现实世界的复杂规律。