这篇文章是基于bilibili的吴恩达机器学习经典名课【中英字幕】课程链接所写的第二周的编程练习,这个练习可以从课程网站上获取,但是因为这个网站是国外的,所以运行会很慢,我在上面的视频也放不出来,所以我用这个网站来刷题。那么接下来就来讲讲这个是第二周的编程作业。
这个作业是关于线性回归的,有两大部分,一个是单变量的线性回归,还有一个是多变量的(选做)。因为原版的exercise是英文的,我在这篇文章中就做简要的中文介绍。
这里推荐大家还是在网站上刷题,还能知道自己对错,现在也还是开放的。
作业大纲
1 warmUpExercise.m2 单变量线性回归2.1 数据可视化 plotData.m2.2 梯度下降2.2.1 更新方程2.2.2 具体过程2.2.3 计算J(θ) computeCost.m2.2.4 梯度下降 gradientDescent.m 3 多变量线性回归(选做)3.1 特征归一化 featureNormalize.m3.2 梯度下降 Gradient Descent3.2.1 选择学习率α 3.3 正规方程 normalEqn.m 总结1 warmUpExercise.m
这个是第一题热身练习,要求你输出 5 x 5 identity matrix(单位矩阵)。去掉注释什么的就三行。
function A = warmUpExercise()A = eye(5);end
2 单变量线性回归
在老师给的作业练习里面,有一个ex1的函数,是这个部分的一个主函数,然后再给你很多的子函数,挖空去填写完整。这个部分给一共给你两个变量,分别是人口和利润。
2.1 数据可视化 plotData.m
画出关于人口和利润的散点图,这个也很简单,老师给的pdf都把代码给你了。
function plotData(x, y)figure; % open a new figure windowdata = load('ex1data1.txt');x = data(:,1);y = data(:,2);plot(x,y,'rx','MarkerSize',10);ylabel('Profit in $10,000s');xlabel('Population of city in 10,000s');end
图像如下:
2.2 梯度下降
2.2.1 更新方程
代价函数:
假设函数:
更新方程:
2.2.2 具体过程
在ex函数里面,已经加载好数据和初始化θ,α和迭代次数,如下:
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x theta = zeros(2, 1); % initialize fitting parametersiterations = 1500; alpha = 0.01;
2.2.3 计算J(θ) computeCost.m
根据上述的公式,在computeCost.m编写程序
function J = computeCost(X, y, theta)m = length(y); % number of training examplesh = X*theta;J = (h-y)'*(h-y)/(2*m); %这个是矩阵的表示方法,这里就不给大家推导了
2.2.4 梯度下降 gradientDescent.m
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)m = length(y); % number of training examplesJ_history = zeros(num_iters, 1);%初始化存储J值的矩阵for iter = 1:num_itersh = X*theta;theta = theta - alpha*X'*(h-y)/m;J_history(iter) = computeCost(X, y, theta);endend
3 多变量线性回归(选做)
这个部分是以ex1multi.m 为主函数,给了一个房子的大小、房间的数量为因变量,预测房子的价格。
3.1 特征归一化 featureNormalize.m
公式(其中 𝜇𝑛是平均值,𝑠𝑛是标准差):
function [X_norm, mu, sigma] = featureNormalize(X)mu = mean(X);%存储X的平均数,这里应为1*2的矩阵sigma = std(X);%存储X的方差,这里应为1*2的矩阵X_norm(:,1) = (X(:,1)-mean(X(:,1)))/std(X(:,1));X_norm(:,2) = (X(:,2)-mean(X(:,2)))/std(X(:,2));end
3.2 梯度下降 Gradient Descent
这个因为我之前用的是矩阵的方法,所以不用重新写代码,就是换了一个子程序名字computeCostMulti和gradientDescentMulti:
function J = computeCostMulti(X, y, theta)h = X*theta;J = (h-y)'*(h-y)/(2*m);end
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)m = length(y); % number of training examplesJ_history = zeros(num_iters, 1);for iter = 1:num_itersh = X*theta;theta = theta - alpha*X'*(h-y)/m;J_history(iter) = computeCostMulti(X, y, theta);endend
3.2.1 选择学习率α
这个就是改变α的值,看梯度下降的那个图像,如果是下面的那个图就ok:
上面那个是老师的,然后我选的α是0.1,然后我的图象是这样的:
我看着差不多了。
这道题目还说让你预测大小为1650,3个房间的房子的价格:
x = [1 1650 3];x(2:3) = (x(2:3) - mu)/sigma;%mu和sigma是你存起来的X的平均值和标准差,梯度下降要特征缩放,不要忘啦price = x*theta; % You should change this
这个是我算的结果:
3.3 正规方程 normalEqn.m
求解方程:
求解过程可以搜索知乎 李亚鑫 线性回归
function [theta] = normalEqn(X, y)theta = pinv(X'*X)*X'*y;end
同样的x求解结果:
老师在pdf里面说,这两个结果应该是一样的,那我求出来是稍微相差了一点,我个人觉得是没什么太大关系吧,如果有同学做了,发现了什么不对的地方,欢迎提出来,因为选做的题目没有答案。
然后这个是我作业的得分,就大家可以参考一下:
总结
1.吴老师的视频讲得蛮细的,很适合入门级的同学;
2.对于梯度下降是需要特征缩放的,而正规方程是不需要的;
3.但是梯度下降是一个通用算法,在后续的算法中仍有大量的使用;正规方程虽然计算简单,但是不通用,而且在有着大量的特征时,对于矩阵的计算时间会相当长。
4.如果你们想要这个编程文件夹的话,就可以去这里下载,只有第二周的,因为我后续的作业还没有做,包含了老师的作业和我的答案,后续应该会出整个作业的压缩文件,如果不着急的话,可以一起下载。
下载地址
如果觉得《吴恩达机器学习编程练习ex1:线性回归Linear Regression》对你有帮助,请点赞、收藏,并留下你的观点哦!