- 数据预处理:
根据题目,我们得知,该数据为房价关于住房面积,卧室数量的相关数据,共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