【自翻】Andrew Ng作业大纲 Ex1(中文)

来源:互联网 发布:知乎 不氪金的手游 编辑:程序博客网 时间:2024/05/29 15:04

编程练习1:线性回归

                     机器学习

简介:

  在这个练习中,您将实现线性回归,并学习它在数据上的实现。在开始这个编程练习之前,我们强烈建议观看视频讲座并完成复习问题相关的话题。要开始练习,您需要下载初始代码并将其内容解压到您希望完成的目录。如果需要,请使用Octave/ MATLAB中的cd命令来更改这个目录在开始这个练习之前。你也可以在课程网站的\环境设置说明中找到安装Octave / MATLAB的说明。

 

本练习中包含的脚本文件:

  ex1.m – 您通过练习所需步骤

  ex1 multi.m – 后续的练习

  ex1data1.txt –单变量的线性回归数据集

  ex1data2.txt –多变量的线性回归数据集

  submit.m – 发送您的解决方案到我们的服务器

  [*]warmUpExercise.m– 在Octave / MATLAB中的简单示例函数

  [*]plotData.m– 显示数据集函数

  [*]computeCost.m– 计算线性回归代价函数

  [*]gradientDescent.m– 运行梯度下降函数

  [-]computeCostMulti.m– 多变量代价函数

  [-]gradientDescentMulti.m– 多变量梯度下降

  [-]featureNormalize.m– 特征标准化

  [-]normalEqn.m– 标准方程法

  [*]为必须完成内容

[-]为可选内容

 

在整个练习过程中,您将使用脚本ex1.m和ex1multi.m。这些脚本为问题设置数据集,并调用你将完成的函数。您不需要对其中任何一个进行修改。你只是要求在其他文件中修改函数,按照指令输入。对于这个编程练习,您只需要完成第一个部分练习,即用一个变量来实现线性回归。第二部分的练习,即多个变量线性回归是可选的。

 

如何获得帮助

本课程的练习使用Octave或MATLAB,一种适合数值计算的高级编程语言。如果你没有安装Octave或MATLAB,请参考课程网站的环境设置说明中的安装说明。在Octave/ MATLAB命令行中,输入help后跟一个函数名显示一个内置函数的文档。例如,helpplot将会提供plot的帮助文档。进一步的Octave函数文档可以在Octave文档页面找到。MATLAB文档可以在MATLAB文档页面找到。我们也强烈建议使用在线讨论与其他学生讨论练习。但是,不要看任何代码或通过其他人或与他人共享您的源代码。

 

1.  简单Octave/Matlab函数

Ex1.m中的第一部分让你练习Octave/Matlab语法和作业提交过程。在文件warmUpExercise.m中,你会找到一个Octave/Matlab概述。修改它以返回一个5x5单位矩阵,填入以下代码:

           A =eye(5);

 

Tip:Octave是MATLAB的免费替代品。对于编程练习,你可以自由使用Octave或MATLAB

 

当你完成后,运行ex1。m(假设您在正确的目录下,键入\ ex1“在Octave / MATLAB提示符下),您应该看到

输出类似如下:

ans =
Diagonal Matrix
     1 0 0 0 0
     0 1 0 0 0
     0 0 1 0 0
     0 0 0 1 0
     0 0 0 0 1

现在ex1.m会暂停,直到你按下任何键,然后运行代码作业的下一部分。如果您想要退出,键入ctrl- c将会让程序停止运行。

 

1.1提交解决方案

在完成部分练习后,您可以提交您的解决方案通过在Octave/ MATLAB命令行输入submit。提交脚本将提示您登录电子邮件和提交令牌,然后问你要提交哪些文件。你可以得到一份意见书

来自web页面的令牌。您现在应该提交您的解决方案。您可以多次提交您的解决方案,我们将保存最高的分数。

 

2.  单变量线性回归

在这个部分的练习中,您将实现用单变量线性回归预测食品卡车利润。假设你是一个特许经营餐厅的首席执行官,正在考虑不同的城市开设一个新店。该连锁店已经在各种各样的城市拥有卡车,而且你有来自城市的利润和人口的数据。你想用这些数据来帮助你选择扩张的下一个城市。

文件ex1data1.txt包含了线性回归问题的数据集。第一列是城市人口,第二列是那个城市的食品卡车的利润。利润的负值表示的损失。Ex1.m已经为您加载了这些数据。

2.1绘制数据

在开始任何任务之前,通过可视化了解这些数据通常是有用的。对于这个数据集,您可以使用散点图来可视化数据,因为它只有两个属性(利润和人口)。(许多你在现实生活中遇到的其他问题是多维度的,不能画在二维图上。在ex1.m中,数据集从数据文件加载到变量X和y中:

        data = load(‘ex1data1.txt’);

        x =data(: ,1); y = data(: , 2);

      m = length(y);

接下来,脚本调用plotData函数创建一个散点图数据。你的工作是完成plotData.m画这个图;修改文件并填写以下代码:

        plot( x, y , ‘rx’ , ‘MarkerSize’ , 10);

       ylabel(‘Profit in $10,000s’);

       xlabel(‘Population of City in 10,000s’);

现在,当你继续运行ex1.m,我们的最终结果应该是

图1,使用相同的红色X标记和axis标签。要了解更多关于plot命令的内容,您可以键入help plot(Octave/ MATLAB命令提示符),或者在网上搜索绘图文档。(为了将标记更改为红色的X,我们使用了“rx”选项与plot命令一起,即plot(..,[your optionshere],..,

‘rx’);)


2.2梯度下降

在这一部分中,您将使用梯度下降法找到符合我们的数据集的线性回归参数θ。

2.2.1更新方程

线性回归的目标是最小化成本函数。


假设hθ(x)是由线性模型


回想一下,你的模型的参数是θj值。这些都是你用来最小化成本调整J(θ)。一种方法是使用批梯度下降算法。在批量梯度下降中,每一个迭代执行更新。


每一步的梯度下降,参数θj接近最优值,从而达到成本最低J(θ)。

 

执行说明:我们将每个示例在Octave/ MATLAB中存储为X中的一行矩阵。考虑到截距项(θ0),我们向X添加了一个额外的第一列,并将它全部设为1。这允许我们把θ0当作另一个“特征”。

 

2.2.2实现

在ex1.m,我们已经建立了线性回归的数据。在接下来,我们在数据中添加另一个维度来容纳θ0截距项。我们还将初始参数初始化为0,学习速率设为0。01。

        X = [ones(m, 1), data(:,1)];

        theta = zeros(2, 1);

         iterations = 1500;
         alpha = 0.01;

 

2.2.3计算成本J(θ)

当你执行梯度下降学习最小化代价函数J(θ),通过计算成本来监测算法的收敛性是很有帮助的。在这节中,您将实现一个函数来计算J(θ),这样你就可以检查梯度下降实现的收敛性。

您的下一个任务是完成文件computeCost中的代码。该文件包含计算J(θ)的函数。当你这样做的时候,记住变量X和y不是标量值,行表示的矩阵训练集的样本。完成该函数后,ex1中的下一步将运行computeCost(θ初始化全为0),您将看到打印到屏幕上的成本。预计价格为32.07。

您现在应该提交您的解决方案。

 

2.2.4梯度下降

接下来,您将在文件gradientDescent.m中实现梯度下降。循环结构已经为您编写,您只需要提供每次迭代更新的θ。在您编写程序时,确保您了解您正在尝试优化的内容,以及正在更新的内容。记住成本J(θ)是通过向量θ参数化的,不是X和y。也就是说,我们最小化J(θ)是通过改变的值向量θ,而不是通过改变X或y,如果你不确定的话,讲义中的方程式和视频课程。检查梯度下降是否正确工作的一个好方法是看J(θ)的值和检查是否每一步都减小了。在gradientDescent中的起始代码。是在每次迭代中调用computeCost并打印成本。假设你已经实现了梯度下降

computeCost正确,你的价值的J(θ)不应该增加,而且应该

在算法结束时收敛到一个稳定值。在你完成之后,ex1.m将使用最终参数绘制直线。结果应该类似于图2:


你最后的值θ也将被用来为区间为35000-70000人口数对利润进行预测。请注意以下几行的方式

ex1.m使用矩阵乘法,而不是直接求和或循环,来计算预测。这是一个Octave/MATLAB代码向量化的例子。

您现在应该提交您的解决方案。

 

       predict1 = [1, 3.5] * theta;
       predict2 = [1, 7] * theta;

 

2.3调试

当你实现梯度下降时,你需要记住以下几点:

•Octave/ MATLAB数组索引从1开始,而不是0。如果你在一个θ向量存储θ0和θ1,值将为θ(1),θ(2)。

•如果你在运行时看到很多错误,为了确保你正在求和和相乘相容维的矩阵,检查你的矩阵运算。打印变量的大小命令将帮助您调试。

•在默认情况下,Octave/ MATLAB将数学运算符解释为矩阵

操作符。这是大小不兼容错误的常见来源。如果你不要想要矩阵乘法,你需要添加.符号。例如,A * B做一个矩阵乘法,A.* B对元素进行乘法运算。

 

2.4可视化J(θ)

更好地理解成本函数J(θ),现在将通过θ0和θ1值绘制

一个二维网格的成本图。这部分的新内容您不需要编写任何代码

,但是您应该了解您编写的代码是创建这些图像的。

在ex1.m的下一步。用代码使用您所编写的computeCost函数计算J(θ)。

 

       J vals = zeros(length(theta0vals), length(theta1 vals));
        for i = 1:length(theta0 vals)
         for j = 1:length(theta1 vals)
          t = [theta0 vals(i); theta1vals(j)];
          J vals(i,j) = computeCost(x, y, t);
         end
        end

这些行被执行之后,您将有一个二维数组的J(θ)值。然后ex1.m将使用这些值来产生J(θ)的表面和轮廓,使用surf和contour的命令。生成图像类似图3:

这些图的目的是向你展示J(θ)随θ0和θ1的变化。成本函数J(θ)是碗状,最小值。(这在轮廓图中比在三维表面更容易看到

情节)。这个最小的最佳点(θ0,θ1),和每一步梯度下降更接近这一点。

 

可选的练习

如果你已经成功完成了以上材料,恭喜你!你现在理解线性回归,并可以开始使用它自己的数据集。在接下来的编程练习中,我们包括了以下可选的练习。这些练习将帮助你获得更深的理解

在材料中,如果你能做,我们鼓励你完成他们。

 

3线性回归多变量

在这一部分中,您将使用多个变量实现线性回归预测房价。假设你正在出售你的房子而且你想知道一个好的市场价格是多少。一种方法是首先收集最近出售的房屋的信息,并建立一个住房模型

价格。文件ex1data2.txt包含俄勒冈州港口的一套住房土地价格

训练集。第一列是房子的大小(平方英尺),第二列是卧室的数量,第三列是房子的价格。

ex1multi.m已经建好来帮助你通过训练。

 

3.1特征标准化

ex1multi.m脚本将从这个数据集加载和显示一些值开始。通过查看这些值,请注意房子的大小是差不多的1000倍的卧室数量。当特征的数量级不同时,首先,执行特征缩放可以使梯度下降收敛要快得多。您的任务是在特性化的过程中完成代码

•从数据集中减去每个特征的平均值。

•在减去平均值后,除以他们各自的标准差。

 

标准差是一种测量变化量的方法,在特定特性的值范围内(大多数数据点将在平均值±2范围内);

这是另一种选择(代替标准差),(max-min)。在Octave / MATLAB中,你可以使用\ std函数计算标准偏差。例如,featureNormalize.m

内,数量X(:,1)包含培训中的所有x1(大小)的值,所以std(X(:1))计算了房子大小的标准偏差。在featureNormalize.m使用时,全为1的额外列对应的x0=1还未加到向量X中(详情见ex1multi.m)。

您将为所有的特征标准化,而且代码应该适用于所有尺寸的数据集(任何数量的特征/例子)。注意,每个矩阵X的列对应于一个特征。

您现在应该提交您的解决方案。

 

执行说明:当特征标准化时,存储用于标准化的值很重要——用于计算的平均值和标准差。从模型中学习参数后,我们经常想预测我们从未见过的房子的价格。给定一个新的x值(客厅面积和卧室数),我们必须首先使用我们之前已经从训练集计算过的均值和标准差来规范x。

 

3.2梯度下降

之前,在单变量回归中实现了梯度下降问题。现在唯一的区别是,矩阵x还有一个特性。假设函数和批梯度下降更新规则保持不变。您应该在computeCostMulti.m和gradientDescentMulti.m

实现多个变量线性回归的成本函数和梯度下降。如果你的代码在前面的部分(单一变量)已经支持多个变量,您也可以在这里使用它。确保您的代码支持任意数量的特征,并进行了良好的向量化。

您可以使用“size(X,2)”来查找数据集有多少特征。

您现在应该提交您的解决方案。

 

执行说明:在多变量情况下,成本函数可以

也可以用以下矢量形式写:

其中

当你使用Octava/MATLAB数学计算工具的时候,矢量化的版本是有效的。如果你是一个矩阵操作的专家,你可以证明这两种形式是等价的。

 

3.2.1可选(不分级)练习:选择学习速率

在这一部分的练习中,你将会尝试不同的学习速率.找到一个关于数据集快速收敛的学习速率。你可以通过修改ex1multi.m学习速率来实现。

下一阶段的ex1multi.m会使用你的gradientDescent函数。在选择的学习速率中,运行梯度下降约50次。函数应该返回历史J(θ)值到一个向量J。在最后一次迭代之后,ex1multi.m脚本将J值和迭代次数绘制成图。

如果你在一个好的范围内选择了一个学习速度,你的图像看起来应该如图4。如果你的图看起来很不同的,尤其是如果你的价值的J(θ)增加甚至爆炸,调整你的学习速度,再试一次。我们推荐的学习速率值α在对数尺度,在乘法步骤约为前值的3倍(即:0.3,0.1,0.03,0.01 … )您还可能想要调整正在运行的迭代次数来帮助你看到曲线的整体趋势。

 

实现注意:如果你的学习速率过大,J(θ)会发散和“爆炸”,结果值对电脑计算来说过大。在这些情况下,Octave/MATLAB会返回NaNs。NaN表示不是一个数字,通常是因为涉及负无穷和正无穷的未定义操作引起的。

 

Octave/ MATLAB提示: 为了比较不同的学习学习

速率对收敛性的不同影响,基于相同的数据,使用J和几个不同的学习速率绘图会很有帮助。在Octave/ MATLAB中,在不同次绘图中可以用“holdon”命令多次执行梯度下降。具体地说,如果你尝试过三种不同的阿尔法值(你应该这样做)可能会尝试更多的值,并存储J1、J2和J3,您可以使用以下命令将它们绘制在一张图上:

plot(1:50, J1(1:50), ‘b’);
hold on;
plot(1:50, J2(1:50), ‘r’);
plot(1:50, J3(1:50), ‘k’);


b,r,k用于绘图中的颜色区分。

 

注意随着学习速率的变化,收敛曲线的变化。

如果开始的学习速率很小,你应该会发现梯度下降要长时间才收敛到最优值。相反地,有一个大的学习速率,梯度下降可能不收敛,甚至可能发散!使用您发现的最佳学习速率,运行ex1multi.m脚本,运行梯度下降,直到收敛到找到最终的θ值。接下来,

使用这个值θ来预测价格和1650平方英尺的房子,3间卧室。稍后您将使用标准方程法来检查您的实现。当你做这个预测的时候,别忘了让你的特征标准化!

您不需要为这些可选(未分级) 练习提交任何解决方案。

 

3.3标准方程法

在课程视频中,你学到了线性的封闭解回归

使用此公式不需要任何特征缩放,您将得到一个计算中的精确解:没有像梯度下降法的循环。完成normalEqn.m的代码。使用上面的公式来计算θ。记住,虽然您不需要特征缩放,但我们仍然

需要添加一列1到X ,矩阵有截距项(θ0)。ex1.m中的代码有可以把为1的列加到X中的功能。

您现在应该提交您的解决方案。

 

可选练习:现在,一旦你找到了θ使用这个

方法,用它对一个1650平方英尺的房子进行价格预测

3间卧室。你应该发现,这和您使用的模型符合梯度下降的价值是一样的预测价格

 (第3.2.1节)

原创粉丝点击