赞
踩
Arthur Samuel是机器学习领域的先驱之一,编写了世界上第一个棋类游戏的人工智能程序。
Machine Learning is fields of study that gives computers the ability to learn without being explicitly programmed.(机器学习是这样的领域,它赋予计算机学习的能力(这种学习能力)不是通过显著性编程获得的)
例:编写程序让计算机自动区别菊花和玫瑰
1.显著式编程:人为告诉计算机菊花为黄色,玫瑰为红色,计算机看到黄色就识别为菊花,看到红色就识别为玫瑰
2.非显著式编程:给计算机一堆菊花和一堆玫瑰的图片,编写程序,让计算机自己去总结菊花和玫瑰的区别。如菊花是黄色,玫瑰是红色;菊花花瓣很长,玫瑰花瓣很圆等。不约束计算机要总结出什么规律,让计算机自己挑出最能区分的一些规律。
让计算机自己总结规律的编程方法,叫做非显著式编程。
例:机器人去教室外的咖啡机冲咖啡
1.显著式编程:发指令让机器人左转 — 朝前走5步— 右转 — …… —原路返回。要帮机器人把所处的环境调查得一清二楚(咖啡机在哪?咖啡机上的按钮在哪?机器人应该怎么走?)有这个时间,我们自己早就把咖啡冲好了嘞,要机器人有何用?
2.非显著式编程:我们规定了行为和收益函数后,让计算机自己去找最大化收益函数的行为。一开始,计算机采用随机化的行为,但只要程序编的足够好,计算机时可能找到一个最大化收益函数的行为模式的。
非显著式编程能让计算机通过数据,经验自动的学习,完成我们交给的任务。
1998年,Tom Mitshell编写的《Machine Learning》是机器学习领域中第一本成熟的教科书。
A computer program is said to learn from experience E with respect to some task T and some performance measure P,if its performance on T,as measured by P,improves with experience E.(一个计算机程序被称为可以学习,是指它能够针对某个任务T和某个性能指标P,从经验E中学习。这种学习的特点是,它在T上的被P所衡量的性能,会随着经验E的增加而提高)
注:经验E和性能P是由设计算法的人设计的,没有标准答案
例:编写程序让计算机自动区别菊花和玫瑰
任务T:编写计算机程序识别菊花和玫瑰 经验E:一大堆菊花和玫瑰的图片(training samples训练样本)Experience
性能指标P:(不同的机器学习算法会有不同),如识别率(Recognition Rate):让更多的菊花被识别为菊花,更多的玫瑰被识别为玫瑰,把识别的正确率简称识别率 Performance Measure
非显著式编程识别率随训练样本增加而增加;显著式编程一开始定死了程序的输入和输出,识别率不会随着训练样本增加而变化
例:机器人去教室外的咖啡机冲咖啡
任务T:设计程序让机器人冲咖啡 经验E:机器人多次尝试的行为和这些行为产生的结果(摔打/撞墙/烫手/获得了咖啡)
性能测度P:在规定时间内成功冲好咖啡的次数
Tom Mitshell的定义比Arthur Samuel更加数学化,根据经验E来提高性能指标P的过程——典型的最优化问题。
分为监督学习和强化学习。
例:2垃圾邮件识别;3人脸识别
要搜集很多垃圾邮件和非垃圾邮件,同时对每一封邮件要告诉计算机,是垃圾邮件还是非垃圾邮件;要搜集很多张人脸图片,要告诉计算机每张人脸图片是谁。告诉计算机每一个训练样本是什么的过程,叫为训练数据打标签(Labeling for training data)
经验E —— 训练样本和标签的集合。
监督学习(Supervised Learning) 所有的经验E都是人工采集并输入计算机的(有教的过程)
为数据打标签需要繁琐的人工,(如现代人脸识别系统,需要数千万张带有标签的人脸图片,上万小时工作量,随着人工智能的发展,为数据打标签成了一个独特的产业)
例:1教计算机下棋;4无人驾驶
经验E—— 由计算机与环境交互获得经验,计算机产生行为并获得这个行为的结果,程序定义这些行为的收益函数(Reward function),对行为进行奖励和惩罚。例计算机下棋下赢了就奖励,下输了就惩罚;自动驾驶顺利到目的地就奖励,中途出了事故就惩罚。同时设计算法,让计算机自动改变自己的行为模式去最大化收益函数。
强化学习(Reinforcement Learning)让计算机通过与环境的互动逐渐强化自己的行为模式
a.传统的监督学习(Traditional Supervised Learning):每一个训练数据都有对应的标签。
——支持向量机(support vector machine)、人工神经网络(neural networks)、深度神经网络(deep neural network)
b.非监督学习(Unsupervised Learning):所有训练数据都没有对应的标签。
——聚类(clustering)、EM算法(Expectation-Maximization)、主成分分析(Principle component analysis)
c.半监督学习(Semi-supervised Learning):训练数据中一部分有标签,一部分没有标签。
研究热点,互联网技术普及,网络中有大量数据,但标注数据成本巨大,研究如何利用少量标注数据和大量未标注数据训练更好的机器学习算法。
a.分类(Classification):标签是离散的值
b.回归(Regression):标签是连续的值。预测股票价格、预测温度、预测人的年龄等任务。
!分类和回归问题的界限模糊,因为连续和离散的定义可以相互转换,分类的机器学习模型改造后可解决回归问题,反之亦然。
!误区:随着大数据和深度学习发展,只要收集足够多数据,从网上随便下载一个开源的算法模型,将数据扔进模型中训练,就能获得很好的结果,不正确!!!若正确也是误打误撞的结果。如果对数据好的感性认识就很难设计出好的算法。
例:识别红细胞和白细胞
可能被观察到:1.白细胞面积比红细胞大;2.白细胞没有红细胞圆;3.白细胞内部纹理比红细胞粗糙……
机器学习算法第一步:观察数据,总结规律;特征提取(Feature Extraction):通过训练样本获得的,对机器学习任务有帮助的多维数据。
提取这3种特征的方法:采用图像处理中的链码来提取细胞的边缘信息,从细胞的边缘信息推测出细胞的周长和面积;用基于边缘的信息用图像中的哈弗变换提起细胞的圆形程度;用灰度共生矩阵提取细胞的粗糙程度。
第二步:在提取特征后,对特征进行取舍,特征选择(Feature Selection)
可以看出,面积和周长两个特征中区分的准确度较高,圆形度识别度较低;也考虑了其他的特征,如灰度直方图的均值等,发现有些特征有一定的区分度,但总体上不如面积和周长特征的区分度高。——选择面积和周长作为区分白细胞和红细胞的特征。
!机器学习的重点不是研究如何提取特征,而是在假设已经提取好特征的前提下,研究合理的算法,获得更好的性能。但特征提取很重要,实践证明,提取了好的特征也能获得不错的性能,若提起的特征很差,不可能获得很好的性能。
第三步:基于特征选择 构建算法。机器学习的重点内容!不同的算法对特征空间做不同的划分,获得不同的结果。研究不同应用场景下应该采取哪种算法,以及研究新的机器学习算法以便适应新的场景。
a.绘制红细胞和白细胞特征空间图,横坐标代表面积特征,纵坐标代表周长特征,(归一化,特征数值变为-1到1),这两个特征组成的二维平面叫做特征空间(Feature Space)。(也有复杂的高维特征空间)绿点为红细胞,红十字为白细胞。
b.选择支持向量机(support vector machine):3种内核——线性内核、多项式内核、高斯径向基函数核(可看作3种不同机器学习算法)。利用3种方法,在特征空间上画出了3条不同的线。画曲线就是机器学习的过程。
c.通过计算面积和周长,把新样本绘制到图上,在线左边为红细胞,反之白细胞,实现预测识别
3种算法在测试集上准确率的比较:第二种算法线性核获得了最高的识别率。
维度:二维特征空间易发现规律,人眼对于超过三维的世界缺乏想象力,若特征维度很高(如提取了上万个特征,产生了上万维的特征空间)。标准:三种机器学习算法画出的线条不一样,对某些区域的划分不一样,哪条线更好呢?线是根据有限的训练样本画的,目的是预测新样本的类别,但无法穷尽所有的新样本,就无法确保每种画线的方法适用于什么样的情形。
对上一讲进行理论上的初步回答:哪一种机器学习算法更好。
1995年,D.H.Wolpert等人提取出没有免费午餐定理(No free lunch theorem):任何一个预测函数,如果在一些训练样本上表现好,那么必然在另一些训练样本上表现不好,若不对数据在特征空间的先验分布有一定的假设,那么表现好和表现不好的情况一样多。
没有免费午餐定理告诉我们:若不对特征空间的先验分布有假设,那么所有算法的表现都一样。机器学习的本质 是通过有限的已知数据,在复杂的高维特征空间中预测未知样本的属性和类别。但我们不知道未知样本在哪里,性质到底如何,因此再好的算法也存在犯错的风险。2.没有放之四海而皆准的最好算法,因为评价算法的好坏涉及到对特征空间先验分布的假设,然而没有人知道特征空间先验分布的真实样子
无论计算机的存储单元有多少,无论我们知道多少个类别,对于剩下的格子类别,结果不论对错的概率都是一半。(不管什么算法和我们随机的瞎猜是没有区别的)问题出在哪?是因为假设各种情况的先验概率一样。
在设计机器学习算法的时候,有一个假设:在特征空间上距离接近的样本,他们属于同一个类别的概率会更高。这个假设有道理吗?涉及哲学问题,什么是道理?(明天太阳会升起,但明天又没有来,我们怎么会知道没有来到的事实。因为我们从小到大无数次看到太阳升起,翻阅文献发现古人也无数次记录了太阳的升起。祖先甚至发明了物理的理论,用万有引力来论证太阳每天都会升起。综合这些事实,才认为明天太阳升起是有道理的)道理是从以前的事实中来的。通过类别推广到对未来的预测。
是否可能出错?很可能。X为蜜蜂,O为花,表示一只蜜蜂停在了花丛中,招呼其他伙伴一起过来采蜜。
没有免费午餐定理告诉我们没有放之四海而皆准算法,但在长期研究和实践中总结出一些适用于大多数应用场景、相对好的算法
上个世纪90年代提出的经典机器学习算法,尤其对于训练样本偏少的情况,支持向量机有着不错效果,其数学推倒用到了一系列优化理论(分类问题——凸优化问题),具有数学美感。
由俄罗斯Vladimir Vapnik提出,分两个步骤:1.解决线性可分问题;2.将线性可分问题中获得的结论推广到线性不可分情况。
线性可分(Linear Separable):存在一条直线将⚪和×分开。线性不可分(Nonlinear Separable):不存在一条直线将⚪和×分开
特征空间维度=2维——直线;特征空间维度=3维——平面;特征空间维度>3维时——超平面(Hyperplane)
用数学严格定义训练样本及标签:假设有N个训练样本和他们的标签 ,Xi为训练样本i的向量,有两个分量(在二维特征空间中)。yi为i的标签,若Xi属于C1---yi=+1。
若数据集线性可分——存在无数多个超平面将各个类别分开,哪个最好呢?
据没有免费午餐定理,在没有假设训练数据的先验分布情况下,三条线表现应一样,但大多数人觉得2号线最好。因为对训练样本先验分布有一定假设:假设训练样本的位置在特征空间上有测量误差,2号线更能抵御训练样本位置的误差。2号线是怎么画出来的?Vapnik给出的答案是基于最优化理论。支持向量:为平行线叉到的样本点。
间隔(Margin)最大的是2号线,使用Margin最大这个条件,不能唯一确定一条直线,这条线在上下两条平行线的中间。
支持向量机寻找的最优分类直线应满足:1.该直线分开了两类;2.该直线最大化间隔(margin);3.该直线处于间隔的中间,到所有支持向量距离相等。
如何用严格的数学——寻找最优分类超平面的过程——写成一个最优化问题?
假定训练样本集线性可分,支持向量机需要寻找的是最大化间隔的超平面,优化问题可以写成如下形式:
和一样。
目标:已知训练样本集{(xi,yi)},i=1-N,解出(w,b) ,把直线画出来。分开⚪和x,使间隔最大化。
支持向量机要找一个超平面,使它的间隔最大,又要在最中间,即离两边所有支持向量的距离相等。
用a去缩放wb,使得在支持向量上=1,在非支持向量上>1 (事实1);支持向量到超平面的距离公式,分子为1
最小化||w||的平方,优化问题定义为 和是一样,目的是后续的求导更方便。
支持向量到超平面的距离为在非支持向量上有(根据距离公式,分母一定,考虑距离)故(>=1可以改成>=2,w,b只相差一个a,事实1说明是同一个超平面)
凸优化中的二次规划问题, 二次规划的定义:1.目标函数(Objective Function)是二次项;2.限制条件是一次项。
凸优化问题无解/只有唯一最小值。凸优化问题只有唯一一个全局极值,可用梯度下降的算法求解。最简单的凸优化问题就是抛物线,根据f(w)梯度不断试探,若函数为凸,不管开始W0在哪,最后算法都会沿梯度逐步下降到全局最小值。 一个优化问题是凸的,总能找到高效快速算法去解决它,线性可分条件下的支持向量机求解是凸优化问题,可以被快速解决。不详细探讨如何求解凸优化问题,而是假定把问题转化为凸优化问题之后,用解凸优化问题的算法工具包解出。
若线性不可分,以上优化问题无解,即不存在w和b满足上面所有N个限制条件。需要适当放松限制条件,使最优化问题有解。 对每个训练样本及标签(Xi,Yi)设置松弛变量(slack variable)
改造后的支持向量机优化版本:
以前的目标函数只需最小化,现增加了一项所有的和。(要让w的模以及所有的和越小越好)。比例因子C,用于平衡两项,人为设定,在实际运用中不断变化C值——同时测试算法的识别率——选取超参数C。都是凸优化问题,都可以高效求解。
算法的超参数(Hyper parameter):算法中人为事先设定的参数。支持向量机是超参数很少的算法模型。超参数较多的算法模型有人工神经网络、卷积神经网络。 C取一个非常大的数,会尽量迫使趋近于0,使超平面和线性可分情况保持基本一致。
支持向量机求出了一个超平面,但该解让人不满意。分开两类的算法模型是线性的,但线性模型的表现力不够。所以要扩大可选的函数范围。
支持向量机在扩大可选函数范围方面独树一帜。其他的算法是直接产生更多可选函数,如人工神经网络采用多层非线性函数的组合,产生类似椭圆的曲线。而支持向量机是将特征空间由低维映射到高维——在高维特征空间中用线性超平面对数据进行分类。 将训练样本由低维映射到高维——能增大线性可分的概率。
可以不用知道的具体形式,完成对测试样本类别的预测。核函数 与 从低维到高维的映射 的相互决定关系。
国际象棋规则:8*8棋盘,兵黑白各8个,王各1个。兵第一次向前走1或2格,之后每次向前走一格,斜前方吃子,若兵走到对方底线,可升变为除王以外的任意棋子,成为王后可以横竖斜走若干步。王可以横或直或斜走一格,被将死即告负。逼和:一方王未被将军,但移动到任意位置都会被将死,为和棋。黑方只有1个王,白方有一个王和一个兵:黑方要防止自己被将死,坏消息是黑方必须防止兵走到底线成为王后,好消息是可以利用逼和的规则主动造成无路可走的情况。任何专业人士根据棋盘上3子的位置都能判断出是和棋?白方胜?不输入计算机规则,利用支持向量机判断兵王问题是白方胜还是和棋(二分类问题)。
标注好的数据:UCI machine learning数据集下载krkopt.data(Index of /ml/machine-learning-databases/chess/king-rook-vs-king)
(a,1,b,3,c,2,draw)表示黑王在(a,1)的位置,白王在(b,3)的位置,白兵在(c,2)的位置,draw为标签表示和棋;six表示白方最多用6步将死黑方,fifteen意味着在这样的位置下,白方最多用15步将死黑方。每一行为1个训练样本,训练样本为6维
在编写机器学习算法时,常遇到训练样本很少导致效果不明显,常用算法对训练数据进行数据扩增(Data augmentation)
用LIBSVM工具包对训练样本进行训练,有matlab、C++、python封装,下载地址http://www.csie.ntu.edu.tw/~cjlin/libsvm。若要旧版本https://www.csie.ntu.edu.tw/~cjlin/libsvm/oldfiles
因为电脑只认得数字所以,将a,b,c,d...用数字表示,如a=1,b=2,标签:draw = -1,one-fifteen = 1(-1表示和局,1表示将死)
不知道选啥核函数就选高斯核(Rbf) ,需确定两个参数C和gamma,通过对偶问题中的目标函数来对两个参数在他们的取值范围内按照一定的步长逐一进行测试,取最优作为两个参数的最终取值。C和gamma的取值范围是基于人为经验。
(4)-g gammmaValue 值的设定与选择的核函数有关。
核函数的详细介绍:1.Linear只具有理论意义,前面使用线性核求解向量机核不使用结果一样。2.Poly可通过调节d的大小控制φ(x)的维度,从而控制核函数的复杂度(d越大,复杂度越高)。3.Rbf径向基函数核:对应的映射函数φ(x)维度是无限的,含有高斯函数的优良性质,一般最常用。4.Tanh:对应的映射函数φ(x)维度也是无限的。
已知——5000个训练样本(包含样本数据和每个数据对应的标签)
未知、任务——C、gamma参数,通过训练样本训练出SVM模型
将5000个样本随机均分为5组(5——fold),5组名字分别为a,b,c,d,e,每次拿4组数据作为训练模型,1组用于测试,每组数据进行轮换测试,最后模型的辨识率取五次测试辨识率的均值——五折交叉验证(5-fold cross validation)
组数越多,越精确,但是训练时间多(如在上例中训练5个模型而非1个,相应的训练时间越长)故需权衡。涉及到了两个循环,一个循环是遍历所有的C和gamma,一个循环是将训练样本分成5组轮换进行训练测试。
交叉验证(cross validation):遍历上述所有C和gamma的组合,找出识别率最大的C和gamma参数。但训练集只有5000个样本,须在5000个样本中分出一些样本去估计识别率!!!不能用支持向量机模型的样本去测试识别率,会导致过拟合(ovwefitting),从而测出来的识别率比实际的识别率要高。相当于考试的题目就是练习时的题目,那么考试的分数会很高是一个道理,在考试中考试题必须和平时的练习题不一样。同理,测试识别率的样本与训练机器学习模型的样本不一样。
在这例中,训练集数据5000个,最多能做5000折交叉验证。每次用4999个数据训练,用1个数据测试,重复5000次。这种每次只用1个数据测试,其余数据训练的交叉验证叫做留一法(leave-one-out)。常用于训练样本数据量少又要精确地估计识别率。
(1)C和gamma确定了对偶问题模型;(2) 支持向量的个数可以通过经验来判断训练的好坏,若支持向量过多则没有训练好;(3)通过b和α我们可以对测试样本进行分类,其中α是通过对偶问题求解所得
1.打开matlab,将libsvm的路径加载到matlab的路径中,使matlab找到libsvm工具包中所有与matlab相接口的函数(设置路径—添加并包含子文件夹,把下载的libsvm文件夹选中—保存—关闭)
2.把matlab的目录转到有testSVMChessLibSVM.m的文件下,点击主要的程序。分析testSVMChessLibSVM.m程序。
3.光标停在第35行,设置一个断点,试着运行部分程序,点击运行,在主页面>>size(xapp) 6 28056 表示6维的向量总共有28056个 >>xapp(:,1)所有维度上的第一个向量 1 1 2 3 3 2表示三个起止位置(1,1)(2,3)(3,2) >>size(yapp) 1 28056 >>yapp(1) 1 yapp上的第一个向量的标签为+1。
4.运行程序,利用交叉验证寻找使识别率最高的C和gamma,获得支持向量机的超参数。运用不同的C和gamma,利用五折交叉验证获得一些识别率,找出使识别率最大的C和gamma组合。>>maxC 1.1763e+03 >>maxGamma 0.0625 >>maxRecognitionRate 99.4800——即为我们做交叉验证的结果。
5.利用训练集中所有5000个样本重新训练一个支持向量机模型——训练获得的最终模型。看训练出来的支持向量机的模型是咋样的 >>model 如下图 >>model.SVs (201,6) -1.5548 (202,6) 1.5532…
6.用获得的模型model.mat对23056个测试样本进行测试,获得识别率。输出ypred是对每个样本预测的标签,accuracy是测试集上整体的识别率,decisionvalue是每一个测试样本的具体数值,最终识别率为99.61%。
- clear all;
- % Read the data.
- fid = fopen('krkopt.DATA');
- c = fread(fid, 3); #读文件的方式读入文件
-
- vec = zeros(6,1);
- xapp = []; #接收6维的训练数据
- yapp = []; #接收对应的标签
- while ~feof(fid)
- string = [];
- c = fread(fid,1);
- flag = flag+1;
- while c~=13
- string = [string, c];
- c=fread(fid,1);
- end;
- fread(fid,1);
- if length(string)>10
- vec(1) = string(1) - 96;
- vec(2) = string(3) - 48;
- vec(3) = string(5) - 96;
- vec(4) = string(7) - 48;
- vec(5) = string(9) - 96;
- vec(6) = string(11) - 48;
- xapp = [xapp,vec];
- if string(13) == 100
- yapp = [yapp,1];
- else
- yapp = [yapp,-1];
- end;
- end;
- end;
- fclose(fid); #第3行-第33行涉及复杂的读取和转换操作
-
- [N,M] = size(xapp);
- p = randperm(M); %Ö±½Ó´òÂÒÁËѵÁ·Ñù±¾ #打乱操作,保证挑选的训练集和测试集是完全随机的
- numberOfSamplesForTraining = 5000;
- xTraining = [];
- yTraining = [];
- for i=1:numberOfSamplesForTraining
- xTraining = [xTraining,xapp(:,p(i))];
- yTraining = [yTraining,yapp(p(i))]; #基于打乱的正整数排列获得训练集
- end;
- xTraining = xTraining';
- yTraining = yTraining';
-
- xTesting = [];
- yTesting = [];
- for i=numberOfSamplesForTraining+1:M
- xTesting = [xTesting,xapp(:,p(i))];
- yTesting = [yTesting,yapp(p(i))]; #基于打乱的正整数排列获得测试集
- end;
- xTesting = xTesting';
- yTesting = yTesting';
-
- %%%%%%%%%%%%%%%%%%%%%%%%
- %Normalization
- [numVec,numDim] = size(xTraining);
- avgX = mean(xTraining);
- stdX = std(xTraining);
- for i = 1:numVec
- xTraining(i,:) = (xTraining(i,:)-avgX)./stdX; #训练集归一化操作
- end;
- [numVec,numDim] = size(xTesting);
-
- for i = 1:numVec
- xTesting(i,:) = (xTesting(i,:)-avgX)./stdX; #测试集归一化操作
- end;
-
-
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %SVM Gaussian kernel
- %Search for the optimal C and gamma, K(x1,x2) = exp{-||x1-x2||^2/gamma} to
- %make the recognition rate maximum.
-
- %Firstly, search C and gamma in a crude scale (as recommended in 'A practical Guide to Support Vector Classification'))
- CScale = [-5, -3, -1, 1, 3, 5,7,9,11,13,15];
- gammaScale = [-15,-13,-11,-9,-7,-5,-3,-1,1,3];
- C = 2.^CScale;
- gamma = 2.^gammaScale; #c和gamma的搜索范围
- maxRecognitionRate = 0;
- for i = 1:length(C)
- for j = 1:length(gamma)
- cmd=['-t 2 -c ',num2str(C(i)),' -g ',num2str(gamma(j)),' -v 5']; # -v 5表示对训练集5000个样本进行5折交叉验证
- recognitionRate = svmtrain(yTraining,xTraining,cmd);
- if recognitionRate>maxRecognitionRate
- maxRecognitionRate = recognitionRate
- maxCIndex = i;
- maxGammaIndex = j;
- end;
- end;
- end; #对训练集数据进行交叉验证,找出识别率最高的C和gamma的组合
-
- %Then search for optimal C and gamma in a refined scale.
- n = 10;
- minCScale = 0.5*(CScale(max(1,maxCIndex-1))+CScale(maxCIndex));
- maxCScale = 0.5*(CScale(min(length(CScale),maxCIndex+1))+CScale(maxCIndex));
- newCScale = [minCScale:(maxCScale-minCScale)/n:maxCScale];
-
- minGammaScale = 0.5*(gammaScale(max(1,maxGammaIndex-1))+gammaScale(maxGammaIndex));
- maxGammaScale = 0.5*(gammaScale(min(length(gammaScale),maxGammaIndex+1))+gammaScale(maxGammaIndex));
- newGammaScale = [minGammaScale:(maxGammaScale-minGammaScale)/n:maxGammaScale];
- newC = 2.^newCScale;
- newGamma = 2.^newGammaScale;
- maxRecognitionRate = 0;
- for i = 1:length(newC)
- for j = 1:length(newGamma)
- cmd=['-t 2 -c ',num2str(newC(i)),' -g ',num2str(newGamma(j)),' -v 5'];
- recognitionRate = svmtrain(yTraining,xTraining,cmd);
- if recognitionRate>maxRecognitionRate
- maxRecognitionRate = recognitionRate
- maxC = newC(i);
- maxGamma = newGamma(j);
- end;
- end;
- end; #进一步缩小搜索范围,再次使用交叉验证,找出使识别率最高的更精确的C和gamma的组合
-
- %Train the SVM model by the optimal C and gamma.
- cmd=['-t 2 -c ',num2str(maxC),' -g ',num2str(maxGamma)];
- model = svmtrain(yTraining,xTraining,cmd); #利用训练集中5000个样本重新训练一个支持向量机模型并存储
- save model.mat model;
- save xTesting.mat xTesting;
- save yTesting.mat yTesting;
-
- [yPred,accuracy,decisionValues] = svmpredict(yTesting,xTesting,model);
- save yPred.mat yPred;
- save decisionValues.mat decisionValues;
-
-
- #第125-126行做的是在测试样本上获得识别率的事,输出ypred是对每个样本预测的标签,accuracy是测试集上整体的识别率decisionvalue是每一个测试样本的函数的具体数值
-
- plot(falsePositive,truePositive);
-
-
- #将所有28542个训练样本分为训练集和测试集,用5000个训练样本进行训练,剩余的23056个训练样本进行测试。在划分训练集和测试集之前要对所有的样本进行打乱操作,保证挑选的训练集和测试集是完全随机的,打乱的步骤在36行,运行randperm函数获得随机整数排列;第40-43行、第49-52行基于打乱的正整数排列获得训练集和测试集;第61-63行是归一化操作,第66-68行,对测试集样本也做了归一化;第78-81行C和gamma的搜索范围;第85行 -v 5表示对训练集5000个样本进行5折交叉验证;第82-93行对训练集数据进行交叉验证,从而找出识别率最高的C和gamma的组合;在初步找到C和gamma的组合后,第96-117行进一步缩小搜索范围,再次使用交叉验证,找出使识别率最高的更精确的C和gamma的组合;#第120-122行在C和gamma确定后,利用训练集中5000个样本重新训练一个支持向量机模型。第122行存储了最终的模型
二分类问题:兵王问题只有两类,和棋和白方胜
兵王问题获得了99.61%的识别率,是高还是低呢?单纯用识别率来判断系统的好坏是没有意义的。如果一个火车站的人脸和身份证对比系统,如果冒用别人身份证蒙混过关的比例低于1%,人脸识别系统如果把所有的人都放过去,识别率会大于99%;即什么也不做,瞎猜的识别率也会大于99%。问题出在哪?如果不知道数据类别的先验分布,单单知道识别率是毫无意义的!二分类问题中先验概率为100%,瞎猜的概率也可以是100%。
除了识别率,其他度量系统性能的标准:比识别率这个单一的数字更复杂,但反映的问题更全面。
(1)总共有多少个正样本? TP+FN=2249+39=2288 (2)总共有多少个负样本?FP+TN=51+20717=20768
(3)系统识别率是多少?(TP+TN)/(TP+TN+FP+FN)=99.61%
(4)瞎猜的概率是多少?由于负样本更多可以将所有测试样本全猜为负样本,(FP+TN)/(TP+TN+FP+FN)=89.96%
通过混淆矩阵客观估计系统性能,瞎猜都可以考89.96分,系统获得了99.61分,还不错,但也没有识别率反映的那么好。
不管用啥算法,正样本数/负样本数不变,可以将混淆矩阵以行做归一化,获得四种情况的概率,一定满足上述两条件。基于上述两个条件,探讨评价识别系统性能的另一个重要度量指标:ROC曲线(receiver operating characteristic curve)
概率TP、FN、FP、TN的关系:1.TP + FN = 1 FP + TN = 1
系统2相比系统1,TP和FP都增加了,阈值从0变为-1,有更多的测试样本满足第一个不等式,判断为正样本,不仅正样本判断为正样本的比例增加了,负样本判断为正样本的比例也增加了。
人为改变阈值,可使TP和FP同时增减, 但若希望更大的TP和更小的FP,简单的阈值设置就不能达到目的,要从算法本身入手。
ROC曲线横坐标为FP,纵坐标为TP(有些资料横坐标是FP,纵坐标为FN)四条ROC曲线,蓝色线系统性能最好,紫色线最差。
越贴近左上角,ROC曲线性能越好。贴近左上角的线对于同样的错误概率FP,正确的概率TP是越高的。基于ROC可以判断系统性能的另外两个指标:AUC(area under curve),指ROC曲线下面形状的面积,ROC越大说明系统性能越好;
EER(equal error rate)等错误率,从ROC的左上角到右下角画一条直线,交ROC曲线于一点,横坐标就是EER,可以证明两类错误FP=1-TP = FN,EER越低系统系统越好。
用二分类的支持向量机求解多分类问题,两种方法:1类 对 k-1类;1类 对 另1类。
设共有k类,则需构造K个支持向量机。在K个支持向量机中,找一类与其他类间隔最大,把它作为测试样本的预测标签。
(1)类别1 VS 类别2,3,4 …k (2)类别2 VS 类别1,3,4 …k …… (k) 类别k VS 类别1,2,3,4 …k-1
但该方法会导致训练样本不平衡,左边只有一类样本,右边有k-1类的样本,右边的样本数量>>左边的样本数量,两类样本数量严重不平衡,支持向量机的分类结果会受到影响,会更倾向于训练样本数多的类别。
三个支持向量机对类别1的分数和=0.5-0.2=0.3 ;对类别2的分数和=-0.5+0.4=-0.1;对类别3的分数和=0.2-0.4=-0.2;类别1获得的分数和最高,因此最后的识别结果为类别1。
解决了训练样本不平衡的问题,但当类别数为K时,要训练k(k-1)/2个支持向量机,若K很大,则训练和测试的时间会很长,常常综合上述两种算法,做出一些树状的分类器。
这么做的前提是:保证每个分类器区分的两类差别是显著的。如最上边的分类器,必须保证1,2,3,4这四个类和5,6,7,8这四个类有足够的差别。可以用聚类和决策树算法来实现。
人工神经网络(artificial neural networks)简称神经网络(neural networks),支持向量机是以vaplik为代表的一两个人做出来的,那么人工神经网络是集体智慧的结晶。人工神经网络方法经历起起落落,以人工神经网络为基础的深度学习算法在主流的机器学习领域取得突破性进展,比深度学习之前的传统算法性能高很多。尽管性能提高,但其本质的理论基础和人工神经网络没有区别,在上个世纪80年代就已经基本成熟。
人工神经网络的基本思想是仿生学,对人脑的神经元运作机制进行模拟,当计算机的计算资源较低时,只能模拟人脑中为数不多的神经元运作,系统性能自然不高;2000年以来,随着计算机硬件能力的发展,我们能模拟几十万甚至几千万神经元的运作,系统性能有了明显提升。从本质来说,目前流行的深度学习算法只是一个规模巨大的人工神经网络而已。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。