分类器的作用:常规任务是利用给定的类别、已知的训练数据来学习分类规则和分类器,然后对未知数据进行分类(或预测)。逻辑回归(logistics)、SVM等常用于解决二分类问题,对于多分类问题(multi-class classification),比如识别手写数字,它需要10个分类,同样也可以用逻辑回归或SVM,只是需要多个二分类来组成多分类,但这样容易出错且效率不高,常用的多分类方法有softmax。
分类算法:划分为了两类
1.基于概率密度的方法和基于判别函数的方法。
2.根据监督方式划分分类算法,分类学习问题可分为三大类:有监督分类、半监督分类和无监督分类。
Softmax 函数的定义如下所示:
其中,Vi 是分类器前级输出单元的输出。i 表示类别索引,总的类别个数为 C。Si 表示的是当前元素的指数与所有元素指数和的比值。Softmax 将多分类的输出数值转化为相对概率,更容易理解和比较。
使用softmax激励函数作为输出层的多层感知机,卷积层和池化层每个的输出代表高级特征,目的是用这些特征进行分类。加入全连接层也是学习特征之间非线性组合的有效办法。卷积层和池化层提取出来的特征很好,但是如果考虑这些特征之间的组合,就更好了。
Softmax函数把任意实值的向量转变成元素取之0到1且和为1的向量。将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。
以Bernoulli(伯努利) 分布为模型建模的,顾名思义,逻辑分类,是一种二分类法,能将数据分成0和1两类。logistic分类的流程比较简单,主要有线性求和,sigmoid函数激活,计算误差,修正参数这4个步骤。前两部用于判断,后两步用于修正。
线性求和以及sigmoid函数
假设有一个n维的输入列向量 x,也有一个n维的参数列向量h, 还有一个偏置量b, 那么就可以线性求和得到z
此时因为z的值域是[−∞,+∞] ,是无法根据z来判断x 到底是属于0还是1的。因此我们需要一个函数,来将z的值映射到[0,1]之间, 这就是激活函数。激活函数有很多种,这里的激活函数是sigmoid函数。
sigmoid函数形状为
可以看到它是介于0~1之间。那么在判断的时候,首先对之前得到的z代入sigmoid函数
当 a 大于0.5的时候,我们判定x应属于1类,如果小于0.5,则属于0类。这样,就完成了判断的工作 。
详细过程:https://www.cnblogs.com/yinheyi/p/6131262.html
误差计算以及参数修正
上面完成的判断过程中用到了参数向量h和偏置量b。 可以说,h和b的值直接关系到logistic判断的准确性。那么这两组参数是如何获得的呢?这就涉及到了参数的修正。在最开始的时候,h中的值是随机的,而b的值是0. 我们通过不断的训练来使得h和b能够尽可能的达到一个较优的值。
那么如何训练呢?假设我们期望输入x的判定是y,而实际得到的判定值是a,那么我们定义一个损失函数C(a,y),通过修正h和b的值来使得C最小化,这是一个优化问题。在凸优化问题中,可以通过
来直接算得h和b的最优解。然而在某些情况下,例如数据规模很大,或者非凸优化问题中,则不能这么做,而是用迭代的方法来得到局部最优解。
其中 η 表示学习率。在这里,损失函数定为平方损失函数,即
那么可以得到
这样,就能够得到每次迭代的参数更新公式为
将logistic扩展到多分类
从之前可以看出,普通的logistic只能进行二分类,即只能够分为0或者1。那么如果这些样本属于多个类该怎么办呢?人们想了很多办法,例如一对多法,依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类需要构建k个分类器。还有一对一法,在任意两类样本之间设计一个分类器,k个类需要k(k-1)/2个分类器。
在这里,我们将输出由一个值更改为一个向量。例如有3个类,那么输出就是一个长度为3 的列向量,对应项的值为1,其他为0。即
分别表示第0,1,2个类。 也可以看成是原来若干个logistic分类器组合在一起。对应的某个分类器只对该类输出1,其他情况都输出0.从这一点上来讲,这个做法有点类似于一对多法。此时,由于输出从一个数成为一个向量,之前的公式都要加以修改。首先,原来的y,a,z,b变成了列向量, 向量hh变成了矩阵W。这样,判断部分的公式变为
此时的 σ 函数表示对向量中的每一个元素单独做运算。即
得到的a向量中,其最大值所在的位置索引即为判断出的分类。 参数修正部分的公式也是类似的,
注意有些向量之间是进行点乘的。
顾名思义,是提升的意思。弱分类器转化为强分类器---原理即三个臭皮匠,赛过诸葛亮一样。把很多分类准确率很低的分类器通过更新对数据的权重,集成起来形成一个分类效果好的分类器。
它是一种框架算法,先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:
其中,h(x;am)是一个个的弱分类器,am是弱分类器学习到的最优参数,βm是弱学习在强分类器中所占比重,P是所有am和βm的组合,这些弱分类器线性相加组成强分类器。
前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:
由于采用的损失函数不同,Boosting算法有很多不同的类型,其中比较经典的有AdaBoost,其损失函数为指数损失的。
Boosting有一个重大缺陷,即该算法要求事先知道弱分类算法分类正确率的下限,这在实际问题中很难做到。
Adaptive Boosting,自适应增强。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
Adaboost 迭代算法分为3步:
算法流程
给定一个训练数据集T={(x1,y1), (x2,y2)…(xN,yN)},其中实例,而实例空间,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
算法流程如下:
1.初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N。
2.进行多轮迭代,用m = 1,2, ..., M表示迭代的第多少轮
a.使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):
b.计算Gm(x)在训练数据集上的分类误差率
由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。
c.计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):
由上述式子可知,em≤1/2时,am≥0,am随em减小而增大,分类误差率越小的基本分类器在最终分类器中的作用越大。
d.更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代。
使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小,重点关注或聚焦于那些较难分的样本上。
其中,Zm是规范化因子,使得Dm+1成为一个概率分布:
3.组合各个弱分类器
从而得到最终分类器,如下:
实例
有如下的训练样本,我们需要构建强分类器对其进行分类。x是特征,y是标签。
令权值分布D1=(w1,1,w1,2,…,w1,10)
并假设一开始的权值分布是均匀分布:w1,i=0.1,i=1,2,…,10w1,i=0.1,i=1,2,…,10
现在开始训练第一个弱分类器。发现阈值取2.5时分类误差率最低,得到弱分类器为:
当然,也可用别的弱分类器,只要误差率最低即可。这里为了方便,用了分段函数。得到了分类误差率e1=0.3。
第二步计算G1(x)在强分类器中的系数
第三步更新样本的权值分布,用于下一轮迭代训练。由公式:
得到新的权值分布,从各0.1变成了:
可以看出,被分类正确的样本权值减小了,被错误分类的样本权值提高了。
第四步得到第一轮迭代的强分类器:
以此类推,经过第二轮……第N轮,迭代多次直至得到最终的强分类器。迭代范围可以自己定义,比如限定收敛阈值,分类误差率小于某一个值就停止迭代,比如限定迭代次数,迭代1000次停止。这里数据简单,在第3轮迭代时,得到强分类器:
的分类误差率为0,结束迭代。
F(x)=sign(F3(x))就是最终的强分类器。
借鉴博客:https://blog.csdn.net/mm_bit/article/details/46988925
support vector machines,支持向量机,是一个二分类的分类模型(经改造后也可用于多分类,但比较复杂)。分类的思想是,给定给一个包含正例和反例的样本集合,其目的是寻找一个超平面来对样本根据正例和反例进行分割,寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。
优点:
在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
如下面3个图,分类图1中的两类球,很简单,用一根棍子即可;但图2中一条直线貌似不能完成分类的任务,可以想象就像武侠片的大侠一样,拍下桌子,球飞到空中。然后,大侠抓起一张纸,插到了两种球的中间,如图2右边的部分;从直观的角度看这些球像是被一条曲线分开了,如图3。其中这些球叫做【data】,棍子叫做【classifier】, 最大间隙trick叫做【optimization】, 拍桌子叫做【kernelling】,那张纸叫做【hyperplane】。
如果一个线性函数能够将样本完全正确的分开,就称这些数据是线性可分的,否则称为非线性可分的。线性函数在一维空间里就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,如果不关注空间的维数,这种线性函数叫做超平面(Hyper Plane)。在样本空间中,划分超平面可通过如下线性方程来描述:
假设它已经完成了对样本的分隔,且两种样本的标签分别是{+1,-1},那么对于一个分类器来说,g(x)>0和个g(x)<0就可以分别代表两个不同的类别,+1和-1。
但光是分开是不够的,SVM的核心思想是尽最大努力使分开的两个类别有最大间隔,这样才使得分隔具有更高的可信度。而且对于未知的新样本才有很好的分类预测能力(在机器学习中叫泛化能力),SVM让间隔最大的办法是:让离分隔面最近的数据点具有最大的距离。为了描述离分隔超平面最近的数据点,需要找到两个和这个超平面平行和距离相等的超平面:
H1: y = wTx + b=+1 和 H2: y = wTx + b=-1
在这两个超平面上的样本点也就是理论上离分隔超平面最近的点,是它们的存在决定了H1和H2的位置,支撑起了分界线,它们就是所谓的支持向量,这就是支持向量机的由来。
由两个超平面就可以定义上面提到的间隔(margin)了,二维情况下 ax+by=c1和ax+by=c两条平行线的距离公式为:
可以推出H1和H2两个超平面的间隔为2/||w||,即现在的目的是要最大化这个间隔。所以support vector machine又叫Maximum margin hyper plane classifier(最大间隔超平面分类器),等价于最小化||w||,为了之后的求导和计算方便,进一步等价于最小化 。
假设超平面能将样本正确分类,则可令:
两个式子综合一下有:
这就是目标函数的约束条件。现在这个问题就变成了一个最优化问题:
而且这是一个凸二次规划问题,一般的解决方法有两种1是用现成的优化工具包直接求解,2是使用Lagrange Duality找到一种更有效的方法求解。
实例
svm的输入是一组向量以及每个向量对应的分类:
label,一般是-1或1,表示种类;
index:value, 向量值,如 1:0.78, 2:1, 3:-0.52, 4:-0.35, 5:0.56, 一般用一个一维数组表示
数据准备成上述格式,随机分成2份,一份用来训练模型,一份用来测试模型的准确性,以便根据测试结果调整训练参数。在线性不可分的情况下,使用RBF核效果比较好,现在很多软件可以自动完成这个对比、选择过程。
比如用svm进行垃圾邮件识别,大概步骤如下:
对邮件进行打标,垃圾邮件标为1,非垃圾邮件标为-1。对邮件内容进行分词,对每个词计算特征权重,然后通过归一化转化成-1到1之间的值,选择一个svm实现lib或软件,将准备好的这些向量和label带入训练,调整参数得到效果满足要求的模型。