在 上一周的课程 里,Andrew Ng 为我们介绍了什么是机器学习以及监督学习中的线性回归。对于一个监督学习,我们要确定我们的 预测函数,代价函数,然后利用梯度下降算法找到 代价函数 最小时,预测函数 中的参数值。这周我们会接触监督学习中一类新的问题,称为分类问题。
为了更好的阅读体验你可以在 网站 中查看,点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看( 无法访问 Github 的话可以点击 Coding 查看 ),代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第二周的笔记。
分类问题
对于监督学习中的分类问题,通常已知一些数据并知道它们各自属于什么类别,然后希望基于这些数据来判断新数据是属于什么类别的。比如已知一些症状特征和是否患有某种疾病的数据,基于这些数据来判断新的病人是否患病。再比如根据过去的垃圾邮件数据来判断新邮件是否为垃圾邮件。
预测函数
对于 线性回归 我们的 预测函数 为:
但这个 预测函数 的输出是个没有范围的连续值,并不适合分类问题。因此在 逻辑回归 中使用了:
来作 预测函数,其中 g(z) 被称为 Sigmoid 函数,它很好地将 预测函数 的输出值控制在 0、1 之间。( 下图为 Sigmoid 函数图像 )
这样就可以将 预测函数 解释为在给定 x 及参数 θ 的情况下,y=1( 属于这个分类 )的概率:
决策边界
对于分类问题,有一个新的概念称为 决策边界。由于最终我们必须决定输入数据是否属于某个分类,我们设定了 0.5 作为阈值,预测函数 输出大于 0.5 的就属于该分类,反之不属于。而 hθ(x) = 0.5 时,对应于 θTx=0。我们将 θTx=0 对应的曲线称为决策边界( 注意这里的 x 并不是指训练数据,决策边界是 hθ(x) 的属性,下图为作业中的决策边界 )。
代价函数
再来说说 逻辑回归 中的代价函数。如果沿用 线性回归 中的代价函数,我们会得到类似下图的曲线( 下图为单个特征 θ0 所对应的 代价函数 曲线,和 Ng 画的不太一样 ):
在这样的函数上使用梯度下降算法,最终很有可能在平坡处停止。在数学上我们已知如果一个函数是凸的,那么使用梯度下降一定能找到全局最小值。凸函数 是一个很强的限制,可以形象地理解为,在函数上任取一段都是向外凸的( 如下图,详细定义见 维基百科 )。
凸函数所以我们使用新的 代价函数 使得它满足 凸函数 的性质。
梯度下降
求解 代价函数 最值的方法还是 梯度下降 算法,所以我们需要对 J(θ) 进行求导( 求导的计算过程能够给你一个印象,知道求导的结果是怎么来的。但是为了让大家不要淹没在计算的细节中,文章都会省略计算给出最终结果的矩阵形式 )。
有了 代价函数 和 梯度 就能够自己实现梯度下降算法来求解问题了。不过在课程中 Ng 提到了几种 梯度下降 的优化算法,Conjugate descent、BFGS、L-BFGS。这些算法不需要指定学习率,而且能够更快地找到解,我们可以通过调用内置函数来完成学习( 在作业中由于没有 Octave 的 fminunc 函数,作为代替使用了 scipy 包中的 minimize 函数,算法用的是 BFGS )。
正则化
正则化 的引入是为了防止学习中的 过拟合现象。简单来说 过拟合现象 就是我们的学习算法将很多对问题并不重要的 细节特征甚至 噪声 都考虑了进来,认为它们是决策依据。就像对于作业 ex2_reg.py 中需要分类的数据,假设了 预测函数 :
过拟合
对于含有 28 个参数的 预测函数 ,可以拟合很多类型的数据,但对于作业中的数据有些特征并不需要。我们希望 J(θ) 取得最小的同时,特征的系数 θi 尽可能小。为此对 代价函数 做一些修改变成如下形式:
试中 λ 为正则化系数,用来平衡两个目标,一个是让前半部分的 代价函数 尽量小,一个是避免参数过大导致过拟合。后半部分正则化项中的 θ0 取零,因为一般不对其进行约束。线性回归 同样可以使用正则化的方法,这里我们只给出正则化后的代价函数:
如果使用正规方程求解的话,那么最后 θ 的解为:
正则化 是一个蛮大的主题,在这里一时半会没法讲全,自己理解的也不透彻,等有了更好的体会时再与大家分享。
So~,第二周的内容就是这些了,谢谢大家耐心阅读。
网友评论