在本练习中,您将使用梯度下降和正态方程来研究多元线性回归。您还将研究代价函数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万元。
正规方程问题解答:
求出的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