最小二乘法线性拟合:从代数推导到MATLAB工具箱实战

发布时间:2026/7/15 2:22:44
最小二乘法线性拟合:从代数推导到MATLAB工具箱实战 1. 最小二乘法原理与代数推导最小二乘法的核心思想是通过最小化误差平方和来寻找数据的最佳函数匹配。假设我们有一组观测数据点$(x_i,y_i)$其中$i1,2,...,n$想要找到一条直线$y kx b$来拟合这些数据。误差平方和函数定义为 $$ S \sum_{i1}^{n}(y_i - kx_i - b)^2 $$为了找到使$S$最小的$k$和$b$我们需要对$k$和$b$分别求偏导并令其为零$$ \frac{\partial S}{\partial k} -2\sum_{i1}^{n}x_i(y_i - kx_i - b) 0 \ \frac{\partial S}{\partial b} -2\sum_{i1}^{n}(y_i - kx_i - b) 0 $$整理后得到正规方程组$$ k\sum x_i^2 b\sum x_i \sum x_i y_i \ k\sum x_i b n \sum y_i $$解这个方程组可以得到$$ k \frac{n\sum x_i y_i - \sum x_i \sum y_i}{n\sum x_i^2 - (\sum x_i)^2} \ b \frac{\sum y_i - k\sum x_i}{n} $$这个结果给出了最小二乘拟合直线的斜率和截距的显式表达式。在实际计算时我们可以直接使用这些公式进行代数计算。2. 矩阵形式的最小二乘法对于更一般的情况我们可以用矩阵形式表示最小二乘问题。设设计矩阵$X$和观测向量$Y$为$$ X \begin{bmatrix} x_1 1 \ x_2 1 \ \vdots \vdots \ x_n 1 \end{bmatrix}, \quad Y \begin{bmatrix} y_1 \ y_2 \ \vdots \ y_n \end{bmatrix}, \quad \beta \begin{bmatrix} k \ b \end{bmatrix} $$则最小二乘问题可以表示为$$ X\beta \approx Y $$其解为$$ \beta (X^T X)^{-1} X^T Y $$这个解被称为正规方程的解。当$X^T X$可逆时这个解是唯一的。在MATLAB中我们可以直接使用矩阵运算来实现这个解。3. MATLAB基础实现方法3.1 代数方法实现根据第一节的代数公式我们可以直接编写MATLAB代码% 示例数据 x [0.1, 0.3, 0.4, 0.75, 0.9]; y [1.7805, 2.2285, 2.3941, 3.2226, 3.5697]; % 计算必要统计量 n length(x); sum_x sum(x); sum_y sum(y); sum_xy sum(x.*y); sum_x2 sum(x.^2); % 计算斜率和截距 k (n*sum_xy - sum_x*sum_y)/(n*sum_x2 - sum_x^2); b (sum_y - k*sum_x)/n; % 绘制结果 figure; plot(x, y, o); hold on; x_fit linspace(0, 1, 100); y_fit k*x_fit b; plot(x_fit, y_fit, r-); legend(原始数据, 拟合直线); title(代数方法最小二乘拟合);3.2 矩阵方法实现使用矩阵运算可以更简洁地实现最小二乘法% 同样的示例数据 x [0.1, 0.3, 0.4, 0.75, 0.9]; y [1.7805, 2.2285, 2.3941, 3.2226, 3.5697]; % 构建设计矩阵 X [x, ones(size(x))]; % 计算参数 beta (X*X)\(X*y); k beta(1); b beta(2); % 绘制结果与前面相同4. MATLAB工具箱函数应用MATLAB提供了多个用于最小二乘拟合的函数适用于不同场景。4.1 polyfit函数polyfit是最常用的多项式拟合函数对于线性拟合使用一次多项式% 使用polyfit进行线性拟合 p polyfit(x, y, 1); % 1表示一次多项式直线 k p(1); b p(2); % 计算拟合值 y_fit polyval(p, x); % 计算R平方 SS_res sum((y - y_fit).^2); SS_tot sum((y - mean(y)).^2); R2 1 - SS_res/SS_tot;polyfit还可以返回误差估计结构体[p, S] polyfit(x, y, 1); [y_fit, delta] polyval(p, x, S); % delta给出预测区间4.2 lsqcurvefit函数对于更一般的曲线拟合可以使用lsqcurvefit% 定义线性模型 linear_model (p, x) p(1)*x p(2); % 初始参数猜测 p0 [1, 1]; % 进行拟合 p lsqcurvefit(linear_model, p0, x, y); % 获取参数 k p(1); b p(2);lsqcurvefit特别适合非线性拟合但也可以用于线性情况。4.3 lsqlin函数当需要添加约束条件时lsqlin非常有用% 设计矩阵 C [x, ones(size(x))]; d y; % 无约束线性最小二乘 p lsqlin(C, d); % 带约束的例子斜率在[2,3]之间 A [1, 0; -1, 0]; % k ≤ 3 和 -k ≤ -2 → k ≥ 2 b [3; -2]; p_constrained lsqlin(C, d, A, b);5. 方法比较与选择指南5.1 不同方法对比方法优点缺点适用场景代数方法原理清晰计算简单手动实现不适合复杂问题教学演示简单问题矩阵方法简洁易于扩展到多维需要矩阵运算知识一般线性回归polyfit使用简单功能丰富仅限于多项式拟合快速实现多项式拟合lsqcurvefit灵活支持非线性拟合需要初始猜测一般曲线拟合lsqlin支持约束条件设置复杂带约束的拟合问题5.2 选择建议简单线性拟合优先使用polyfit它简单高效且自带误差估计。非线性拟合使用lsqcurvefit它支持任意形式的模型函数。带约束拟合必须使用lsqlin它可以处理各种线性约束。多维线性回归使用矩阵方法或regress函数统计工具箱。教学演示可以手动实现代数方法帮助学生理解原理。5.3 实际应用示例假设我们需要拟合温度随时间变化的数据并确保斜率变化率为正% 示例数据 time [0, 1, 2, 3, 4, 5]; temp [20.1, 20.8, 21.9, 23.2, 23.8, 24.5]; % 使用lsqlin确保斜率为正 C [time, ones(size(time))]; d temp; A [-1, 0]; % -k ≤ 0 → k ≥ 0 b 0; p lsqlin(C, d, A, b); % 绘制结果 plot(time, temp, o); hold on; plot(time, p(1)*time p(2), r-); title(带约束的温度变化拟合);6. 常见问题与解决方案6.1 数值稳定性问题当数据范围较大时直接计算可能导致数值不稳定。解决方案对数据进行标准化x_mean mean(x); x_std std(x); x_scaled (x - x_mean)/x_std;使用polyfit的中心化和缩放选项[p, S, mu] polyfit(x, y, 1); % mu包含均值和标准差6.2 异常值处理最小二乘法对异常值敏感可以尝试稳健回归Robust Regressionopts statset(RobustWgtFun,bisquare); b robustfit(x, y, bisquare, opts);手动剔除明显异常点。6.3 模型评估指标除了R平方还应考虑均方根误差RMSErmse sqrt(mean((y - y_fit).^2));残差分析residuals y - y_fit; figure; plot(residuals, o); title(残差图);6.4 高维数据拟合对于多变量线性回归% 假设有3个预测变量 X [x1, x2, x3]; Y y; % 使用反斜杠运算符 beta X\Y; % 或者使用regress需要统计工具箱 beta regress(Y, [ones(size(X,1),1), X]);7. 高级应用与扩展7.1 加权最小二乘法当不同数据点具有不同重要性时weights [1, 1, 1, 0.5, 0.5]; % 后两点权重较低 W diag(weights); beta (X*W*X)\(X*W*Y);7.2 非线性最小二乘拟合非线性模型如指数衰减model (p, x) p(1)*exp(-p(2)*x); p0 [1, 0.1]; % 初始猜测 p lsqcurvefit(model, p0, x, y);7.3 正则化最小二乘防止过拟合如岭回归lambda 0.1; % 正则化参数 n_vars size(X, 2); beta ([X; sqrt(lambda)*eye(n_vars)] \ [Y; zeros(n_vars, 1)]);8. 性能优化技巧预分配数组对于大型数据集预先分配数组空间。向量化操作避免循环使用矩阵运算。稀疏矩阵当设计矩阵稀疏时使用稀疏存储。并行计算对于大规模问题使用parfor或GPU加速。% 示例使用GPU加速 x_gpu gpuArray(x); y_gpu gpuArray(y); X_gpu [x_gpu, ones(size(x_gpu), like, x_gpu)]; beta_gpu X_gpu\y_gpu; beta gather(beta_gpu);9. 实际工程案例9.1 传感器校准假设我们需要校准一个温度传感器的输出% 已知标准温度与传感器读数 standard_temp [0, 10, 20, 30, 40]; sensor_reading [0.1, 10.5, 19.8, 30.2, 40.5]; % 进行线性校准拟合 p polyfit(sensor_reading, standard_temp, 1); % 应用校准 corrected_temp polyval(p, sensor_reading); % 评估校准效果 plot(standard_temp, sensor_reading, o); hold on; plot(standard_temp, corrected_temp, x); legend(原始读数, 校准后);9.2 趋势分析分析某产品销量随时间的变化趋势% 月度销售数据 months 1:12; sales [120, 135, 148, 160, 175, 190, 205, 220, 210, 195, 180, 165]; % 拟合线性趋势 p polyfit(months, sales, 1); trend polyval(p, months); % 绘制结果 plot(months, sales, o-); hold on; plot(months, trend, r--); title(销售趋势分析);10. 最佳实践总结数据预处理检查数据质量处理缺失值和异常值。可视化检查拟合前先绘制散点图观察数据分布。模型验证使用交叉验证等方法评估模型泛化能力。文档记录记录所有数据处理和拟合步骤确保可重复性。误差分析不仅要看拟合结果还要分析残差 patterns。% 综合示例完整分析流程 data readtable(sensor_data.csv); x data.Time; y data.Reading; % 1. 数据可视化 figure; plot(x, y, o); title(原始数据); % 2. 拟合模型 [p, S] polyfit(x, y, 1); [y_fit, delta] polyval(p, x, S); % 3. 绘制拟合结果和预测区间 figure; plot(x, y, o); hold on; plot(x, y_fit, r-); plot(x, y_fit2*delta, m--, x, y_fit-2*delta, m--); legend(数据, 拟合, 95%预测区间); % 4. 计算评估指标 residuals y - y_fit; rmse sqrt(mean(residuals.^2)); R2 1 - sum(residuals.^2)/sum((y - mean(y)).^2); % 5. 残差分析 figure; plot(residuals, o); title(残差图);