山东大学机器学习实验2

在本练习中,您将使用梯度下降和正态方程来研究多元线性回归。您还将研究代价函数J(θ)、梯度下降的收敛性和学习率α之间的关系。下载ex2Data.zip,并从zip文件中提取这些文件。这是俄勒冈州波特兰市的一套房价训练集,那里的产出y(i)是价格,而产出x(i)是居住面积和卧室的数量。有m=47个培训示例。

损失函数在不同学习率下,随迭代次数增加而变化的情况:

由上图可知,当alpha很小时,损失函数收敛比较慢,需要很长时间才能到达最小值,而alpha=1时,损失函数收敛很快,所以是个不错的学习率。

而上面的一张图时alpha=3时,明显的可以看见损失函数并没有收敛。所以当alpha过大时,会造成无法收敛的情况。

问题解答:

1.若学习率太小,则会需要迭代很多次才能到达最佳,这其中的时间太漫长。若学习率太大,则会跨过最佳值,经过反复迭代可能会远离最佳值,最后不会收敛。

2.(a)由图所示,可以选择alpha=1作为最终的学习率。

(b)对面积1650和3间房做标准化,由alpha=1确定的最佳系数theta来预测房价,结果为2.9308e+5,即29.3万元。

正规方程问题解答:

  1. 求出的theta:theta0=8.9598e+4,

theta1=0.0139e+4,

theta2=-0.8738e+4.

2.对面积1650和3间房做标准化,由alpha=1确定的最佳系数theta来预测房价,结果为2.9308e+5,即29.3万元。与梯度下降得到的结果相同。

1.学习率是控制你每一次迭代后,值变化的大小。根据实验中多次选择不同的学习率,从画出的图像种可以清楚的知道:若学习率太小,则会需要迭代很多次才能到达最佳,这其中的时间太漫长。若学习率太大,则会跨过最佳值,经过反复迭代可能会远离最佳值。

2.本次实验还添加了正规方程解法,不需要迭代多次,就可以直接求出最佳系数theta。但是应该根据数据的规模选择正规方程解法和梯度下降解法,吴恩达教授指出,如果数据集规模小于一万,则应该选择正规方程解法,数据集规模大于一万,则应该选择梯度下降法。

梯度下降法:

1.数据导入

x=load('ex2x.dat');

y=load('ex2y.dat');

2.数据预处理,标准化

m=length(y);

x=[ones(m,1),x];

sigma=std(x);

mu=mean(x);

x(:,2)=(x(:,2)-mu(2))/sigma(2);

x(:,3)=(x(:,3)-mu(3))/sigma(3);

3.梯度下降

alpha=zeros(3:1);

alpha(1,1)=0.01;

alpha(2,1)=0.03;

alpha(3,1)=1;

theta0(1,1)=0;

theta1(1,1)=0;

theta2(1,1)=0;

J=zeros(50,3);

for j=1:3

for i=1:50

J(i,j)=1/(2*m)*(theta0(i,1).*x(:,1)+theta1(i,1)*x(:,2)+theta2(i,1)*x(:,3)-y)'*(theta0(i,1).*x(:,1)+theta1(i,1)*x(:,2)+theta2(i,1)*x(:,3)-y);

theta0(i+1,1)=theta0(i,1)-alpha(j,1)*(1/m)*sum((theta0(i,1).*x(:,1)+theta1(i,1)*x(:,2)+theta2(i,1)*x(:,3)-y).*x(:,1));

theta1(i+1,1)=theta1(i,1)-alpha(j,1)*(1/m)*sum((theta0(i,1).*x(:,1)+theta1(i,1)*x(:,2)+theta2(i,1)*x(:,3)-y).*x(:,2));

theta2(i+1,1)=theta2(i,1)-alpha(j,1)*(1/m)*sum((theta0(i,1).*x(:,1)+theta1(i,1)*x(:,2)+theta2(i,1)*x(:,3)-y).*x(:,3));

end

end

figure

plot(0:49,J(1:50,1),'b-');

xlabel('Number of iterations');

ylabel('Cost J');

hold on

plot(0:49,J(1:50,2),'r-')

plot(0:49,J(1:50,3),'k-')

legend('alpha=0.01','alpha=0.1','alpha=1')

h=theta0(end,1)+theta1(end,1)*(1650-mu(2))/sigma(2)+theta2(end,1)*(3-mu(3))/sigma(3)

正规方程解法:

1.数据导入

x=load('ex2x.dat');

y=load('ex2y.dat');

2.数据预处理

m=length(y);

x=[ones(m,1),x];

3.正规方程解

theta1=inv((x'*x))*x'*y

h=theta1(1)+theta1(2)*1650+theta1(3)*3

猜你喜欢

转载自blog.csdn.net/qq_50213874/article/details/129553881