梯度下降法的matlab代碼,包括最小二乘法,梯度下降法的矩陣形式

包括單特徵的樣本的最小二乘法計算,
單特徵樣本的梯度下降法--代數版本
多特徵樣本的梯度下降--矩陣運算表示。
在矩陣表示的梯度下降法中運用標準差歸一化(可選擇註釋)。
有比較詳細的註釋

clear;
clc;
X=[0,1,2,3,4,5,6];
Y=[0,1.1,2.2,2.7,4.1,4.9,5.6];
%最小二乘法
XY_ = mean(X.*Y);
X_Y_ = mean(X)*mean(Y);
X2_ = mean(X.*X);
X_2 = mean(X)*mean(X);
a=(XY_-X_Y_)/(X2_-X_2);
Y_ = mean(Y);
X_ = mean(X);
b=Y_-a*X_;
%顯示,畫圖
% figure;
% scatter(X,Y);
% hold on;
% x=0:0.1:6;
% y=a*x+b;

%梯度下降法
a1 = 0;
b1 = 0;
s = 0.01;
delt = 0.01;
as = -XY_+a1*X2_+b*X_;
bs = -Y_+a1*X_+b1;
while abs(as)>delt || abs(bs)>delt
    a1 = a1-s*as;
    b1 = b1-s*bs;
    as = -XY_+a1*X2_+b*X_;
    bs = -Y_+a1*X_+b1;
end;
%顯示,畫圖
% x1=0:0.1:6;
% y1=a1*x1+b1;
% plot(x,y,'r',x1,y1,'y');

%多維特徵樣本的矩陣梯度下降法

%y代表樣本結果,它是一個m行,1列的矩陣,m代表樣本數目
y=[0;1.1;2.2;2.7;4.1;4.9;5.6];

%x_ 代表樣本訓練輸入數據,它是一個m行,n列的矩陣,m代表樣本數目,n代表特徵數目
%此時爲單特徵矩陣
x_=[0;1;2;3;4;5;6];
[m,n]=size(x_);

%在這一部分程序是對每個特徵的數據進行標準差歸一化,有助於設置步長,閾值等參數
%這樣可以統一樣本特徵數據範圍,使迭代次數加快
%那麼對於使用最後的模型時,別忘記對輸入值進行改變
% mean_x=mean(x_,1);%得到每個特徵的均值
% std_x=std(x_,1);%得到每個特徵的標準差
% mean_xx=repmat(mean_x,m,1);%擴展成矩陣
% std_xx=repmat(std_x,m,1);%擴展成矩陣
% x_=(x_-mean_xx)./std_xx;%標準差歸一化


%訓練數據增加一列特徵,爲了方便處理 截距參數
c=ones(m,1);
x=[x_ c];

%k 爲參數向量,它是一個n+1列的矩陣,n是參數數目
k=zeros(n+1,1);

%線性假設函數爲 Y=x*k
%那麼損失函數爲 f=0.5*(x*k-y)'*(x*k-y) ,'是轉置
%對損失函數對k求偏導得 partial_Derivative = x'*(x*k-y)
partial_Derivative = x'*(x*k-y);
%設置步長step,隨便設,但是過大會引起振盪,過小收斂速度太慢
step=0.001;
%設置收斂閾值 threshold
threshold = 0.01;
%獲取偏微分絕對值
partial_Derivative_abs = abs(partial_Derivative);
%梯度下降距離
while max(max(partial_Derivative_abs))>threshold 
    k = k-partial_Derivative*step;
    partial_Derivative = x'*(x*k-y);
    partial_Derivative_abs = abs(partial_Derivative);
end;

%輸出計算參數,用的都是單特徵的樣本數據

[a b]%最小二乘法直接計算
[a1 b1]%單特徵梯度下降法代數法
[k']%多特徵梯度下降法矩陣表示

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章