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

发布了221 篇原创文章 · 获赞 77 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/IT_flying625/article/details/105317216
今日推荐