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

这篇文章是基于bilibili的吴恩达机器学习经典名课【中英字幕】课程链接所写的第二周的编程练习,这个练习可以从课程网站上获取,但是因为这个网站是国外的,所以运行会很慢,我在上面的视频也放不出来,所以我用这个网站来刷题。那么接下来就来讲讲这个是第二周的编程作业。
这个作业是关于线性回归的,有两大部分,一个是单变量的线性回归,还有一个是多变量的(选做)。因为原版的exercise是英文的,我在这篇文章中就做简要的中文介绍。
这里推荐大家还是在网站上刷题,还能知道自己对错,现在也还是开放的。

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 window
data = 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 parameters
iterations = 1500; alpha = 0.01;

2.2.3 计算J(θ) computeCost.m

根据上述的公式,在computeCost.m编写程序

function J = computeCost(X, y, theta)
m = length(y); % number of training examples
h =  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 examples
J_history = zeros(num_iters, 1);%初始化存储J值的矩阵
for iter = 1:num_iters
    h =  X*theta;
    theta = theta - alpha*X'*(h-y)/m;
    J_history(iter) = computeCost(X, y, theta);
end
end    

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 examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
    h =  X*theta;
    theta = theta - alpha*X'*(h-y)/m;
    J_history(iter) = computeCostMulti(X, y, theta);
end
end

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhanghp947

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值