Andrew机器学习课程笔记(3)—— K均值、SVM、PCA

来源:互联网 发布:mac系统升级教程 编辑:程序博客网 时间:2024/06/01 10:16

支撑向量机(SVM)

探讨 SVM 算法的五个问题:SVM的目标、SVM的机理、非线性SVM、多类别SVM、LR/SVM/NN算法的选择

SVM的目标

以二维特征为例,SVM旨在找到一条分类线,使得边界样本与之有最大的距离(margin):


图1-1. SVM分类器(图片来源:andrew机器学习课程视频)

如图1-1所示,SVM希望找到黑线作为分类准则,两条经过边界样本的蓝线与黑线确定了margin值

SVM的机理

教程从LR算法的目标函数出发,介绍了SVM的算法思路(简直碉堡了有没有)

比较LR和SVM的目标函数(图1-2),可以发现,两者实际上是几乎等价的,唯一的区别是cost函数由LR的对数形式换成了逼近它的折线形式(图2-1下)


图1-2. LR与SVM的目标函数(图片来源:andrew机器学习课程视频)

cost函数修改带来的差别是,SVM的边界筛选条件比LR更严格(图1-3):

                                                                   

                                                                                                      图1-3. SVM的筛选边界(图片来源:andrew机器学习课程视频)

此外,另一个不同是,LR输出的是该样本属于正样本的概率,而SVM输出0或1作为分类结果

那么,SVM是如何找到使得margin最大化的那条分类线的呢?

为了方便,首先改写SVM的目标函数

约束条件中,sita和x的乘积如果从向量内积的角度看,等价于sita的模 * x在sita方向上投影的模(图1-4)


图1-4. 向量内积(图片来源:andrew机器学习课程视频)

考虑一个极端的例子:两类样本分布在Y轴两侧,当然最好的分类线就是Y轴(图1-5右),现在假设当前分类线为过原点135度角的直线(图1-5左)


图1-5. SVM分类线的调整(图片来源:andrew机器学习课程视频)

可以看到,左图中x1在分类线的法线sita上的投影长度较短,为了保证内积大于1,必须增大sita的模值,但SVM的目标函数是最小化sita的模值。因此为了增加x1的投影长度,SVM需要将分类线往Y轴方向旋转。

需要说明的是,在这里假设了sita向量的第一个值为0(这样sita向量是过原点的)

非线性SVM

前面介绍的都是线性分类器,与LR基本差不多,然而SVM真正牛逼的地方在于非线性情况的处理

当决策面很复杂时,一种容易想到的方法是:增加特征数目(图1-6)

                                                       

                                                                                              图1-6. 增加特征复杂度(图片来源:andrew机器学习课程视频)

但特征构造实在是一件太麻烦,太经验化的事情

非线性SVM引入了核函数这样一个东西,听上去很高大上,但其实很简单:首先选择m个marks,然后计算由所有样本点组成的样本向量X与这些marks的相似度,每个相似度(一共m个)即为一个特征(加上sita0,一共有m+1个特征)

                                                 

图1-7. 非线性SVM(图片来源:andrew机器学习课程视频)

其中这个相似度计算函数就是核函数,一般用高斯核函数

那么随之而来的问题是:这m个marks如何选择?很简单,在样本点里选m个就好了

那为什么通过这种相似度计算的方式可以构造出一个高维的分类面呢?我的理解是:相似度计算实际反映的是每个样本点与marks的距离,这些距离的分布就构成了可能由常见函数都无法描述的分类曲线(对二维),所以实在是一种很天才的思路

多类别SVM

一个SVM一般只能对两类进行划分,如果类别数K大于2,则需要构造K个SVM达到多类别分类的目的

LR/SVM/NN算法的选择

假设特征数为n,样本数为m

1. 如果相对于m,n很大:为避免过拟合,选择LR或线性SVM
2. 如果n较小,m中等(比如n=1-1000, m=10-10000):选择非线性SVM
3. 如果n很小,而m相对很大:增加n,使用1的方法
当然,如果模型合适,神经网络(NN)是可以通杀的,但NN的麻烦在于,其训练速度较慢,并且模型的搭建是个技术活
因此有些情况SVM要比NN好用,此外,SVM解决的是一个凸优化问题,肯定可以找到最优解,不像NN一样容易陷入局部最优

K均值

探讨 K-Mean 算法的两个问题:位置初始化、聚类数目K的选取

位置初始化

假设聚类数目为K,K-Mean算法首先需要选定K个初始位置,然后计算每个样本到该位置的距离。
K-Mean算法的一般做法是:随机选取K个样本作为初始位置
但很多时候,初始位置的不同会给最终聚类结果带来很大影响(图2-1):

图2-1.  不同初始位置得到不同结果(图片来源:andrew机器学习课程视频)

图2-1展示了由于初始位置的不同,最终可能得到的3种聚类结果(当然我们希望得到第一种)。

那么怎么避免这种不确定性呢?很简单,重复初始化多次(比如100次),每次得到一种聚类结果,最后选择总体误差最小的那个

注意:当K足够大时,重复初始化的次数可以减少,甚至一次就够了(类别较多时随机分布也会更均衡)

K的选取

同样是重复试验的方法,比较不同K值对应的误差值(图2-2):


图2-2. K值的选取(图片来源:andrew机器学习课程视频

课程提出了“肘点”这一概念(图2-2左),认为选取肘点对应的K值即可。

但图左只是一种理想状况,更多时候的曲线其实是图2-2右的样子,因此Andrew表示,K值的选取最好还是按照实际需求来定(所以扯肘点只是聊聊天咯?。。。)


主成分分析(PCA)

探讨 PCA 的四个问题:PCA的目的、PCA的方法、维度K的选取、PCA的误区

PCA的目的

主成分分析的目标是,找到一种映射,将高维样本压缩为低维(K)样本:


图3-1. PCA的目标(图片来源:andrew机器学习课程视频)

PCA的关键是,找到一组向量(图左是u1,图右是(u1,u2)),使得所有样本到该向量(平面)的距离之和最小

PCA的方法

1. 数据预处理

计算所有样本点的均值,将所有样本值减去均值作为新的特征

如果不同特征的尺度相差较大,还需将每种特征归一化(再除以标准差)

2. 计算样本的协方差矩阵

这里假设共有m组样本,每个样本有n维

3. 计算协方差矩阵的特征向量

选取从大到小K个特征值对应的特征向量即为所求

在这里教程使用了更方便的 奇异值分解(svd):

                                         

图3-2. SVD方法求reduce映射矩阵(图片来源:andrew机器学习课程视频)

     如图3-2,选取U中前K个向量,即组成了reduce映射矩阵,乘以原始数据矩阵(n*m)即为降维后的新样本

维度K的选取

到底将维数压缩为多少合适呢?

Andrew建议在平均均方误差与样本方差之比尽可能小的情况下选取尽可能小的K值(下图左):

图3-3. 维度的选择

 如图3-3左所示,k值从1开始,不断计算平均均方误差与样本方差的比值,直到其小于0.01(原本数据的偏差有99%保存下来了)

图3-3右展示了一种更简单的方式:利用之前SVD计算得到的对角阵S,前K个对角线值之和与对角线上所有值之和的比例大于99%时即为所求

PCA的误区

1. PCA不是线性回归

  

图3-4. 线性回归(左)PCA(右)

2. 不要为了解决过拟合问题采用PCA(应该用正则化的方法),因为PCA不考虑结果变量y,可能会丢失一些重要的特征

3. PCA只在由于样本维数太大,导致算法运行太慢,或运行空间不足时才考虑,不要把其当成必备的数据预处理步骤

0 0
原创粉丝点击