Machine Learning experiment1 Linear Regression 詳解+源代碼實現

  1. 線性迴歸

      迴歸模型如下:

其中θ是我們需要優化的參數,x是n+1維的特徵向量,給定一個訓練集,我們的目標是找出θ的最佳值,使得目標函數J(θ)最小化:

優化方法之一是梯度下降算法。算法迭代執行,並在每次迭代中,我們更新θ遵循以下準則

其中α是學習率,通過梯度下降的方式,使得損失函數最小,求得最合適的θ值。

  1. 2D線性迴歸

題目是一個測量身高的例子,對象基於兩歲到八歲之間的男孩。y值是以米爲單位測量的高度,x值是對應於高度的男孩年齡。有m = 50的訓練例子,您將使用它們來開發使用梯度下降算法的線性迴歸模型,基於此,我們可以預測給定新年齡值的高度。

  1. 首先,加載數據集;

得到兩個50x1的列向量。

  1. 繪製圖像:

使用以下代碼繪製圖像:

得到結果:

而我們要做的工作就是,根據數據集,得到一個高度關於年齡的函數,能夠最大程度匹配數據集中的樣本,

  1. 因爲我們在設計線性迴歸算法的時候,想要把常數項合併,得到一個矩陣相乘的形式,所以我們需要將矩陣x做一些變化。

得到新的x是一個50x2的矩陣。

  1. 題目中給出學習率爲0.07,此處,首先設置迭代次數爲1500,根據輸出結果,發現,當迭代次數達到1000時,損失函數已經收斂,因此,修正迭代次數爲1000我們設計線性迴歸算法如下:

          其中theta是需要優化的參數,step表示迭代次數,sqrerrors指代真實值和預測值之間的距離的平方,Jcost是損失函數。

  1. 程序運行之後,作圖如下:

1) 損失函數的值與迭代次數之間的關係

2) 根據訓練集做線性迴歸得到的函數結果:

 θ=[0.7502,0.0639],即函數爲y=0.0639x+0.7502.

                  橫座標爲年齡,縱座標爲身高,其中兩個X號表示當年齡爲3.5 和 7歲時所預測的身高值。

  1. 理解梯度下降:

運行代碼如下:

            繪製曲面如下:

MATLAB 源代碼

clc,clear
x = load ('ex1x.dat ') ;
y = load ('ex1y.dat') ;
figure % open a new figure window
plot (x , y , 'o' ) ;
ylabel ( ' Height in meters ' )
xlabel ( 'Age in years ' )
添加theta=1的那一列
m = length (y) ; % store the number of training examples
x =[ones(m,1) , x]  % Add a column of ones to x
J_vals = zeros (100 , 100) ; % initialize Jvals to
 % 100*100 matrix of 0's
theta0_vals = linspace (-3 , 3 , 100) ;
theta1_vals = linspace (-1 , 1 , 100) ;
% 對於linespace(x1,x2,N),其中x1、x2、N分別爲起始值、終止值、元素個數。
for i = 1 : length (theta0_vals)
    for j = 1 : length (theta1_vals )
	t = [theta0_vals(i); theta1_vals(j)] ;
	J_vals(i,j) = (1/m*2)*(x*t-y)'*(x*t-y);
    end
end
J_vals=J_vals'; %轉置
figure ;
surf(theta0_vals,theta1_vals,J_vals);
xlabel ('\theta_0 ');ylabel('\theta_1');
學習率0.07
learning_rate=0.07;
iteration=1500;
theta=[0,0]
for step=1:iteration
    temp=x*theta'-y;
    sqrerrors=temp.^2;
    theta=theta-learning_rate*(1/m)*(temp'*x);
    Jcost(step) = (1/2*m)*sum(sqrerrors);
    disp(step),disp(Jcost(step))
end
figure;
plot(Jcost)
title('The relation between J and iteration ');
ylabel ( 'J' )
xlabel ( 'iteration' )
legend('\alpha = 0.07')
figure
plot (x(:,2) , y , ' o ' ) ;
hold on
plot(x(:,2), x*theta', '-');
hold on
plot(3.5,[1,3.5]*theta','x','Color','r')
plot(7,[1,7]*theta','x','Color','r')
xlabel('Age in years')
ylabel('Height in meter s ')
legend('Training Data','Linear Regression','Prediction1&2')
title('Training Result')

 

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