- 數據預處理:
根據題目,我們得知,該數據爲房價關於住房面積,臥室數量的相關數據,共47組數據,我們可以觀測到住房面積接近等於臥室數量的1000倍左右,所以我們需要對數據進行標準化。
首先,我們作圖如下:
上圖爲標準化之前的數據,如上圖,我們可以看到,住房面積的範圍在1000~5000之間。
而房間數量在1~5之間,所以,我們採用以下方式對數據進行標準化。
即假設正態分佈,對每一個數據減去對應的均值除以標準差。
我們得到標準化之後的結果。
- 我們首先設置學習率爲0.05,迭代次數爲1000;
初始化theta(一個1x3的行向量)的值爲0。優化代碼如下:
通過循環迭代,我們發現,當迭代次數達到200時,函數就已經收斂,作圖如下:
曲線表示損失函數的值隨着迭代次數的變化趨勢,完成200次迭代之後,曲線已經收斂。
計算出的theta值如下:
- 根據迭代求得的theta值得到房價關於標準化後的數值的函數關係式,做出圖像如下:
可以看到,根據theta值得到一個平面如上圖所示,z軸代表了房價的高低。
添加訓練集數據點:
我們可以看出,訓練集數據點均勻的分佈在求得的線性切平面的兩側。
- 根據線性迴歸得到的函數,進行預測;
我們將預測值的x轉化爲一個行向量t = [1,1650,3];進行標準化並繪製
輸出預測結果爲 2.9308e+05
作圖如下:
其中,紅色點爲預測點,藍色點爲訓練集中的點,平面爲用於預測的函數切平面。
- 通過標準方程(正規方程)求解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