- 線性迴歸
迴歸模型如下:
其中θ是我們需要優化的參數,x是n+1維的特徵向量,給定一個訓練集,我們的目標是找出θ的最佳值,使得目標函數J(θ)最小化:
優化方法之一是梯度下降算法。算法迭代執行,並在每次迭代中,我們更新θ遵循以下準則
其中α是學習率,通過梯度下降的方式,使得損失函數最小,求得最合適的θ值。
- 2D線性迴歸
題目是一個測量身高的例子,對象基於兩歲到八歲之間的男孩。y值是以米爲單位測量的高度,x值是對應於高度的男孩年齡。有m = 50的訓練例子,您將使用它們來開發使用梯度下降算法的線性迴歸模型,基於此,我們可以預測給定新年齡值的高度。
- 首先,加載數據集;
得到兩個50x1的列向量。
- 繪製圖像:
使用以下代碼繪製圖像:
得到結果:
而我們要做的工作就是,根據數據集,得到一個高度關於年齡的函數,能夠最大程度匹配數據集中的樣本,
- 因爲我們在設計線性迴歸算法的時候,想要把常數項合併,得到一個矩陣相乘的形式,所以我們需要將矩陣x做一些變化。
得到新的x是一個50x2的矩陣。
- 題目中給出學習率爲0.07,此處,首先設置迭代次數爲1500,根據輸出結果,發現,當迭代次數達到1000時,損失函數已經收斂,因此,修正迭代次數爲1000我們設計線性迴歸算法如下:
其中theta是需要優化的參數,step表示迭代次數,sqrerrors指代真實值和預測值之間的距離的平方,Jcost是損失函數。
- 程序運行之後,作圖如下:
1) 損失函數的值與迭代次數之間的關係
2) 根據訓練集做線性迴歸得到的函數結果:
θ=[0.7502,0.0639],即函數爲y=0.0639x+0.7502.
橫座標爲年齡,縱座標爲身高,其中兩個X號表示當年齡爲3.5 和 7歲時所預測的身高值。
- 理解梯度下降:
運行代碼如下:
繪製曲面如下:
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')