Python与MATLAB最小二乘法:代价函数与向量子空间双重视角解析

林舟
林舟
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析最小二乘法的两种核心推导路径:基于代价函数偏导数的代数解法,以及基于向量到子空间距离的几何解释。通过Python与MATLAB代码对比,验证了自定义实现与内置函数polyfit、regress在多项式拟合及多元线性回归中的一致性,展示了从理论到工程应用的完整闭环。

最小二乘法

在大多数最小二乘法的公式推导中,通常采用代价函数求偏导的方法来求解。本文将首先展示如何通过代价函数求偏导的方式推导出最小二乘公式,随后介绍李扬老师讲解的另一种视角:从向量到子空间的距离来理解最小二乘法。

代价函数与最小二乘法

假设我们的拟合结果模型为:

则对应的平方损失函数定义为:

平方损失函数的图像仅存在极小值,不存在极大值。为了使代价函数最小化,我们需要找到其极值点,即所有参数偏导数均为0的点。代价函数对各参数的偏导数如下所示:

令上述偏导数等于0,得到方程组:

实际上,若定义矩阵形式:

则可以得到闭合解:

向量到子空间的距离与最小二乘法

最小二乘法与多项式拟合

以下展示了自定义编写的最小二乘法多项式拟合与MATLAB内置函数polyfit拟合多项式的参数对比。需要注意的是,为了与MATLAB内置函数的行为保持一致,参数向量θ的顺序调整为第一个参数为θn,最后一个参数为θ0,同时X矩阵的结构也进行了相应的调整:

% 最小二乘法多项式拟合
% 原三次函数+随机噪声
f=@(x)x.^3+6.*x.^2-2.*x+4+(rand(size(x))-.5).*20;
% 构造原始数据
x=-5:.1:5;
y=f(x);
% 自己写一个最小二乘
n=3;% 最高次数为三次
X=(x').^(n:-1:0);
theta1=((X'*X)\X'*y')';
% MATLAB自带多项式拟合
theta2=polyfit(x,y,n);
% 输出对比
disp(theta1)
disp(theta2)
% 一个小技巧,下面的写法能够快速将
% 参数向量变成有关x的多项式匿名函数
func=matlabFunction(poly2sym(theta1));

theta1= 0.9686 6.0178 -1.8845 4.3362 theta2= 0.9686 6.0178 -1.8845 4.3362

多项式拟合结果绘图:

% 绘图部分
% 保持坐标区域不刷新并添加网格
ax=gca;hold(ax,'on');grid(ax,'on');
% 绘制原数据点和拟合结果
plot(x,y,'o','MarkerFaceColor',[94,142,179]./255);
plot(x,func(x),'Color',[0,64,115]./255,'LineWidth',2);
% 修饰一下
ax.FontName='cambria';
ax.LineWidth=1.5;
ax.GridLineStyle='--';
ax.XColor=[1,1,1].*.3;
ax.YColor=[1,1,1].*.3;
ax.ZColor=[1,1,1].*.3;

最小二乘法与多元线性回归

以下展示了自定义编写的最小二乘法进行多元线性回归与MATLAB内置函数 regress 进行多元线性回归的参数对比:

% 最小二乘法多元线性回归
% 原二元函数+随机噪声
f=@(x1,x2) 3.*x1+4.*x2+5+(rand(size(x1))-.5).*10;
% 构造原始数据
[x1,x2]=meshgrid(-5:.5:5,-5:.5:5);
y=f(x1,x2);
% 自己写一个最小二乘
X=[x1(:),x2(:),ones(size(x1(:)))];
theta1=((X'*X)\X'*y(:));
% MATLAB多元线性回归
theta2=regress(y(:),X);
% 输出对比
disp(theta1)
disp(theta2)
% 构造拟合结果的二元匿名函数
func=matlabFunction([sym('x1'),sym('x2'),1]*theta1);

theta1= 2.9285 4.0688 4.7520 theta2= 2.9285 4.0688 4.7520

多元线性回归结果绘图:

% 绘图部分
% 保持坐标区域不刷新并添加网格
ax=gca;hold(ax,'on');grid(ax,'on');
% 绘制原数据点和拟合结果
mesh(x1,x2,func(x1,x2),'FaceColor','flat','FaceAlpha',.8)
scatter3(x1(:),x2(:),y(:),20,'filled')
% 修饰一下
ax.FontName='cambria';
ax.LineWidth=1.5;
ax.GridLineStyle='--';
ax.XColor=[1,1,1].*.3;
ax.YColor=[1,1,1].*.3;
ax.ZColor=[1,1,1].*.3;
view(30,20)

以上就是python机器学习MATLAB最小二乘法的两种解读的详细内容,更多关于MATLAB最小二乘法解读的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表