斯坦福機器學習3:線性迴歸、梯度下降和正規方程組的matlab實現

斯坦福機器學習3:線性迴歸、梯度下降和正規方程組的matlab實現



以一個最簡單的一元線性迴歸爲例,給定一個數據集,(x,y)一個x值對應一個y,假設x是面積,y是房價

一元線性迴歸就是在一個x,y座標系中迴歸出一條直線,也就是

h(x)=θ01x

h(x)是預測值,

我們定義目標函數,也就是我們要優化的函數

然後用梯度下降法來更新參數,更新的規則爲θ-α*(J(θ))’




對於一個多維的函數h(x)=θ01x12x2每一個θ對應一個x,θ0沒有x對應,所以在建立參數矩陣時需要在第一列加上一列0和θ0相乘,這樣h(x)=θ01x12x2=θTX,其中X的行是數據的數量,列是3.

所以θ1的更新時候的Xj就是X(I,j)

批梯度下降每次θ更新的時候都需要把所有的數據都計算一遍梯度,然後求和




用matlab代碼實現爲


 for i=1:m
        gra0=gra0+(thita(1)+thita(2)*x(i)-y(i))*1;
        gra1=gra1+(thita(1)+thita(2)*x(i)-y(i))*x(i)
    end
    thita(1)=thita(1)-alf*gra0
    thita(2)=thita(2)-alf*gra1

將上述代碼多循環幾遍就是一元線性迴歸,全部代碼爲


clc, clear all, close all
x=[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80,63.80,73.40];
y=[41.4,51.8,61.70,67.90,68.70,77.50,95.90,137.40,155.0,175.0];
thita=[-16,10];   %調初始點對結果影響很大
alf=0.000001;
dis=0;
m=length(y);
plot(x,y,'r*');
hold on
for re=1:100000
    gra0=0;
    gra1=0;
    for i=1:m
        gra0=gra0+(thita(1)+thita(2)*x(i)-y(i))*1;
        gra1=gra1+(thita(1)+thita(2)*x(i)-y(i))*x(i)
    end
    thita(1)=thita(1)-alf*gra0
    thita(2)=thita(2)-alf*gra1
end
for i=1:m
    dis=dis+(thita(1)+thita(2)*x(i)-y(i))^2;
end
h=thita(1)+thita(2)*x
plot(x,h,'linewidth',2);

結果如下

只需要多設置幾個參數就可以變成多元線性迴歸,也就是房價跟臥室的數量,跟面積,跟位置等多個變量有關。

多元線性迴歸的代碼如下:

thita=[0,0,0,0];
x=[10931.64 1672.00 514.83;11718.01 1757.00 566.17;12883.46 1950.00 630.73;13249.80 1959.00 748.89;14867.49 1971.00 901.24;16682.82 1970.00 1175.46;18645.03 2718.20 1246.86;20667.91 2774.20 1275.59;23623.35 2931.00 1307.53];
y=[3422 3565 3866 4134 5118 5855 6842 7196 10320];
a=0.0001;
for re=1:50
dis=0;
for i=1:9
    dis=dis+((thita(1)+thita(2)*x(i,1)+thita(3)*x(i,2)+thita(4)*x(i,3))-y(i))^2;
end
gra1=0;
gra2=0;
gra3=0;
gra4=0;
for i=1:9
    gra1=gra1+((thita(1)+thita(2)*x(i,1)+thita(3)*x(i,2)+thita(4)*x(i,3))-y(i))*1;
    gra2=gra2+((thita(1)+thita(2)*x(i,1)+thita(3)*x(i,2)+thita(4)*x(i,3))-y(i))*x(i,1);
    gra3=gra3+((thita(1)+thita(2)*x(i,1)+thita(3)*x(i,2)+thita(4)*x(i,3))-y(i))*x(i,2);
    gra4=gra4+((thita(1)+thita(2)*x(i,1)+thita(3)*x(i,2)+thita(4)*x(i,3))-y(i))*x(i,3);
end
thita(1)=thita(1)-a*gra1;
thita(2)=thita(2)-a*gra2;
thita(3)=thita(3)-a*gra3;
thita(4)=thita(4)-a*gra4

end
anti=round(thita(1)+thita(2)*(10931.64)+thita(3)*1672+thita(4)*(514.83))

可以看到如果參數再多的話程序寫出來就會越來越麻煩。所以有正規方程組法。視頻中具體推導的過程如下:

梯度等於0的點就是最優點

所以根據向量運算我們可以直接求出最優θ的值。

Matlab實現也就變得很方便,代碼如下:

x=[1 10931.64 1672.00 514.83;1 11718.01 1757.00 566.17;1 12883.46 1950.00 630.73;1 13249.80 1959.00 748.89;1 14867.49 1971.00 901.24;1 16682.82 1970.00 1175.46;1 18645.03 2718.20 1246.86;1 20667.91 2774.20 1275.59;1 23623.35 2931.00 1307.53];
y=[3422; 3565; 3866; 4134 ;5118 ;5855; 6842 ;7196 ;10320];
thita=[0;0;0;0;];
thita=inv(x'*x)*x'*y;
h=[1 16682.82 1970.00 1175.46]*thita;
format long g
h

最後三行代碼是測試了其中一行特徵向量輸入值,發現擬合出來的公式計算這一行向量的值不相等,但是很接近,說明擬合結果挺好









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