《机器学习》笔记-线性模型(3)

作者:刘才权

编辑:李文臣

写在前面

1

如今机器学习和深度学习如此火热,相信很多像我一样的普通程序猿或者还在大学校园中的同学,一定也想参与其中。不管是出于好奇,还是自身充电,跟上潮流,我觉得都值得试一试。对于自己,经历了一段时间的系统学习(参考《机器学习/深度学习入门资料汇总》),现在计划重新阅读《机器学习》[周志华]和《深度学习》[Goodfellow et al]这两本书,并在阅读的过程中进行记录和总结。这两本是机器学习和深度学习的入门经典。笔记中除了会对书中核心及重点内容进行记录,同时,也会增加自己的理解,包括过程中的疑问,并尽量的和实际的工程应用和现实场景进行结合,使得知识不只是停留在理论层面,而是能够更好的指导实践。记录笔记,一方面,是对自己先前学习过程的总结和补充。 另一方面,相信这个系列学习过程的记录,也能为像我一样入门机器学习和深度学习同学作为学习参考。

章节目录

  • 基本形式
  • 线性回归
  • 对数几率回归
  • 线性判别分析
  • 多分类学习
  • 类别不平衡问题

基本形式

给定d个属性描述示例x=(x1;x2;...;xd),其中xi是x在第i个属性上的取值,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即,

一般用向量形式写成,

其中,w=(w1;w2;...;wd)。w和b学得之后,模型就得以确定。

线性回归

给定数据集D={(x1,y1),(x2,y2),...,(xm,ym)},其中,xi=(xi1;xi2;...;xid),yi∈R。“线性回归”(linear regression)试图学得一个线性模型以尽可能准确的预测实际输出标记。

我们先考虑一种最简单的情况:输入属性的数目只有一个。线性回归试图学得,

如何确定w和b呢?显然,关键在于如何衡量f(x)与y之间的差别。第二章中介绍过,均方误差是回归任务中常用的性能度量,因此我们可以试图让均方误差最小化,即,

均方误差有非常好的几何意义,它对应了常用的欧几里得距离或简称“欧式距离”(Euclidean distance)。基于均方误差最小化进行模型求解的方法称为“最小二乘法”(least square method)。在线性回归中,最小二乘法就是输入找到一条直线,使所有样本到直线上的欧式距离之和最小。

求解w和b使,

最小化的过程,称为线性回归模型的最小二乘“参数估计”(parameter estimation)。我们可以将E(w,b)分别对w和b求导,得到,

然后,领上面的式子为零,从而求得w和b的最优解,

更一般的情况是数据集D,样本由d个属性描述。此时我们试图学得,

这称为“多元线性回归”(multivariate linear regression)。 类似的,可利用最小二乘法来对w和b进行估计。为了便于讨论,我们把w和b吸入向量形式,

相应的,把数据集D表示为一个mx(d+1)大小的矩阵X,其中,每行对应于一个示例,该行前d个元素对应于示例的d个属性值,最后一个元素恒置为1,即,

再把标记也写成向量形式y=(y1;y2;...;ym),则有,

当[公式2-1]

为满秩矩阵(full-rank matrix)或正定矩阵(positive definite matrix)时,可求得,

然而,显示任务中[公式2-1]往往不是满秩矩阵。例如许多任务中我们会遇到大量的变量,其数目甚至超过样例数,导致X的列数大于行数,[公式2-1]显然不满秩。此时可解出多个w,他们都能使均方误差最小化。选择哪一个最为输出,将由学习算法的归纳偏好决定,常见的做饭是引入正则化(regularization)项。 更一般地,考虑单调可微函数g(.),令

这样得到的模型称为“广义线性模型”(generalized linear model)。

对数几率回归

上一节讨论了如何使用线性模型进行回归学习,但若要做的是分类任务该怎么办?这里可以考虑广义线性模型:只要找到一个单调可微函数将分类任务的真实标记y与线性回归模型的预测值联系起来。

考虑二分任务,其输出标记y∈{0,1},而线性回归模型产生的预测值,

是实值,于是,我们需将实值z转换为0/1值。最理想的是单位阶跃函数(unit-step function)。

但单位阶跃函数不连续,因此不能作为广义线性模型。于是我们希望找到能在一定程度上近似单位阶跃函数的“替代函数”(surrogate function),并希望它单调可微分。对数几率函数(logistic function)正是这样一个常用的替代函数(Sigmoid函数):

即,

函数如下图所示,

下面我们来看如何确定w和b,

我们可以通过“极大似然法”(maximum likelihood method)来估计w和b,

根据凸优化理论,经典的数值优化算法如梯度下降法(gradient descent method)、牛顿法(Newton method)都可以求得最优解。

线性判别分析

线性判别分析(Linear Discriminant Analysis,简称LDA)的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同样样例的投影点尽可能接近,异类样例的投影点尽可能远离;对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置确定新样本的类别,如下图所示,

多分类LDA将样本投影到d'维空间,d'通常小于数据原有的属性数d,于是通过这个投影来减小样本点的维数,且投影过程中使用了类别信息,因此LDA也常被视为一种经典的监督降维技术。

多分类学习

现实中常遇到多分类学习任务。有些二分类学习方法可直接推广到多分类。

考虑N个类别C1,C2,...,CN,多分类学习的基本思路是“拆解法”,即将多分类任务拆为若干若干个二分类任务求解。具体来说,先对问题进行拆分,然后为拆出的每个二分类任务训练一个分类器;在测试时,对这些分类器的预测结果进行集成以获得最终的分类结果。

最经典的分类拆分策略有三种:

  • “一对一”(One vs One,简称OvO)
  • “一对其余”(One vs Rest,简称OvR)
  • “多对多”(Many vs Many)。

多分类过程如下图所示(OvO与OvR示意图),

类别不平衡问题

前面介绍的分类学习方法都有一个共同的基本假设,即不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。

针对这种情况,现有技术上塔体有三类做法(假定正类样例较少,反例样例较多):

  • 第一类是直接对训练集里的反例样本进行“欠采样”(undersampling),即去除一些反例使得正、反例数目接近,然后在进行学习;
  • 第二类是对训练集里的正类样例进行“过采样”(oversampling),即增加一些正例使得正、反例数目接近,然后再进行学习;
  • 第三类则是直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将“再缩放”(rescaling)嵌入到过程中,称为“阈值移动”(threshold-moving);

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2018-01-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1210
来自专栏desperate633

LeetCode Invert Binary Tree题目分析

Invert a binary tree. 4 / \ 2 7 / \ / \1 3 6 9 to4 / \ 7 2 / \ / \9 6 3 1 Tri...

871
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

2878
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2607
来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1K4
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1736
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3467
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4519
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19710

扫码关注云+社区