0%

斯坦福机器学习课程 第一周 (4)一元线性回归

线性回归预测一个输入值的一个真值输出。我们讨论了线性回归在住房价格预测中的应用,提出了成本函数的概念,并介绍了学习的梯度下降法。

模型与成本函数(Model and Cost Function)

模型表示

视频地址

我们的第一个学习算法是线性回归算法,在这段视频中,你会看到这个算法的概况。更重要的是你将会了解监督学习过程完整的流程,让我们通过一个例子来开始。

这个例子是预测住房价格的,我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。

在这里我要根据不同房屋尺寸所售出的价格 画出我的数据集,比方说,我们来看这个数据集,你有一个朋友正想出售自己的房子。如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱,那么你可以做的一件事就是,构建一个模型,也许是条直线,从这个数据模型上来看。也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。

那么这就是监督学习算法的一个例子,它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们根据我们的数据来说,房子实际的价格是多少,而且更具体来说,这是一个回归问题。回归一词指的是我们根据之前的数据预测出一个准确的输出值。对于这个例子就是价格。

同时,还有另一种最常见的监督学习方式,叫做分类问题。当我们想要预测离散的输出值,例如,如果我们正在寻找癌症肿瘤并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。

更进一步来说,在监督学习中我们有一个数据集,这个数据集被称训练集,因此对于房价的例子,我们有一个训练集,包含不同的房屋价格。我们的任务就是从这个数据中学习预测房屋价格。

现在我们给出这门课中经常使用的一些符号定义,我们要定义颇多符号,不过没关系,现在你记不住所有的符号也没关系,随着课程的进展,你会发现记住这些符号会很有用。我将在整个课程中用小写的m来表示训练样本的数目

因此 在这个数据集中,如果表中有47行,那么我们就有47组训练样本,$m$就等于47。让我用小写字母$x$来表示输入变量,往往也被称为特征量,这就是用$x$表示输入的特征,并且我们将用$y$来表示输出变量或者目标变量,也就是我的预测结果。那么这就是第二列,在这里我要使用$(x,y)$来表示一个训练样本,所以在这个表格中的单独的一行对应于一个训​​练样本,为了表示某个训练样本,我将使用$x^{(i)}$与$y^{(i)}$来表示。并且用这个表示第$i$个训练样本,所以这个上标$i$不是求幂运算,这个$(x^{(i)},y^{(i)})$括号里的上标$i$只是一个索引,表示我的训练集里的第i行。这里不是x的i和y的i次方,仅仅是指$(x^{(i)},y^{(i)})$是在此表中的第$i$行。

举个例子$x^{(1)}$指的是第一个训练集里值为2104的输入值,这个就是第一行里的$x$,$x^{(2)}$ 等于1416吧?这是第二个$x$,$y^{(1)}$等于460,这是我第一个训练集样本的$y$值,这就是$^{(1)}$所代表的含义。

像之前一样,我会问你一个问题,需要几秒的时间检查一下你的理解程度,在这个视频片段中,有时会有视频选择题弹出,当它弹出的时候,请使用鼠标来选择你认为正确的答案。这就是一个监督学习算法的工作方式。我们可以看到这里有我们的训练集里房屋价格,我们把它喂给我们的学习算法,这就是学习算法的工作了。然后输出一个函数,按照惯例,通常表示为小写h,$h$代表hypothesis(假设),$h$表示一个函数,输入是房屋尺寸大小。就像你朋友想出售的房屋。因此 h 根据输入的$x$值来得出$y$值,$y$值对应房子的价格,因此,$h$是一个从$x$到$y$的函数映射。

人们经常问我为什么这个函数被称作假设(hypothesis),你们中有些人可能知道hypothesis的意思,从字典或者其它什么方式可以查到。其实在机器学习中这是一个在早期被用于机器学习的名称,它有点绕口。对这类函数来说,这可能不是一个很恰当的名字,对表示从房屋的大小到价格的函数映射,我认为这个词“hypothesis”可能不是最好的名称,但是这是人们在机器学习中使用的标准术语。所以不用太纠结人们为什么这么叫它。

当设计学习算法的时候,我们接下来需要去思考的是怎样得到这个假设$h$,对于这一点在接下来的几个视频中我将选择最初的使用规则,$h$代表hypothesis。我们将会这么写:

为了方便有时非书面形式也可以这么写:$h_{θ}(x)$,我就写成$h(x)$,这是缩写方式。但一般来说我会保留这个下标$θ$。所以这就是数据集和函数的作用:用来预测。有时候我们会有更复杂的函数,也许是非线性函数,但是由于线性方程是简单的形式,我们将先从线性方程的例子入手。当然最终我们将会建立更复杂的模型,以及更复杂的学习算法。好吧,让我们也给这模型起一个名字,这个模型被称为线性回归(linear regression)模型。另外,这实际上是关于单个变量的线性回归,这个变量就是x。根据x来预测所有的价格函数,同时 对于这种模型有另外一个名称,称作单变量线性回归,单变量是对一个变量的一种特别的表述方式,总而言之这就是线性回归,在接下来的视频中我们将开始讨论如何去实现这种模型。

代价函数

视频地址

在这段视频中我们将定义代价函数的概念,这有助于我们弄清楚如何把最有可能的直线与我们的数据相拟合。在线性回归中我们有一个像这样的训练集,记住,$M$代表了训练样本的数量。所以,比如$M = 47$。而我们的假设函数,也就是用来进行预测的函数,是这样的线性函数形式。

接下来我们会引入一些术语,这些$θ_{0}$和$θ_{1}$,这些$θ_{i}$我把它们称为模型参数。在这个视频中,我们要做的就是谈谈如何选择这两个参数值$θ_{0}$和$θ_{1}$。选择不同的参数$θ_{0}$和$θ_{1}$,我们会得到不同的假设,不同的假设函数,我知道你们中的有些人可能已经知道我在这张幻灯片上要讲的,但我们还是用这几个例子来复习回顾一下。如果$θ_{0}=1.5$,$θ_{1}=0$ 那么假设函数会看起来是这样:

因为你的假设函数是$h(x) = 1.5 + 0 * x$是这样一个常数函数 恒等于1.5

如果$θ_{0} = 0$并且$θ_{1} = 0.5$, 那么假设会看起来像这样:

它会通过点$(2,1)$。这样你又得到了$h(x)$或者$h_{θ}(x)$。但是有时我们为了简洁会省略$θ$。因此$h(x)$将等于$0.5$倍的$x$。就像这样。

最后,如果$θ_{0} = 1$并且$θ_{1} = 0.5$。我们最后得到的假设会看起来像这样:

让我们来看看它应该通过点$(2,2)$,这是我的新的$h(x)$或者写作$h_{θ}(x)$。你还记得之前我们提到过$h_{θ}(x)$的。但作为简写,我们通常只把它写作$h(x)$。

在线性回归中,我们有一个训练集,可能就像我在这里绘制的。我们要做的就是得出$θ_{0}$、$θ_{1}$这两个参数的值,来让假设函数表示的直线尽量地与这些数据点很好的拟合。也许就像这里的这条线一样:

那么我们如何得出$θ_{0}$、$θ_{1}$的值来使它很好地拟合数据的呢?我们的想法是我们要选择能使$h(x)$,也就是输入$x$时我们预测的值,最接近该样本对应的$y$值的参数$θ_{0}$、$θ_{1}$。所以,在我们的训练集中我们会得到一定数量的样本。我们知道$x$表示卖出哪所房子,并且知道这所房子的实际价格。所以我们要尽量选择合适的参数值,使得在训练集中给出的$x$值,我们能合理准确地预测$y$的值。

Idea: Choose $θ_{0}$、$θ_{1}$ so that $h_{θ}(x)$ is close to $y$ for our training examples $(x,y)$.

让我们给出标准的定义:在线性回归中我们要解决的是一个最小化问题。所以我要写出关于$θ_{0}$、$θ_{1}$的最小化,而且我希望这个式子极其小,我想要$h(x)$和$y$之间的差异要小。我要做的事情是尽量减少假设的输出与房子真实价格之间的差的平方。

接下来我会详细的阐述。

别忘了,我用符号$(x^{(i)},y^{(i)})$代表第i个样本,所以我想要做的是对所有训练样本进行一个求和,对$i = 1$到$i = m$的样本将对假设进行预测得到的结果,此时的$x^{i}$输入是第$i$号房子的面积。将第$i$号对应的预测结果减去第$i$号房子的实际价格,所得的差的平方相加得到总和而我希望尽量减小这个值,也就是预测值和实际值的差的平方误差和,或者说预测价格和实际卖出价格的差的平方。

我说了这里的$m$指的是训练集的样本容量。而为了让表达式的数学意义变得容易理解一点,我们实际上考虑的是这个数的$1/m$。因此我们要尝试尽量减少我们的平均误差,也就是尽量减少其$1/2m$。通常是这个数的一半。

前面的这些只是为了使数学更直白一点,因此对这个求和值的二分之一求最小值应该得出相同的$θ_{0}$值和相同的$θ_{1}$值来,在这里

而这个表达式

意味着我们要找到$θ_{0}$和$θ_{1}$的值来使这个表达式的值最小。这个表达式因$θ_{0}$和$θ_{1}$的变化而变化。

因此,简单地说,我们正在把这个问题变成:找到能使我的训练集中预测值和真实值的差的平方的和的$1/2m$最小的$θ_{0}$和$θ_{1}$的值。因此,这将是我的线性回归的整体目标函数。为了使它更明确一点,我们要改写这个函数。

按照惯例我要定义一个代价函数:

正如屏幕中所示,这里的这个公式我们想要做的就是关于$θ_{0}$和$θ_{1}$对函数$J(θ_{0}$,$θ_{1})$求最小值。这就是我的代价函数。代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。事实上我们之所以要求出误差的平方和,是因为误差平方代价函数对于大多数问题,特别是回归问题,都是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。

在后续课程中,我们还会谈论其他的代价函数。但我们刚刚讲的选择是对于大多数线性回归问题非常合理的。好吧,所以这是代价函数,到目前为止我们已经介绍了代价函数的数学定义,也许这个函数$J(θ_{0}$,$θ_{1})$有点抽象,可能你仍然不知道它的内涵,在接下来的几个视频里我们要更进一步解释代价函数$J$的工作原理,并尝试更直观地解释它在计算什么,以及我们使用它的目的。

代价函数 实例1

视频地址

在上一个视频中我们给了代价函数一个数学上的定义,在这个视频里 让我们通过一些例子来获取一些直观的感受,看看代价函数到底是在干什么。

回顾一下,这是我们上次所讲过的内容:我们想找一条直线来拟合我们的数据,所以我们用θ0,θ1等参数得到了这个假设,而且通过选择不同的参数,我们会得到不同的直线拟合。然后我们还有一个代价函数,这就是我们的优化目标。

假设(Hypothesis):

参数(Parameters):

代价函数(Cost Function):

目标(Goal):

在这个视频里,为了更好地将代价函数可视化,我将使用一个简化表示方法来表示假设函数、参数、代价函数以及目标:

简化的假设函数(Hypothesis):

简化的参数(Parameters):

简化的代价函数(Cost Function):

简化的目标(Goal):

我们可以将这个假设函数看成是把$θ_{0}$设为0,所以我只有一个参数,也就是$θ_{1}$。代价函数看起来与之前的很像,唯一的区别是现在$h(x) = θ_{1} * x$,只有一个参数$θ_{1}$,所以我的优化目标是将$J(θ_{1})$最小化。用图形来表示就是,如果$θ_{0}$等于零,也就意味这我们选择的假设函数会经过原点,也就是经过坐标$(0,0)$。通过利用简化的假设得到的代价函数 我们可以试着更好地理解代价函数这个概念。

我们要理解的是这两个重要的函数:第一个是假设函数,第二个是代价函数。

$h_{θ}(x)$ :假设函数 $J(θ_{1})$ :代价函数
(for fixed $θ_{1}$,this is a function of x) (function of the parameter $θ_{1}$)

注意这个假设函数$h_{θ}(x)$对于一个固定的$θ_{1}$是一个关于$x$的函数。所以这个假设函数就是一个关于$x$这个房子大小的函数。与此不同的是,代价函数$J$是一个关于参数$θ_{1}$的函数,而$θ_{1}$控制着这条直线的斜率。通过上图我们可以很好的理解,比如说这里是我的训练样本,它包含了三个点$(1,1)$,$(2,2)$和$(3,3)$。现在我们选择一个值$θ_{1}$,所以当$θ_{1} = 1$,如果这是我选择的$θ_{1}$,那么我的假设函数看起来就会像是这条直线。我将要指出的是,X轴是表示房子大小的量。现在暂时把$θ_{1}$定为1,我想要做的就是算出在$θ_{1} = 1$的时候$J(θ_{1})$等于多少。所以我们按照这个思路来计算代价函数的大小,和之前一样,代价函数定义如下:

对这个误差平方项进行求和,这就等于这样一个形式,简化以后就等于三个0的平方和,当然还是0。现在,在代价函数里,我们发现所有这些值都等于0。因为对于我所选定的这三个训练样本$(1,1)$,$(2,2)$和$(3,3)$,如果$θ_{1} = 1$,那么$h_{θ}(x^{(i)})$就会正好等于$y^{(i)}$。所以$h(x) - y$所有的这些值都会等于零。这也就是为什么$J(1) = 0$。所以我们现在知道了$J(1) = 0$,如下图,要注意的是,因为我的代价函数是关于参数$θ_{1}$的函数,当我描绘我的代价函数时,$X$轴就是$θ_{1}$。

现在我有$J(1) = 0$,让我们继续把函数画出来,结果我们会得到这样一个点。

现在我们来看其它一些样本$θ_{1}$可以被设定为某个范围内各种可能的取值,所以$θ_{1}$可以取负数、0或者正数。所以如果$θ_{1} = 0.5$会发生什么呢?继续把它画出来:

这条线的斜率等于0.5,现在让我们计算$J(0.5)$。

让我们把点画出来:

让我们试试$θ_{1}$等于0,$J(0)$会等于多少呢?如果$θ_{1} = 0$,那么$h(x)$就会等于一条水平的线。如下图:

计算$J(0)$:

所以让我们接着把这个点也画出来,所以这个点最后是2.3:

当然我们可以接着设定$θ_{1}$等于别的值进行计算,你也可以把$θ_{1}$设定成一个负数,所以如果$θ_{1}$是负数,那么h(x)将会等于,打个比方说-0.5乘以x然后$θ_{1}$就是-0.5,那么这将会对应着一个斜率为-0.5的假设函数,而且你可以 继续计算这些误差。结果你会发现对于0.5结果会是非常大的误差,最后会得到一个较大的数值,类似于5.25,等等。对于不同的$θ_{1}$,你可以计算出这些对应的值,结果你会发现,你算出来的这些值,你得到一条这样的曲线,通过计算这些值,你可以慢慢地得到这条线,这就是$J(θ)$的样子了。

我们来回顾一下,任何一个$θ_{1}$的取值对应着一个不同的假设函数,或者说对应着左边一条不同的拟合直线。对于任意的$θ_{1}$你可以算出一个不同的$J(θ1)$的取值。举个例子,你知道的$θ_{1} = 1$时对应着穿过这些数据的那条直线,当$θ_{1} = 0.5$,对应着上面斜率为0.5的那条直线,然后$θ_{1} = 0$,对应着过原点的水平的线。所以对于任意一个$θ_{1}$的取值,我们会得到一个不同的$J(θ_{1})$,而且我们可以利用这些来描出上边的这条曲线。

现在你还记得学习算法的优化目标,是我们想找到一个$θ_{1}$的值来将$J(θ_{1})$最小化,这是我们线性回归的目标函数。嗯,看这条曲线,让$J(θ_{1})$最小化的值 是$θ_{1} = 1$,然后你看,这个确实就对应着最佳的通过了数据点的拟合直线,这条直线就是由$θ_{1} = 1$的设定而得到的,然后,对于这个特定的训练样本,我们最后能够完美地拟合。这就是为什么最小化$J(θ_{1})$对应着寻找一个最佳拟合直线的目标。总结一下,在这个视频里我们看到了一些图形来理解代价函数,要做到这个,我们简化了算法,让这个函数只有一个参数$θ_{1}$,也就是说我们把$θ_{0}$设定为0,在下一个视频里我们将回到原来的问题的公式,然后看一些带有$θ_{0}$和$θ_{1}$的图形,也就是说不把$θ_{0}$设置为0了,希望这会让你更好地理解在原来的线性回归公式里代价函数$J$的意义。

代价函数 实例2

视频地址

这节课中,我们将更深入地学习代价函数的作用。这段视频的内容假设你已经认识轮廓图,如果你对轮廓图不太熟悉的话,这段视频中的某些内容你可能会听不懂。但不要紧,如果你跳过这段视频的话,也没什么关系。不听这节课对后续课程理解影响不大。

和之前一样,这是我们的几个重要公式:

假设(Hypothesis):

参数(Parameters):

代价函数(Cost Function):

目标(Goal):

跟前一节视频不同的是 我还是把$θ$写成$θ_{0}$、$θ_{1}$的形式,便于这里我们要对代价函数进行的可视化。和上次一样,首先来理解假设$h$和代价函数$J$。

这是房价数据组成的训练集数据:

让我们来构建某种假设:如果我假设$θ_{0} = 50$,$θ_{1} = 0.06$的话,那么我将得到这样一个假设函数:

那么现在的代价函数图像要怎么画呢?上一节我们只有一个$θ$,我们画出来的图形是一个倒过来的抛物线图,可是现在我们有了两个变量:$θ_{0}$和$θ_{1}$,我们的代价函数图就成了一个三维曲面图,水平方向的两个轴分别表示$θ_{0}$和$θ_{1}$,我们要在下面画出代价函数的图像:

随着你改变$θ_{0}$和$θ_{1}$的大小,你会得到不同的代价函数 $J(θ_{0}$,$θ_{1})$对于某个特定的点$(θ_{0}$,$θ_{1})$这个曲面的高度,也就是竖直方向的高度,就表示代价函数$J(θ_{0}$,$θ_{1})$的值。

不难发现这是一个弓形曲面。我们来看看三维图,旋转一下这个图你就更能理解这个弓形曲面所表示的代价函数了:

在这段视频的后半部分,为了描述方便,我将不再像这样给你用三维曲面图的方式解释代价函数$J$,而是用轮廓图(contour plot)来表示,下边就是一个轮廓图

两个轴分别表示$θ_{0}$和$θ_{1}$,而这些一圈一圈的椭圆形,每一个圈就表示$J(θ_{0}$,$θ_{1})$相同的所有点的集合。如果你之前没怎么接触轮廓图的话,你就这么想:一个弓形的函数从屏幕里冒出来,因此最小值也就是这个弓形的最低点就是这个点,也就是这一系列同心椭圆的中心点。因此轮廓图是一种很方便的方法 能够直观地观察代价函数$J$。

接下来让我们看几个例子:

$h_{θ}(x)$ :假设函数 $J(θ_{1})$ :代价函数
(for fixed $θ_{0}$,$θ_{1}$,this is a function of x) (function of the parameter $θ_{0}$,$θ_{1}$)

在代价函数的图上这一点表示$θ_{0} = 800$,$θ_{1} = -0.15$,坐标为$(800,-0.15)$。而这个点也对应于左边这样一条线,$θ_{0} = 800$也就是跟纵轴相交于大约800,斜率大概是-0.15。当然,这条线并不能很好地拟合数据。并且你也发现了,这个代价值,距离最小值点还很远。也就是说这个代价值还是算比较大的,因此不能很好拟合数据。

让我们再来看另一个假设:

$h_{θ}(x)$ :假设函数 $J(θ_{1})$ :代价函数
(for fixed $θ_{0}$,$θ_{1}$,this is a function of x) (function of the parameter $θ_{0}$,$θ_{1}$)

你不难发现,这依然不是一个好的拟合,但比刚才稍微好一点。这里$θ_{0} = 360$,$θ_{1} = 0$。因此这组$θ$值对应的假设是:$h(x) = 360 + 0 × x$,这个假设同样也有某个代价值,而这个代价值就对应于这个代价函数在这一点的高度。

让我们再来看另一个例子:

$h_{θ}(x)$ :假设函数 $J(θ_{1})$ :代价函数
(for fixed $θ_{0}$,$θ_{1}$,this is a function of x) (function of the parameter $θ_{0}$,$θ_{1}$)

这个点其实不是最小值,但已经非常靠近最小值点了。这个点对数据的拟合就很不错。这个点虽然不在最小值点,但非常接近了。因此误差平方和,或者说训练样本和假设的距离的平方和,非常接近于最小值。尽管它还不是最小值。

通过这些图形我希望你能更好地理解这些代价函数$J$所表达的值,它们是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点更接近于代价函数$J$的最小值。当然我们真正需要的是一种有效的算法,能够自动地找出这些使代价函数$J$取最小值的参数$θ_{0}$和$θ_{1}$来。我想我们也不希望编个程序,把这些点画出来,然后人工的方法来读出这些点的数值。这很明显不是一个好办法。事实上我们后面就会学到,我们会遇到更复杂、更高维度、更多参数的情况,这在我们在后面的视频中很快就会遇到。而这些情况是很难画出图的,因此更无法将其可视化。因此我们真正需要的是编写程序来找出这些最小化代价函数的$θ_{0}$和$θ_{1}$的值。在下一节视频中 我们将介绍一种算法能够自动地找出能使代价函数$J$最小化的参数$θ_{0}$和$θ_{1}$的值