本文主要是介绍机器学习之单变量线性回归(Linear Regression with One Variable),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
机器学习之单变量线性回归(Linear Regression with One Variable)
1. 模型表达(Model Representation)
我们的第一个学习算法是线性回归算法,让我们通过一个例子来开始。这个例子用来预测住房价格,我们使用一个数据集,该数据集包含俄勒冈州波特兰市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集:
我们来看这个数据集,如果你有一个朋友正想出售自己的房子,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。 那么,你可以做的一件事就是构建一个模型,也许是条直线。从这个数据模型上来看,也许你可以告诉你的朋友,他大概能以220000美元左右的价格卖掉这个房子,显然这就是监督学习算法的一个例子。
在上一篇博文Introduction to Machine Learning,我们已经了解到之所以这个例子被称作 Supervised Learning ,是因为对于每个数据来说,我们给出了“正确的答案”。而且,更具体来说,这是一个回归问题。回归一词指的是我们根据之前的数据预测出一个准确的输出值。对于这个例子就是价格。
同时,还有另一种最常见的 Supervised Learning 的方式叫做分类问题。更进一步来说,在 Supervised Learning 中我们有一个数据集,这个数据集被称训练集。因此对于房价的例子,我们有一个包含不同房屋价格的训练集,我们的任务就是从这个训练集中学习并预测房屋价格。
现在我们给出经常使用的一些符号定义,如下:
用 m 来表示训练样本的数目,因此,在这个数据集中如果表中有47行,那么我们就有47组训练样本,m就等于47。
用小写字母 x 来表示输入变量,往往也被称为特征量,就是用 x 表示输入的特征,并且我们将用 y 来表示输出变量或者目标变量,也就是我的预测结果,也就是上面表格的第二列。
在这里我们要使用 (x, y) 来表示一个训练样本,因此,在这个表格中的单独的一行对应于一个训练样本。
为了表示某个特定的训练样本,我们将使用x上标(i)与y上标(i)来表示,并且用这个来表示第 i 个训练样本,所以上标为 i ,注意这不是求幂运算,这个(x(i), y(i)) 括号里的上标 i 只是一个索引,表示我的训练集里的第 i 行。
我们的房屋价格预测就是一个监督学习算法的工作方式,如下图:
我们可以看到这里有我们的训练集里房屋价格,我们把它喂给我们的学习算法,进而学习得到一个函数,按照惯例,通常表示为小写 h,h 代表 hypothesis(假设), 在此处,h 表示一个函数,其输入是房屋尺寸大小。因此 h 根据输入的 x 值来得出 y 值,y 值对应房子的价格。因此,h 是一个从 x到 y 的函数映射。
大家经常会有这样的疑问:为什么这个函数被称作假设(hypothesis)?你们中有些人可能知道 hypothesis 的意思,从字典或者其它什么方式可以查到。其实在机器学习中,这是一个在早期被用于机器学习的名称,它有点绕口,对某些函数来说这可能不是一个很恰当的名字。例如,对表示从房屋的大小到价格的函数映射,我认为这个词 "hypothesis" 就可能不是最好的名称。但是这是人们在机器学习中使用的标准术语,所以我们不用太纠结人们为什么这么叫它。
小结:当解决房价预测问题时,我们实际上是要将训练集“喂”给我们的学习算法,进而学习得一个假设 h,然后将我们要预测的房屋的尺寸作为输入变量输入给 h,预测出该房屋的交易价格作为输出变量输出为结果。
当我们在设计学习算法的时候,需要去思考的是怎样得到这个假设 h。例如,对于我们的房价预测问题,我们该如何表达 h ? 一种可能的表达方式为:
因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。
那么为什么是一个线性函数呢? 实际上,有时候我们会有更复杂的函数,也许是非线性函数,但是由于线性方程是简单的形式,我们将先从线性方程的例子入手。当然,最终我们将会建立更复杂的模型以及更复杂的学习算法。
2. 代价函数(Cost Function)
接下来我们将定义代价函数的概念,这将有助于我们弄明白怎样将最有可能的直线与我们的数据相拟合。
在线性回归中我们有一个像上图一样的训练集 记住 m 代表了训练样本的数量,例如,此处 m = 47 。
而我们的假设函数(也就是用来进行预测的函数),线性函数形式也已在上图中表示出来了。
接下来我们引入一些术语,诸如 θ0 和 θ1 之类这些 θi 我们通常称其为模型参数。那么我们如何选择这两个参数值 θ0 和 θ1 呢?选择不同的参数 θ0 和 θ1 我们会得到不同的假设函数。例如下图:
在线性回归中,我们有一个训练集,我们要做的就是得出 θ0 和 θ1 这两个参数的值,来让假设函数表示的直线尽量地与这些数据点很好的拟合。那么我们如何得出 θ0 和 θ1 的值,来使它很好地拟合数据的呢?
我们的想法是,我们要选择能使 h(x) 输入 x 时我们预测的值最接近该样本对应的 y 值的参数 θ0 和 θ1 。在我们的训练集中有一定数量的样本,我们知道 x 表示卖出哪所房子,并且知道这所房子的实际价格,所以,我们要选择参数值,尽量使得在训练集中给出的 x 值,能准确地预测 y 的值。
让我们给出标准的定义,在线性回归中,我们要解决的是一个最小化问题。
我们选择的参数 θ0 和 θ1 决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。即使得代价函数:
最小。我们绘制一个等高线图,三个坐标分别为 θ0 和 θ1 和J(θ0 ,θ1):
可以看出在三维空间中存在一个使得J(θ0,θ1)最小的点。
3. 梯度下降(Gradient Descent)
我们已经定义了代价函数,现在我们来介绍梯度下降算法,该算法可以将代价函数 J 最小化。梯度下降是很常用的算法,它不仅被用在线性回归上,并且被广泛的应用于机器学习的众多领域中,之后为了解决其他线性回归问题,我们也将使用梯度下降法来最小化其他函数。
在这里,我们有一个函数 J(θ0 ,θ1) ,也许这是一个线性回归的代价函数,也许是一些其他函数,要使其最小化,我们需要用一个算法来最小化函数 J(θ0 ,θ1),事实证明,梯度下降算法可应用于多种多样的函数求解,所以想象一下如果你有一个函数J(θ0, θ1, θ2, ...,θn ),你希望可以通过最小化 θ0 到 θn 来最小化此代价函数J(θ0 到θn),用n个θ是为了证明梯度下降算法可以解决更一般的问题。但为了简洁起见,为了简化符号,在接下来的讨论中,我们只用两个参数。
下面就是关于梯度下降的构想。首先我们要做的是对 θ0 和 θ1 进行初始化。实际上,它们到底是什么其实并不重要,但通常的选择是将 θ0 设为0
,同时也将 θ1 也设为0,即将它们都初始化为0。
我们在梯度下降算法中要做的就是不停地一点点地改变 θ0 和 θ1 ,试图通过这种改变使得 J(θ0 ,θ1) 变小,直到我们找到 J(θ0 ,θ1) 的最小值。或许是局部最小值。
让我们通过一些图片来看看梯度下降法是如何工作的,我们在试图让 J(θ0 ,θ1) 最小,注意坐标轴 θ0 和 θ1 在水平轴上,而函数 J(θ0 ,θ1) 在垂直坐标轴上,图形表面高度即是 J(θ0 ,θ1) 的值。我们希望最小化这个函数,因此我们从 θ0 和 θ1 的某个值出发。所以想象一下,对 θ0 和 θ1 赋以某个初值,也就是对应于从这个函数表面上的某个起始点出发,因此不管 θ0 和 θ1 的取值是多少,我将它们初始化为0。但有时你也可把它初始化为其他值。
现在我希望大家把这个图像想象为一座山。想像类似这样的景色,公园中有两座山,想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上。在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己,如果我想要下山,如果我想尽快走下山,我们需要朝什么方向?
如果我们站在山坡上的某一点,你看一下周围 ,你会发现最佳的下山方向大约是那个方向。好的,现在你在山上的新起点上,你再看看周围,然后再一次想想我应该从什么方向迈着小碎步下山? 然后你按照自己的判断又迈出一步,往那个方向走了一步。然后重复上面的步骤,从这个新的点,你环顾四周并决定从什么方向将会最快下山,然后又迈进了一小步,又是一小步…并依此类推,直到你接近局部最低点的位置。
此外这种下降有一个有趣的特点,不同的起始点开始进行梯度下降算法,你会得到一个非常不同的局部最优解,这就是梯度下降算法的一个特点。
下图是梯度下降算法的定义:
注意,在梯度下降算法中,我们需要同时更新 θ0 和 θ1。
如果学习速率太小,只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点。
如果学习速率太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛。实际上,会离最低点越来越远,因此,如果α太大,会导致无法收敛,甚至发散。
如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做(求导为0),它不会改变参数的值,这也正是你想要的,因为它使你的解始终保持在局部最优点,这也解释了为什么即使学习速率 α 保持不变时,梯度下降也可以收敛到局部最低点。
梯度下降一步后,新的导数会变小一点点。随着梯度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现已经收敛到局部极小值。
在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度。这是因为当我们接近局部最低点时(很显然在局部最低时导数等于零 ),导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法,所以实际上没有必要再另外减小α。
实际上,用于线性回归的代价函数总是呈现一个弓形的样子,这个函数的专业术语是凸函数。这个函数没有任何局部最优解,只有一个全局最优解。
实际上,我们刚刚介绍的梯度下降,是“批量梯度下降”,指的是,在梯度下降的每一步中我们都用到了所有的训练样本。在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以在每一个单独的梯度下降中,我们最终都要计算这样一项,这项需要对所有m个训练样本求和。
而事实上,也有其他类型的梯度下降法不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。
这篇关于机器学习之单变量线性回归(Linear Regression with One Variable)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!