日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python機器學習MATLAB最小二乘法的兩種解讀_python

作者:slandarer ? 更新時間: 2022-04-15 編程語言

最小二乘法

大部分的最小二乘法公式推導,都是使用的 代價函數偏導 的方式來求得的,在這里首先展示如何通過代價函數求偏導的方式得到最小二乘公式,再展示李揚老師講解的如何由向量到子空間的距離得來最小二乘法公式。

代價函數與最小二乘法

假設我們的擬合結果為:

則平方損失函數為:

平方損失函數的形式只有極小值,沒有極大值,我們要使代價函數最小,我們要找到其極值點,即偏導均為0的點,代價函數對于各參數偏導如下:

令偏導為0得:

實際上若是令:

則有:

向量到子空間的距離與最小二乘法

最小二乘法與多項式擬合

以下展示自己編寫最小二乘法擬合多項式與MATLAB自帶函數 polyfit 擬合多項式的參數對比,注意,為了和MATLAB自帶函數保持一致,θ向量變為第一個參數為 θn??,最后一個參數為 θo? , 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)

原文鏈接:https://blog.csdn.net/slandarer/article/details/122373147

欄目分類
最近更新