完成ex1也有一段时间了,看网上并没有类似的作业解答,所以今天就打算新开一个专题,记录一下自己在做作业的过程中遇到的困难,我全程使用MATLAB完成作业,希望也能帮助到学习这门课的同学。
首先让我们看一下作业的要求:
一.打星号的.m文件中,plotData,warmUpExercise基本没有什么难度,现在我把我实现的部分贴出来供大家参考
warmUpExercise:
A=eye(5); %Return the 5x5 identity matrix
plotData(plot的句柄表示标记数据点的方式):
figure; % open a newfigure window
plot(x, y, 'rx','MarkerSize', 10,'LineWidth', 2);
xlabel('population');
ylabel('profit');
实现效果:
computCost和gradientDescent目的是使用梯度下降法得到使误差达到最小时的参数
误差以方差来代替:在计算时就可以直接使用矩阵相乘的形式简化计算:
J=(X*theta-y)'*(X*theta-y)/2/m;
参数向着误差减小的方向变化,α之前是减号的原因是在计算导数的时候,如果所处的位置是单调增的,导数大于0,那么误差随着对应参数的增大就有远离最小值得趋势(可能是局部最小值,但是在这一章中,误差函数为凸函数只有一个最小值点不用担心算法陷入到局部最优解):
在计算时依然可以利用矩阵运算简化计算:
theta=theta-alpha/size(X,1)*X'*(X*theta-y);
注意:这两行是写在一个for内的,而且每次迭代不能计算一个赋一个值,会导致计算其他参数时赋值参数位置的改变,无法得到最优解。
拟合曲线(误差32.0727):
参数选择:
二.附加题中将一元的函数换成二元的函数,最高次仍为一次,程序基本一致。
误差随迭代次数的变化:
梯度下降与正规矩阵法得出结果的比较,可以看出在最值点的误差较大。
总结一下,ex1基本没有什么难度,主要是练习使用矩阵运算,在MATLAB中尽量不要使用for会降低运算速度,能用矩阵运算就用矩阵运算。