1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 吴恩达机器学习编程练习ex1:线性回归Linear Regression

吴恩达机器学习编程练习ex1:线性回归Linear Regression

时间:2021-03-31 10:45:18

相关推荐

吴恩达机器学习编程练习ex1:线性回归Linear Regression

这篇文章是基于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.如果你们想要这个编程文件夹的话,就可以去这里下载,只有第二周的,因为我后续的作业还没有做,包含了老师的作业和我的答案,后续应该会出整个作业的压缩文件,如果不着急的话,可以一起下载。

下载地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。