coursera机器学习第二周编程作业

       首先下载需要的文档。下面是文档的翻译(英语新手纯手工goole翻译)(来源coursera)。

编程练习1:线性回归

机器学习

介绍

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

包含在这个练习中的文件(各个文件功能)

ex1.m - 指导您完成练习的Octave /MATLAB脚本

ex1 multi.m - 用于练习后面部分的Octave/ MATLAB脚本

ex1data1.txt - 用于一个变量的线性回归的数据集

ex1data2.txt - 用于线性回归的数据集with多个变量

submit.m - 将解决方案发送到服务器的提交脚本

 

[?] warmUpExercise.m -Octave / MATLAB中的简单示例函数

[?] plotData.m -显示数据集的函数

[?] computeCost.m -函数to计算线性回归的成本

[?] gradientDescent.m-运行梯度下降的函数

[+]computeCostMulti.m - 用于多个变量的成本函数

[+]gradientDescentMulti.m - 用于多个变量的梯度下降

[+]featureNormalize.m - 函数标准化特征

[†] normalEqn.m -计算标准方程的函数。

?表示文件您需要完成

 †表示可选练习

     在整个练习中,您将使用脚本ex1.m和ex1 multi.m。这些脚本为问题设置数据集,并调用您将要编写的函数。你不需要修改其中的任何一个。您只需按照本作业中的说明修改其他文件中的功能。对于这个编程练习,只需要完成练习的第一部分来实现一个变量的线性回归。练习的第二部分是可选的,涵盖了具有多个变量的线性回归。

        从何处获得帮助本课程中的练习使用Octave1或MATLAB,这是一种非常适合数值计算的高级编程语言。如果您没有安装Octave或MATLAB,请参阅课程网站的“环境设置说明”中的安装说明。在Octave / MATLAB命令行中,输入help后跟一个函数名称,显示内置函数的文档。例如,帮助图将为绘图提供帮助信息。有关Octave功能的更多文档可以在Octave文档页面找到。 MATLAB文档可以在MATLAB文档页面找到。我们也强烈鼓励使用在线讨论与其他学生讨论练习。但是,不要看别人编写的任何源代码或与他人分享你的源代码。

简单的octave/MATLAB功能

ex1.m的第一部分为您提供Octave /MATLAB语法和作业提交过程的练习。在文件warmUpExercise.m中,您将找到Octave / MATLAB函数的大纲。通过填充以下代码将其修改为返回一个5 x 5的单位矩阵:

A =eye(5);

0ctave是一个免费的替代MATLAB。对于编程练习,您可以自由使用Octave或MATLAB。

完成后,运行ex1.m(假设你在正确的目录下,在Octave / MATLAB提示符处输入“ex1”),你应该看到类似于下面的输出:

ans =

对角矩阵

 

现在ex1.m会暂停,直到你按任意键,然后运行下一部分任务的代码。如果你想退出,输入ctrl-c将在程序运行过程中停止程序。

1.1提交解决方案

完成练习的一部分后,您可以通过在Octave / MATLAB命令行键入submit来提交您的解决方案进行评分。提交脚本将提示您输入登录电子邮件和提交令牌,并询问您要提交哪些文件。您可以从网页获取作业的提交令牌。

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

您可以多次提交您的解决方案,我们将只考虑最高分。

2一个变量的线性回归

在这个练习的这一部分,你将用一个变量来实现线性回归来预测食物卡车的利润。假设你是一家餐馆特许经营的首席执行官,并正在考虑在不同的城市开设一个新的出路。这个连锁店在各个城市都有卡车,而且你有来自城市的利润和人口数据。

您想使用这些数据来帮助您选择要扩展到下一个城市。文件ex1data1.txt包含我们的线性回归问题的数据集。第一列是一个城市的人口,第二列是该城市食品卡车的利润。盈利的负值表示亏损。 ex1.m脚本已经被设置为为你加载这些数据。

2.1绘制数据

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

 

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

plot(x, y, 'rx','MarkerSize', 10);            % Plot the data

ylabel('Profitin $10,000s');              % Set the y−axis

label xlabel('Populationof City in 10,000s'); % Set the x−axis labe

现在,当您继续运行ex1.m时,我们的最终结果应该如图1所示,带有相同的红色“x”标记和轴标签。要了解关于绘图命令的更多信息,可以在Octave / MATLAB命令提示下输入help plot,或者在线搜索绘图文档。(要将标记更改为红色的“x”,我们使用选项“rx”和plot命令,即plot(..,[your options here],..,'rx');)

 

 

                                              图1

2.2渐变下降
在这一部分中,您将使用梯度下降法对我们的数据集拟合线性回归参数θ。
2.2.1更新等式
线性回归的目标是使成本函数最小化

 

 

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

 

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

(同时更新所有j的θj)。

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

实现注意事项:我们将每个示例作为一行存储在Octave / MATLAB中的X矩阵中。为了考虑截距项(θ0),我们为X添加一个额外的第一列,并将其设置为全1。这使我们可以将θ0看作是另一个“特征”。

2.2.2实施
在ex1.m中,我们已经建立了线性回归的数据。在以下几行中,我们在数据中增加了另一个维度来适应θ0截距项。我们还初始化初始参数为0,学习率α为0.01。

 

 

2.2.3计算成本J(θ)
当您执行梯度下降以学习使成本函数J(θ)最小化时,通过计算成本来监视收敛是有帮助的。在本节中,您将实现一个计算J(θ)的函数,以便检查梯度下降实现的收敛性。您的下一个任务是完成文件computeCost.m中的代码,这是一个计算J(θ)的函数。当你这样做的时候,记住变量X和y不是标量值,而是矩阵的行代表训练集中的例子。完成该功能后,ex1.m中的下一步将使用θ初始化为零来运行computeCost,您将看到在屏幕上显示的成本。你应该期望看到32.07的成本。
你现在应该提交你的解决方案。

 

2.2.4渐变下降
接下来,您将在文件gradientDescent.m中实现渐变下降。循环结构已经为您编写,您只需要在每次迭代中向θ提供更新。在您编程时,确保您了解要优化的内容以及正在更新的内容。请记住,成本J(θ)是由矢量θ而不是X和y来表示的。也就是说,我们通过改变向量θ的值而不是通过改变X或者y来最小化J(θ)的值。如果您不确定,请参阅本手册中的方程式和视频讲座。验证梯度下降正常工作的一个好方法是查看J(θ)的值,并检查它是否随着每一步递减。gradientDescent.m的起始代码在每次迭代时调用computeCost并打印成本。假设您已经正确实现了梯度下降和computeCost,那么J(θ)的值不应该增加,并且在算法结束时应该收敛到稳定值。完成后,ex1.m将使用您的最终参数绘制线性图。结果应该如图2所示:您最终的θ值也将被用来预测35,000和70,000人的利润。请注意,ex1.m中的以下行使用矩阵乘法(而不是显式求和或循环)来计算预测的方式。这是Octave / MATLAB中的代码矢量化的一个例子。
你现在应该提交你的解决方案

 

2.3调试
在实现梯度下降时,需要注意以下几点:•Octave / MATLAB数组索引从1开始,而不是从0开始。如果将θ0和θ1存储在称为theta的矢量中,则值将为theta(1)和theta(2)。•如果在运行时看到许多错误,请检查矩阵操作以确保您添加并乘以兼容尺寸的矩阵。使用size命令打印变量的大小将有助于调试。

 

                 

                                                                   图2

•默认情况下,Octave / MATLAB将数学运算符解释为矩阵运算符。这是尺寸不兼容性错误的常见原因。如果你不想要矩阵乘法,你需要添加“点”符号来指定这个到八度/ MATLAB。例如,A * B做矩阵乘法,而A * B做元素乘法。

2.4可视化J(θ)
为了更好地理解成本函数J(θ),现在将在θ0和θ1值的二维网格上绘制成本。你不需要为这个部分编写任何新的代码,但是你应该知道你已经编写的代码是如何创建这些图像的。在ex1.m的下一个步骤中,使用您编写的computeCost函数设置代码,以在值的网格上计算J(θ)。

 

 

在执行这些行之后,您将有一个J(θ)值的二维数组。然后,脚本ex1.m将使用这些值使用surf和contour命令来生成J(θ)的曲面和轮廓图。情节应该看起来像图3:

 

 

                                            图3

这些图的目的是向你展示J(θ)如何随着θ0和θ1的变化而变化。成本函数J(θ)是碗形的,具有全局最小值。(这在等值线图中比在3D表面图中更容易看到)。这个最小值是θ0和θ1的最佳点,梯度下降的每一步都靠近这个点。

至此需要提交的内容结束:

可选练习
如果您已成功完成上述材料,恭喜!您现在了解线性回归,并且能够开始在您自己的数据集上使用它。对于这个编程练习的其余部分,我们已经包括了下面的可选练习。这些练习将帮助您更深入地了解材料,如果您能够做到这一点,我们也鼓励您完成这些练习。
3多变量的线性回归
在这一部分中,您将实施具有多个变量的线性回归来预测房屋的价格。假设你正在卖你的房子,你想知道一个好的市场价格是多少。要做到这一点的一个方法是,首先收集最近出售房屋的信息,并制定房价模型。文件ex1data2.txt包含俄勒冈州波特兰的一套房屋价格。第一列是房子的大小(以平方英尺为单位),第二列是卧室的数量,第三列是房子的价格。ex1multi.m脚本已经被设置来帮助你完成这个练习。
3.1功能规范化
ex1multi.m脚本将从这个数据集加载并显示一些值开始。通过查看这些值,请注意房屋大小约为卧室数量的1000倍。当特征数量级差异较大时,首先执行特征缩放可以使梯度下降更快地收敛。
此处的任务是完成featureNormalize.m中的代码以减去数据集中每个要素的平均值。•在减去平均值之后,另外按照各自的“标准偏差”对特征值进行缩放(除)。

标准偏差是一种测量特定特征值范围内有多少变化的方法(大多数数据点将位于平均值的±2个标准偏差内)。这是取值范围(max-min)的替代方法。在Octave / MATLAB中,可以使用“std”函数来计算标准偏差。例如,在featureNormalize.m中,数量X(:,1)包含训练集中x1(房屋大小)的所有值,所以std(X(:,1))计算房屋大小的标准偏差。在调用featureNormalize.m时,与x0 = 1相对应的1的额外列尚未添加到X(详情请参阅ex1 multi.m)。您将为所有功能执行此操作,并且您的代码应该可以处理所有大小的数据集(任意数量的功能/示例)。请注意,矩阵X的每一列对应于一个特征。
你现在应该提交你的解决方案。

 

实现注意事项:对特征进行归一化处理时,重要的是存储用于归一化的值 -用于计算的平均值和标准偏差。从模型中学习参数后,我们经常要预测我们以前从未见过的房屋的价格。给定一个新的x值(起居室面积和卧室数量),我们必须首先使用我们之前从训练集中计算出的均值和标准差对x进行归一化。

3.2渐变下降
以前,您在单变量回归问题上实现了渐变下降。唯一不同的是矩阵X中还有一个特征。假设函数和批梯度下降更新规则保持不变。您应完成computeCostMulti.m和gradientDescentMulti.m中的代码,以实现具有多个变量的线性回归的成本函数和梯度下降。如果你以前的代码(单个变量)已经支持多个变量,你也可以在这里使用它。确保你的代码支持任何数量的功能,并且是矢量化的。您可以使用'size(X,2)'来找出数据集中有多少特征。
你现在应该提交你的解决方案。

实现注意:在多变量情况下,成本函数也可以写成以下矢量化形式:

 

 

当您使用Octave / MATLAB等数值计算工具时,矢量化版本是有效的。如果你是矩阵操作的专家,你可以向自己证明这两种形式是等价的。

3.2.1可选(未评分)练习:选择学习率
在这部分的练习中,您将尝试对数据集进行不同的学习率,并找到一个快速收敛的学习率。您可以通过修改ex1multi.m并更改设置学习速率的代码部分来更改学习速率。 ex1 multi.m中的下一个阶段将调用您的gradientDescent.m函数,并以选定的学习速率运行约50次迭代的梯度下降。该函数还应该返回向量J中的J(θ)值的历史记录。在最后一次迭代之后,ex1 multi.m脚本将J值与迭代次数进行比较。如果你选择了一个好的范围内的学习速度,你的情节看起来很相似图4.如果你的图表看起来很不一样,尤其是如果你的J(θ)值增加甚至爆炸,调整你的学习速度,然后再试一次。我们推荐以大约3倍于先前值(即0.3,0.1,0.03,0.01等)的乘法步
骤以对数标度尝试学习率α的值。如果这可以帮助您查看曲线中的整体趋势,您可能还需要调整正在运行的迭代次数。

 

 

实施注意事项:如果你的学习速度太大,J(θ)会发散并“爆炸”,导致计算机计算的值太大。在这些情况下,Octave / MATLAB将倾向于返回NaN。NaN代表“不是数字”,通常由涉及-∞和+∞的未定义操作引起。

 

Octave/ MATLAB提示:为了比较不同学习学习效果如何达到一个效果,在同一个数据上绘制几个学习率是有帮助的。在Octave / MATLAB中,这可以通过在图之间执行“hold on”命令多次执行梯度下降来完成。具体来说,如果你已经尝试了三个不同的alpha值(你应该尝试更多的值),并把成本存储在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”为曲线指定了不同的颜色。

 

注意学习率变化时收敛曲线的变化。 如果学习率较低,则应该发现梯度下降需要很长时间才能收敛到最佳值。 相反,学习率很高,梯度下降可能不会收敛甚至可能分歧!使用您找到的最佳学习速率,运行ex1 multi.m脚本运行梯度下降直到收敛找到θ的最终值。 接下来,用这个θ值来预测1650平方英尺和3间卧室的房价。 您稍后将使用值来检查您的正常方程的实现。当你做这个预测的时候,不要忘了规范你的特性! 您不需要为这些可选(未评级)练习提交任何解决方案。
3.3正则方程
在讲座视频中,您了解到线性回归的封闭解决方案是

 

 

使用该公式不需要任何特征缩放,并且在一次计算中您将得到一个精确的解决方案:没有像收敛一样的“循环”,就像渐变下降一样。 在normalEqn.m中完成代码,使用上面的公式计算θ。 请记住,尽管不需要缩放特征,但我们仍然需要在X矩阵中添加一列1以获得截距项(θ0)。 ex1.m中的代码将为您添加1的X列到X.
你现在应该提交你的解决方案。
可选(未评级)练习:现在,一旦你找到了使用这种方法的θ,使用它来为一个1650平方英尺的3间卧室的房子进行价格预测。 您应该发现,与使用梯度下降模型(在3.2.1节)中获得的值相同,可以得到相同的预测价格。

提交和评分
完成作业的各个部分后,请务必使用提交功能系统将您的解决方案提交给我们的服务器。您可以多次提交您的解决方案,我们将只考虑最高分。

 

 

 

你可能感兴趣的:(coursera机器学习第二周编程作业)