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

  1. 數據預處理:

根據題目,我們得知,該數據爲房價關於住房面積,臥室數量的相關數據,共47組數據,我們可以觀測到住房面積接近等於臥室數量的1000倍左右,所以我們需要對數據進行標準化。

首先,我們作圖如下:

 

上圖爲標準化之前的數據,如上圖,我們可以看到,住房面積的範圍在1000~5000之間。

而房間數量在1~5之間,所以,我們採用以下方式對數據進行標準化。

即假設正態分佈,對每一個數據減去對應的均值除以標準差。

我們得到標準化之後的結果。

  1. 我們首先設置學習率爲0.05,迭代次數爲1000;

初始化theta(一個1x3的行向量)的值爲0。優化代碼如下:

通過循環迭代,我們發現,當迭代次數達到200時,函數就已經收斂,作圖如下:

曲線表示損失函數的值隨着迭代次數的變化趨勢,完成200次迭代之後,曲線已經收斂。

計算出的theta值如下:

  1. 根據迭代求得的theta值得到房價關於標準化後的數值的函數關係式,做出圖像如下:

可以看到,根據theta值得到一個平面如上圖所示,z軸代表了房價的高低。

添加訓練集數據點:

我們可以看出,訓練集數據點均勻的分佈在求得的線性切平面的兩側。

  1. 根據線性迴歸得到的函數,進行預測;

我們將預測值的x轉化爲一個行向量t = [1,1650,3];進行標準化並繪製

輸出預測結果爲   2.9308e+05

作圖如下:

  其中,紅色點爲預測點,藍色點爲訓練集中的點,平面爲用於預測的函數切平面。

  1. 通過標準方程(正規方程)求解theta值。

計算方法如下:

運行代碼如下,求出對應的theta值,θ=

我們可以看到,此處的theta值和之前計算得到的theta值並不相同。是因爲之前計算的theta值時基於標準化之後的數據計算出的參數,而通過正規方程求得的theta值是直接針對訓練集真實數據的參數,所以,預測時不需要再對需要預測的數據進行標準化,直接帶入含theta的方程即可。

求得結果如下:

Y=   2.9308e+05.

這裏我們可以發現,預測得到的y值是相同的。

繪製圖像如下:

MATLAB源代碼:

(去除行號方法參見:https://blog.csdn.net/IT_flying625/article/details/105317320

1.	梯度下降法:
1.	x=load('ex2x.dat');
2.	y=load('ex2y.dat');
3.	plot3(x(:,1),x(:,2) ,y,'o');
4.	title('Data Before Normalization')
5.	xlabel ('Living Area' ) ; ylabel ('Number Of Bedrooms');
6.	zlabel('The price of houses');
7.	grid on
8.	m=length(x)
9.	x=[ones(m,1),x];
10.	%標準化
11.	sigma=std(x);   %標準差
12.	mu=mean(x);    %求平均值
13.	x (:,2)=(x(:,2)-mu(2))./sigma(2); %減均值除以標準差
14.	x (:,3)=(x(:,3)-mu(3))./sigma(3);
15.	figure 
16.	plot3(x(:,2) , x(:,3) ,y, ' o ' ) ;
17.	title('Data After Normalization')
18.	xlabel ('Living Area' ) ; ylabel ('Number Of Bedrooms');
19.	zlabel('The price of houses');
20.	grid on
21.	learning_rate=0.05
22.	iteration=1000
23.	theta=[0,0,0]
24.	for step=1:iteration
25.	    temp=x*theta'-y;
26.	    sqrerrors=temp.^2;
27.	    theta=theta-learning_rate*(1/m)*(temp'*x);
28.	    Jcost(step) = (1/2*m)*sum(sqrerrors);
29.	    %disp(step),disp(Jcost(step))
30.	end
31.	figure;
32.	plot(Jcost)
33.	title('The relation between J and iteration ');
34.	ylabel ( 'J cost' )
35.	xlabel ( 'iteration' )
36.	legend('\alpha = 0.05')
37.	disp(theta)
38.	figure
39.	x1=linspace(-4,4,100);
40.	x2=linspace(-4,4,100);
41.	[X1,X2]=meshgrid(x1,x2);
42.	Z=theta(1)+theta(2)*X1+theta(3)*X2;
43.	p=mesh(X1,X2,Z)
44.	hold on
45.	disp(x(2))
46.	disp(x(3))
47.	p1=plot3(x(:,2),x(:,3),y,'o','Color','b')
48.	hold on
49.	t = [1,1650,3];
50.	t (:,2)=(t(:,2)-mu(2))./sigma(2); %減均值除以標準差
51.	t (:,3)=(t(:,3)-mu(3))./sigma(3);
52.	p2=plot3(t(2),t(3),t* theta','x','Color','r')
53.	disp(t*theta')
54.	xlabel ('Living Area' ) ;
55.	ylabel ('Number Of Bedrooms');
56.	zlabel('The price of houses');
57.	title('Training Result')
58.	legend([p,p1,p2],{'linear regression','data','prediction'})
2.	正規方程法:
1.	x=load('ex2x.dat');
2.	y=load('ex2y.dat');
3.	m=length(x)
4.	x=[ones(m,1),x];
5.	theta = inv(x'*x)*x'*y
6.	figure
7.	plot (x(:,2),y,'o');
8.	%plot3(x(:,2), x*theta, '-g','Linewidth',2);
9.	p1=plot3(x(:,2),x(:,3),y,'o','Color','b')
10.	hold on
11.	x2=linspace(1,5,100);
12.	x1=linspace(500,4500,100);
13.	[X1,X2]=meshgrid(x1,x2);
14.	Z=theta(1)+theta(2)*X1+theta(3)*X2;
15.	p=mesh(X1,X2,Z)
16.	t = [1,1650,3];
17.	p2=plot3(t(2),t(3),t*theta,'x','Color','r')
18.	disp(t*theta)
19.	xlabel ('Living Area' ) ;
20.	ylabel ('Number Of Bedrooms');
21.	zlabel('The price of the houses');
22.	title('Result')
23.	grid on

 

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