目录
这些实验在我的B站上有专门的视频演示:
【模式识别与人工智能】【实验报告合集】Bayes + Fisher + PCA + Decision Tree + KNN + K-Means + SVM_哔哩哔哩_bilibili
实验一 Bayes分类器设计
一、实验目的
对模式识别有一个初步的认识,能够根据自己的设计对贝叶斯决策理论算法有深刻地理解,掌握利用贝叶斯公式,进行设计两种分类器的方法,并加强对MATLAB等语言的运用。
二、实验原理
要估计正态分布下的概率密度函数,假设身高随机变量为X,体重随机变量为Y,二维随机变量(X,Y)的联合概率密度函数是:
其中-∞<x<+∞, -∞<y<+∞,-∞<μ1, μ2<+∞; σ1,σ2>0;-1≤ρ≤1。
并其μ1,μ2,σ1,σ2,ρ均为常数,μ1,μ2分别是X与Y的均值,σ12,σ22分别是X与Y的方差,ρ是X与Y的相关系数,则称(X,Y)服从参数为μ1,μ2,σ1,σ2,ρ的二维正态分布,记作X,Y~(μ1,μ2,σ12,σ22,ρ)。
运用最大似然估计求取概率密度函数,设样本中包含N个样本,即χ={x1,x2,⋯,xN},其中xk是列向量。根据教材《模式识别(第二版)》55页公式(3-42)和(3-43),令μ=(μ1,μ2)T,则;协方差矩阵,那么。
采用最小错误率贝叶斯分类器,设一个身高体重二维向量为x,男生类为ω1,女生类为ω2,在已知先验概率P(ωi),类条件概率P(X|ωi),i=1,2⋯,n,共n个模式,及给出待识别的X的情况下,根据贝叶斯公式可以计算出后验概率:
决策规则如下:,采用不同的先验概率,其结果也会有相应不同。然后逐一对样本数据进行检验,就可以分别得到各个训练集和测试集的错误率。
采用最小风险贝叶斯分类器,首先在前面最小错误率贝叶斯分类器的基础上计算出P(ωiX),然后自己设定一个主观的决策表,然后根据教材《模式识别(第二版)》15页最上面的公式: 设有n个模式,有a种决策α1,α2,α3,⋯,αa ,则αi的条件风险为
计算条件风险,然后逐一比较风险值,
找出条件风险最小的决策αk(也就是分为哪一类), αk就是最小风险贝叶斯决策。
三、实验内容
1)已知有两类数据男生ω1和女生ω2,即Male.txt和Female.txt两个训练样本集, test1.txt是测试样本集,test2.txt是实际应用集。
2)采用身高和体重数据为特征,在正态分布假设下估计概率密度(只用两个训练样本集),建立最小错误率贝叶斯分类器,写出所用的密度估计方法和得到的决策规则,将该分类器分别应用到测试样本集test1.txt上,考察测试错误率。
然后将分类器应用到实际应用集test2.txt上,考察实际应用错误率的情况。(在分类器设计时可以尝试采用不同先验概率,考查对决策和错误率的影响。)
3)自行给出一个决策表,采用最小风险贝叶斯决策重复上面的实验。
四、实验要求
1) 用MATLAB完成基于最小错误率的贝叶斯分类器的设计,要求程序相应语句有说明文字,要求有子程序的调用过程。
2) 给出模式错误分类的具体数量和总错误率情况。
3) 如果是最小风险贝叶斯决策,决策表如下:
最小风险贝叶斯决策表:
决策 状态 | ω1 | ω2 |
α1 | 0 | 6 |
α2 | 1 | 0 |
请重新设计程序,完成基于最小风险的贝叶斯分类器,得到相应的分类结果,并比较两个结果。
五、实验结果
均值和协方差矩阵:
分类结果:
直方图分布:
六、实验分析
1.在训练样本集中,男生和女生的人数各是50人,所以男生女生两种模式的先验概率都为0.5,从生物学角度看,这也符合遗传学理论,男生女生比例1:1。
由程序求解出的均值和协方差矩阵,可知男生的平均身高为173.9200,平均体重为65.5020,协方差矩阵为,女生的平均身高为162.8400,平均体重为52.5960,协方差矩阵为。
所以男生的μ_1为173.9200,μ_2为65.5020,σ_1为4.6018,σ_2为7.8179,ρ为0.6393;
女生μ_1为162.8400,μ_2为52.5960,σ_1为6.6955,σ_2为5.6359,ρ为0.4198。
可以得知男女生的概率密度函数(类条件概率)分别为:
2.程序流程图
3.为什么要有最小风险和最小错误率这两种方法呢?
答:最小错误率贝叶斯分类是以最小化分类错误率(或最大化后验概率)为目标来判定样本对应的类别的,使用贝叶斯公式计算得到样本一系列的后验概率,我们取最大的那个概率所对应的类别为最终的类别。
而最小风险的思想是,当样本的真值和决策觉果不一致会带来损失时,这种损失的信息往往更关键,因此在某些情况下,引入风险的概念以求风险最小的决策更合理。因此这一方法的重点就在于构建损失函数。
4.在给予最小风险的贝叶斯判决中,影响决策结果的因素多了一个“损失”,在机器学习或深度学习中,“风险”就是“损失”的意思。样本点在两类决策下的后验概率相差很小,当结合最小风险贝叶斯决策表进行计算时,“损失”就起了主导作用,导致出现了相反的结果。另外,最小错误率贝叶斯决策就是在0-1 损失函数条件下的最小风险贝叶斯决策, 即前者是后者的特例。
5.在本实验中,本是男生被错误分类为女生的损失为1,相反情况是6。
实验二 基于Fisher准则的线性分类器设计
一、实验目的
本实验旨在让同学进一步了解分类器的设计概念,能够根据自己的设计对线性分类器有更深刻地认识,理解Fisher准则方法确定最佳线性分界面方法的原理。
二、实验原理
如果把多维特征空间的点投影到一条直线上,就能把特征空间压缩成一维,这个在数学上是很容易办到的。但是,在高维空间里很容易分开的样品,把它们投影到任意一条直线上,有可能不同类别的样品就混在一起了,无法区分,如图5-16( a)所示,投影到x或x。轴无法区分。若把直线绕原点转动一下,就有可能找到一个方向,样品投影到这个方向的直线上,各类样品就能很好地分开,如图5-16(b)所示。因此直线方向的选择是很重要的。一般来说,总能够找到一个最好的方向,使样品投影到这个方向的直线上很容易分开。如何找到这个最好的直线方向以及如何实现向最好方向投影的变换,这正是Fisher算法要解决的基本问题,这个投影变换恰是我们所寻求的解向量W*。
样品训练集以及待测样品的特征总数目为n。为了找到最佳投影方向,需要计算出各类样品均值.样品类内离散度矩阵Si,和总类间离散度矩阵Sw,样品类间离散度矩阵Sb,,根据Fisher准则,找到最佳投影向量,将训练集内所有样品进行投影,投影到一维Y空间,由于Y空间是一维的,则需要求出Y空间的划分边界点,找到边界点后,就可以对待测样品进行一维
Y空间的投影,判断它的投影点与分界点的关系,将其归类。
要实现Fisher 分类,首先实现两类Fisher算法,两类Fisher算法能够返回最接近待测样品的类别,然后用返回的类别和新的类别做两类Fisher运算,又能够得到比较接近的类别,以此类推,直至所有的类别,最后得出未知样品的类别。
两类 Fisher 算法实现步骤如下:
- 求两类样品均值向量m1、和m2。
- 求两类样品类内离散度矩阵Si;。
- 求总类内离散度矩阵Sw。
- 求向量W*, W*=Sw-1(m1-m2)。
- 对于两类已知样品,求出它们在W*上的投影点yi。
- 求各类样品均值mi,, 。
- 选取阈值y0。,在这里取。
- 对于未知样品X,计算它在W*上的投影点y。
- 根据决策规则分类。
三、实验内容
已知有两类数据ω1和ω2,即 Female.txt和Male.txt,进行Fisher判别分类,用test1.txt和test2.txt中的样本进行测试。
数据的样本点分布如下图:
图 1:样本点分布图
四、实验要求
- 请把数据作为样本,根据Fisher选择投影方向W的原则,使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求,求出评价投影方向W的函数,并在图形表示出来。并在实验报告中表示出来,并求使JF(w)取极大值的w*。用matlab完成Fisher线性分类器的设计,程序的语句要求有注释。
- 根据上述的结果并判断test2.txt中第5、第10、第15、第22、第32个样本,分别属于哪个类别,并画出数据分类相应的结果图,要求画出其在W上的投影。
- 回答如下问题,分析一下W的比例因子对于Fisher判别函数没有影响的原因。
五、实验结果
1.投影前后图形显示
2、参数
决策面向量:W =[0.0023, 0.0019] (可以贴出workspace截图中w的值:)
阈值:yuzhi=0.5002
样本点分类:(可以贴出workspace截图中类别的值:)
六、实验分析
1.在本实验中,运用 Fisher线性分类器时,假设实验的数据集合包含N个2维样本点x1, x2,…,xN,其中有N1个样本属于男生类w1,N2个样本属于女生类w2。对xi的分量作线性组合得标量yi=wTwi,i=1,2,…,N,这样把二维样本数据变换到一维空间中。为此,需要寻找一个最好的变换向量w*,使得变换后的一维空间中,各类样本尽可能分得开些,同时各类样本内部尽量密集。
2. 根据上述的结果可以判断test2.txt中第5、第10、第15、第22、第32个样本,5个样本本皆是女生,但经过fisher分类后,因为第32个样本的女孩身高为173cm,体重为54kg,所以fisher分类时候把她分到了边缘,但最终还是错判为了男生。
左图显示第32样本数据,在右图中最右边已经被圈出来,可以看出被分成了男生。
3.程序流程图:
4. 分析一下的W比例因子对于Fisher判别函数没有影响的原因。
答:在本实验中,最需要是在此方向上数据的投影,那么W的比例因子,即它是单位向量的多少倍长就无关紧要了。
5.由于Fisher判别对变量的分布及协方差阵没有什么要求,故应用范围较广,且能给出判别函数的判别效率及各变量的判别能力,为选择判别函数,筛选变量提供了更多的信息。
实验三 基于PCA变换的特征提取
一、实验目的
通过实验加深对特征提取与选择原理、方法的认识,编写基于离散K-L变换的特征提取程序,或分支定界特征挑选算法程序,掌握离散K-L变换原理、特点。编写基于离散K-L变换的特征提取程序。
二、实验原理
K-L变换( Karhunen-Loeve Transform)是建立在统计特性基础上的一种变换,有的文献也称为霍特林( Hotelling)变换,因他在1933年最先给出将离散信号变换成一串不相关系数的方法。K-L 变换的突出优点是去相关性好,是均方误差( MSE Mean Square Error )意义下的最佳变换,它在数据压缩技术中占有重要地位。
特征脸方法是基于K-L变换的人脸识别方法,K-L变换是图像压缩的一种最优正交变换。高维的图像空间经过K-L变换后得到一组新的正交基,保留其中重要的正交基,由这些基可以张成低维线性空间。如果假设人脸在这些低维线性空间的投影具有可分性,就可以将这些投影用作识别的特征矢量,这就是特征脸方法用于人脸识别的基本思想。在人脸识别中,可以用离散K-L变换对人脸图像的原始空间进行转换,即构造人脸图像数据集的协方差矩阵,对之进行正交变换,求出协方差矩阵的特征向量,再依据特征值的大小对这些特征向量进行排序,每一个向量表示人脸图像中一个不同数量的变量,这些特征向量表示特征的一个集合,它们共同表示一个人脸图像。在人脸识别领域,人们常称这些特征向量为特征脸。每一个体人脸图像都可以确切地表示为一组特征脸的线性组合。这样我们首先通过有指导的训练(给定训练样本集已知分类)得到样本集在特征脸空间中的坐标。训练完成后,输入待辨识图像,求得在特征脸空间的坐标,采用最近邻法,就可以实现人脸识别。
一般说K-L变换是均方差意义下的最佳变换,理论推导在很多书和网站上都有详细过程但是比较复杂,这里不过多阐述,主要注重实现本实验的方法手段:
设n维特征矢量x=(x1,x2,…,xn)’,其均值矢量m=E[x],协方差矩阵C=E[(x-m)(x-m)'],设λ1≥λ2≥…≥λn是C的本征值,ti是λi对应的本征矢量,i=1,2,…,n,x经标准正交矩阵T'=(t1,t2,…,tn)',正交变换后成为矢量y=(y1,y2,…,yn)',即,y= T'x。这种正交变换称为离散K-L变换(间记为DKLT)。
DKLT的性质:
(1)变换后各分量正交或不相关;
(2)变换后各分量的方差更趋于不均匀,可分性强于;
(3)最佳逼近性,即,若用的前d<n个分量近似,误差最小。
当n较大时,由 DKLT的性质(2),可以用y的前d<n个分量作为特征。
至此,可以大致总结本实验的实现步骤:
- 选取各类全体样本组成矩阵 ,待测样品为。
- 选取各类全体样本组成矩阵 ,待测样品为。
- 计算的协方差矩阵。
- 计算的特征值和特征向量
- 根据一定的贡献率,选取的前m列,构成。
- 计算样本库样本主成分Xm×N=Cn×mTXn×N和样品主成分Xm×1=Cn×mTXn×1。
- 采用模板匹配法进行多类别分类。
三、实验内容
1.人脸识别图像库中包含40个人的头像图片,每人10幅。将400张图像分成两组,每个人的前五张照片作为训练图像,后五张作为测试图像。读入图像,并对图像数据进行处理。
2.采用PCA方法实现本征脸方法,对特征进行降维。
3.对训练图像进行重构,观察当保留特征维数不同时,重构效果的差异。
4.对测试图像进行判别。对测试图像进行预处理,根据本征脸计算重构系数,与每一幅本征脸图像的重构系数进行比较,根据最小距离进行图像类别的判别,实现人脸识别。
5.增加训练图像,如每个人前六张做训练,后四张做测试(最多增加到前九张做训练,后一张做测试),重复以上步骤,最后进行比较。
四、实验要求
- 请实验步骤完成实验内容。
- 程序实现分利用一种简化方法,具体分类的原理是什么?
- 如果是一张本征脸或两张本征脸,还能正确识别吗?请修改程序,利用运行结果说明以上问题。
五、实验结果
1.得到训练集的平均脸
2.抽取出前32个人的第一张特征脸
3.所有特征脸按照特征值降序
我们可以看出,降序后排在最下面的特征脸所携带的“信息”十分少,那么我们可以将所得到的所有特征脸按照特征值的大小排序,选取累计贡献值大于85%的前needNum个特征脸,这样一来在尽可能小的影响模型精度的情况下对特征空间降维。
特征脸的重构图像
下图为重构图像的保存路径。
第15个人的重构图像:
第28个人的重构图像:
运行结果
可以看出使用的训练样本集大小将会直接影响样本识别的正确率,训练样本集越大,识别正确率越高。
六、实验分析
1. 本实验数据是ORL标准人脸数据库数据
1)给定样本集,在这里样本集的大小为400,一共是40人,每人10张图片。我选取每人5张图片一共200张作为训练集,训练集的大小是可选的,它的大小将直接影响到识别的正确率,在后面我对采用不同大小的训练集进行识别的正确率进行了统计。
2〉进行了识别正确率的比较。
3)根据产生矩阵计算出特征脸,这里要用到奇异值分解,其基本原理就是通过计算较低维数矩阵的特征值与特征向量而间接求出较高维数矩阵的特征向量(特征脸),从而达到简化计算的目的。
4)分别求得训练集中各图像在特征脸空间中的坐标。
2. 程序实现分利用一种简化方法,具体分类的原理是什么?
答:首先求得待辨识图像相对于训练集平均脸的差值图像,然后求得该图像在特征脸空间中的坐标,最后采用最近邻法对图像进行归类。
3. 如果是一张本征脸或两张本征脸,还能正确识别吗?请修改程序,利用运行结果说明以上问题。
答:不能正确识别,识别误差较大。
实验结果表明,在使用前5张图像做训练样本集时,识别误差达到44.5%,误差较大,如果再往下减小训练集大小,识别正确率将急剧下降。
4.程序流程图:
5. KL变换与PCA的关系:
答:PCA的变换矩阵是协方差矩阵,K-L变换的变换矩阵可以有很多种(二阶矩阵、协方差矩阵、总类内离散度矩阵等等)。当K-L变换矩阵为协方差矩阵时,等同于PCA。
6.这个实验在最后做出来的时候,误差一直很大,后面也曾跟老师讨论过,然后在和同学交流之后,进行了一些细节的改进,识别正确率在训练集人脸达到每个人8张时有了明显提升。
实验四 决策树
一、实验目的
通过实验,加深数据挖掘中分类(决策树)的认识,进一步了解决策树理论的基本概念,包括决策树的基本原理,决策树的分类方法,决策树的方法特点等;其经典算法为ID3算法,了解影响ID3算法性能的因素,掌握基于ID3算法理论的分类分析的原理和方法。最后基于决策树理论完成对 Breast Cancer数据集的决策树分类器设计。
二、实验原理
决策树算法起源于E.B.Hunt等人于1966年发表的论文“experiments in Induction”,但真正让决策树成为机器学习主流算法的还是Quinlan(罗斯.昆兰)大神(2011年获得了数据挖掘领域最高奖KDD创新奖),昆兰在1979年提出了ID3算法,掀起了决策树研究的高潮。现在最常用的决策树算法是C4.5是昆兰在1993年提出的。(关于为什么叫C4.5,还有个轶事:因为昆兰提出ID3后,掀起了决策树研究的高潮,然后ID4,ID5等名字就被占用了,因此昆兰只好让讲自己对ID3的改进叫做C4.0,C4.5是C4.0的改进)。现在有了商业应用新版本是C5.0link。
1.决策树的基本概念
顾名思义,决策树就是一棵树,一颗决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。
2.如何生成决策树
(1)信息增益:
决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,对于二元分类而言,就是尽量使划分的样本属于同一类别,即“纯度”最高的属性。那么如何来度量特征(features)的纯度,这时候就要用到“信息熵(information entropy)”。先来看看信息熵的定义:假如当前样本集D中第k类样本所占的比例为pk(k=1,2,3,…,|K|),K为类别的总数(对于二元分类来说,K=2)。则样本集的信息熵为:
EntD的值越小,则D的纯度越高。(这个公式也决定了信息增益的一个缺点:即信息增益对可取值数目多的特征有偏好(即该属性能取得值越多,信息增益,越偏向这个),因为特征可取的值越多,会导致“纯度”越大,即EntD会很小,如果一个特征的离散个数与样本数相等,那么EntD值会为0)。再来看一个概念信息增益(information gain),假定离散属性a有V个可能的取值{a1,a2,…,aV},如果使用特征a来对数据集D进行划分,则会产生V个分支结点, 其中第v(小v)个结点包含了数据集D中所有在特征a上取值为av的样本总数,记为Dv。因此可以根据上面信息熵的公式计算出信息熵,再考虑到不同的分支结点所包含的样本数量不同,给分支节点赋予权重|Dv|D,即样本数越多的分支节点的影响越大,因此,能够计算出特征a对样本集D进行划分所获得的“信息增益”:
一般而言,信息增益越大,则表示使用特征a对数据集划分所获得的“纯度提升”越大。所以信息增益可以用于决策树划分属性的选择,其实就是选择信息增益最大的属性,ID3算法就是采用的信息增益来划分属性。C4.5算法则采样信息增益率,CART决策树则采用基尼指数。
(2)剪枝:
首先剪枝(pruning)的目的是为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning):
预剪枝(pre-pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
后剪枝(post-pruning):后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点。
(3) 连续值处理:
因为连续属性的可取值数目不再有限,因此不能像前面处理离散属性枚举离散属性取值来对结点进行划分。因此需要连续属性离散化,常用的离散化策略是二分法,这个技术也是C4.5中采用的策略。下面来具体介绍下,如何采用二分法对连续属性离散化:
给定训练集D和连续属性a,假定a在D上出现了n个不同的取值,先把这些值从小到大排序,记为{a1,a2,…,an}基于划分点t可将D分为子集Dt-和Dt+,其中Dt-是包含那些在属性a上取值不大于t的样本,Dt+则是包含那些在属性a上取值大于t的样本。显然,对相邻的属性取值ai与ai+1来说, t在区间[ai , ai+1)中取任意值所产生的划分结果相同。因此,对连续属性a,我们可考察包含n -1个元素的候选划分点集合
Ta={ai+ai+12|1≤i≤n-1}
即把区间[ai , ai+1)的中位点ai+ai+12作为候选划分点。然后,我们就可以像前面处理离散属性值那样来考虑这些划分点,选择最优的划分点进行样本集合的划分,使用的公式如下:
其中GainD,a,t是样本集D基于划分点t二分后的信息增益。划分的时候,选择使GainD,a,t最大的划分点。
(4)缺失值处理
在决策树中处理含有缺失值的样本的时候,需要解决两个问题:
如何在属性值缺失的情况下进行划分属性的选择?(比如“色泽”这个属性有的样本在该属性上的值是缺失的,那么该如何计算“色泽”的信息增益?)
给定划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?(即到底把这个样本划分到哪个结点里?)
这在周志华《机器学习》(西瓜书)里面有详细的介绍并且给了例程,这里不过多写。
3. ID3算法
(1)ID3算法特点:
1)决策树中每一个非叶结点对应着一个非类别属性,树枝代表这个属性的值。一个叶
结点代表从树根到叶结点之间的路径对应的记录所属的类别属性值。
2)每一个非叶结点都将与属性中具有最大信息量的非类别属性相关联。
3)采用信息增益来选择能够最好地将样本分类的属性。
信息增益基于信息论中熵的概念。ID3总是选择具有最高信息增益(或最大熵压缩)的属性作为当前结点的测试属性。该属性使得对结果划分中的样本分类所需的信息量最小,并反映划分的最小随机性或“不纯性”。
(2) 模型求解
构造决策树的方法是采用自上而下的递归构造,其思路是:
1)以代表训练样本的单个结点开始建树(步骤1)。
2)如果样本都在同一类,则该结点成为树叶,并用该类标记(步骤2和3)。
3)否则,算法使用称为信息增益的机遇熵的度量为启发信息,选择能最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。值得注意的是,在这类算法中,所有的属性都是分类的,即取离散值的。连续值的属性必须离散化。
4)对测试属性的每个已知的值,创建一个分支,并据此划分样本(步骤8~10)。
5)算法使用同样的过程,递归地形成每个划分上的样本决策树。一旦一个属性出现在一个结点上,就不必考虑该结点的任何后代(步骤13)。
6)递归划分步骤,当下列条件之一成立时停止:
(a)给定结点的所有样本属于同一类(步骤2和3)。
(b)没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,采用多数表决 (步骤5)。这涉及将给定的结点转换成树叶,并用samples中的多数所在类别标记它。换一种方式,可以存放结点样本的类分布。
(c)分支test_attribute=ai 没有样本。在这种情况下,以samples中的多数类创建一个树叶(步骤12)。
(3)算法步骤:
Decision_Tree(samples,attribute_list)
输入 由离散值属性描述的训练样本集samples;
候选属性集合attribute_list。
输出 一棵决策树。
(1) 创建节点N;
(2) if samples 都在同一类C中then
(3) 返回N作为叶节点,以类C标记;
(4) if attribute_list为空then
(5) 返回N作为叶节点,以samples 中最普遍的类标记;//多数表决
(6) 选择attribute_list 中具有最高信息增益的属性test_attribute;
(7) 以test_attribute 标记节点N;
(8) for each test_attribute 的已知值v //划分 samples
(9) 由节点N分出一个对应test_attribute=v的分支;
(10)令Sv为 samples中 test_attribute=v 的样本集合;//一个划分块
(11)if Sv为空 then
(12)加上一个叶节点,以samples中最普遍的类标记;
(13)else 加入一个由Decision_Tree(Sv,attribute_list-test_attribute)返回节点值
三、实验内容
基于张加州大学数据集里面的威斯康辛州乳腺癌数据集( Breast Cancer癌症数据集),用MATLAB编写一个分类器,采用决策树。
四、实验要求
把数据集按照7:3的比例作为训练集和测试集,将通过训练得到的决策树模型应用在测试数据集上,得到最终的分类结果,并试着得到决策树的分类错误率。
五、实验要求
1.通过训练集创建的树结点结构体
2.绘制出的决策树模型
中文属性名版本
英文属性名版本
3.运行过程
3.运行过程
4.将模型应用在测试数据集后分类的结果
5.运行结果
最终错误率为7.100592%。
六、实验分析
1. 基于决策树的分类算法的一个最大的优点就是它在学习过程中不需要使用者了解很多背景知识(这同时也是它的最大的缺点),只要训练例子能够用属性-结论式表示出来,就能使用该算法来学习。
2.在ID3算法的假设空间包含所有的决策树,它是关于现有属性的有限离散值函数的一个完整空间。因为每个有限离散值函数可被表示为某个决策树,所以ID3算法避免了搜索不完整。假设空间的一个主要风险:假设空间可能不包含目标函数。
3.如何通俗地理解决策树中的熵&条件熵&信息增益?
答:(1)熵:表示一个随机变量的复杂性或者不确定性。
假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2.6。
(2)条件熵:表示在直到某一条件后,某一随机变量的复杂性或不确定性。
我在看了这件衣服的评价后,我决定买衣服这件事的不确定性是1.2。
我在线下实体店试穿衣服后,我决定买衣服这件事的不确定性是0.9。
(3)信息增益:表示在知道某一条件后,某一随机变量的不确定性的减少量。
上面条件熵给出了两个:
一个是看了网上的评价,此时的信息增益是Gain1=2.6−1.2=1.4Gain1=2.6−1.2=1.4。
另一个是线下试穿了衣服,此时的信息增益Gain2=2.6−0.9=1.7Gain2=2.6−0.9=1.7。
很显然我在线下试穿衣服之后对于决定买这件衣服的不确定度下降更多,更通俗的说就是我试穿衣服之后买这件衣服的可能性更大了。
4.对本实验的想法?
答:决策树这一个实验是我对模式识别这门课程最感兴趣,同时也是收获最大的一个实验,他的优点和缺点都很明显,虽然在模式识别中的地位和影响力可能远远不及SVM或SVM,但是通过决策树,我加深了机器学习中对数据挖掘中分类这一部分的认识,一直以来我对数据挖掘的认识一直停留在python通过爬虫获得数据这一数据采集部分。
决策树这个实验我自认为做的很完美,代码基本都是自己写的,但也花费了大量精力时间去找参考文献,其中遇到的最大的两个问题:
- ID3算法如何处理连续值?
这个问题打从上决策树这一部分时,老师在讲典型的例题根据天气好坏决策商场是否促销时,我就产生了疑问,而这个问题一直想不通,以至于拿到breast-cancer数据集时,看着这么庞大的数据,完全不知道从何下手,后来在CSDN看到了周志华的《机器学习》中关于决策树的部分,其中利用西瓜数据集对决策树进行了讲解,被称为“西瓜书”,而这也彻底使我豁然开朗,这是那个博主的博客网站:
决策树(decision tree)(三)——连续值处理_天泽28的博客-CSDN博客_决策树连续值处理
- 如何创建决策树模型的结点?
这个确实是决策树的一个关键,也是难点,特此我自学了MATLAB中结构体的写法,但遗憾的是,因为如果用递归,自己写代码会很难实现,因此我自己画了一个草图后,发现深度最多只有6层,于是自己手写了全过程。
下面是我的草图,可以看出和最终结果完全一样,以及我手写递归实现的全过程。
(3)遗憾的是我找到了JAVA实现的例程,但是没有MATLAB自带的这种库难度挺大,最终没有用JAVA写,此外我没有进行剪枝操作和分类精度验证(如十次十折交叉验证)。
实验五 K近邻与基于K-means的动态聚类
一、实验目的
通过KNN分类(K近邻)与K-Means聚类(K均值)两种非线性分类方法二合一的实验,加深对近邻算法和聚类分析算法基本思想、特点、方法的理解和掌握,并能区分两种算法的不同,编写能对实际模式样本正确分类的算法程序。
二、实验原理
1. KNN分类(K近邻):
K近邻就是在N个样本中,找出x的K个近邻。
设这N个样本中,来自Wc类的样本有Nc个,若K1,K1,…,Kc分别是K个近邻中属于W1,W1,…,Wc类的样本数,则我们可以定义判别函数为:
决策规则为: 若
则决策。
这就是K近邻的基本规则。
从方法论角度出发, KNN 认为,待分类对象的类别可以通过在它附近的训练数据的类别来确定,所以采取的策略就是找到离待分类对象最近的 K 个邻居进行分析。
实际应用中,可以根据需要选择不同的距离度量,当然也可以利用相似性度量,即把未知样本的类别决策为已知样本中与之最相似的那个样本的类别(也就是相似度最大),当然也有可能出现由不同类别算出的相似度相同的情况,这个时候可以采取随机决策(如取决于最近邻),或者给训练集中数量占优的那一类(以贝叶斯观点来看,就是在似然函数相同情况下,采信先验概率较大的那一类)。
在 KNN 的设计过程中,有四个要点需要注意:
(1)用来对待分类对象所属类别进行评估的数据集合(不一定需要用到整个训练集);
(2)用来计算对象之间相似度的距离或者相似度矩阵(比如,欧式距离,马氏距离等);
(3)K 值的选取,若K=1时,即为最近邻算法;
(4)来确定待分类对象所属类别的方法(比如,距离加权与否)。
2. K-Means聚类(K均值):
K-均值算法的主要思想是先在需要分类的数据中寻找K组数据作为初始聚类中心,然后计算其他数据距离这三个聚类中心的距离,将数据归入与其距离最近的聚类中心,之后再对这K个聚类的数据计算均值,作为新的聚类中心,继续以上步骤,直到新的聚类中心与上一次的聚类中心值相等时结束算法。
算法流程:
(1) 首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。
(2) 从数据集中随机选择k个数据点作为质心。
(3) 对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。
(4) 把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
(5) 如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
(6) 如果新质心和原质心距离变化很大,需要迭代3~5步骤。
数学原理:
如果用数据表达式表示,假设簇划分为(C1,C1,…,Ck),则我们的目标是最小化平方误差
其中μ是簇Ci的均值向量,有时也称为质心,表达式为∶
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。
K-Means采用的启发式方式很简单,用下面一组图就可以形象的描述:
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。
三、实验内容
编程实现K-近邻分类算法和K-均值聚类算法,并在之前PCA特征人脸识别实验中得到的orl_faces_112x92.mat (40类,每类10个样本,10304维特征)数据集上验证其性能。
四、实验要求
1. 利用MATLAB实现K-近邻分类算法时,使用三近邻算法,虽然KNN理论上不需要训练集,但为了计算错误率,把人脸数据集orl_faces随机排序,然后分成200个训练样本和200个测试样本,运行过程中显示出待分类人脸图像和其最近的三个近邻人脸图像,打印出每组测试集数据的最终分类结果,最后计算分类错误率。
2. 利用MATLAB实现K-均值聚类算法时,最后的错误率并不是很好计算;可利用PCA主成分分析法将10304维度的人脸库降维到3维,k取3,并画出聚类完成后3个质心及其3类人脸三维空间中的分布情况。
五、实验结果
1.KNN运行过程:
2.K-Means运行结果:
第一类人脸
第二类人脸
第三类人脸
聚类完成后三维空间中的分布情况
六、实验分析
1.KNN数据表格
运行次数 | 错误率 |
第一次实验 | 7.000000% |
第二次实验 | 11.000000% |
第三次实验 | 7.000000% |
第四次实验 | 8.500000% |
第五次实验 | 9.000000% |
第六次实验 | 11.000000% |
第七次实验 | 8.500000% |
第八次实验 | 8.000000% |
第九次实验 | 5.000000% |
第十次实验 | 10.500000% |
可以看出KNN分类算法的效果还是不错的。
2.KNN比较特殊的情况举例:
三近邻各不相同,取最近邻,最近邻和待分类图像相同,分类正确。
三近邻各不相同,取最近邻,最近邻和待分类图像不同,分类错误。
二、三近邻为同一人,但与待分类图像不是同一人,最近邻和待分类图像为同一人,此时根据数量占优原则,是分类错误的。
3.K-Means比较特殊的情况举例:
第34类完整的分类出了两个人的各自的10张人脸图像
第21类不都是同一个人,但是都很像
第37类第8个不是同一人,但是也戴眼镜。
K-Means聚类后的结果是不大好计算错误率的,但是从最后的聚类结果可以看出:
(1) 聚类后的人脸图像要么是同一人,要么虽然不是同一人但是相似度很高;
(2) 完整聚类出同一人10张人脸图像的比例不小,有的可能只有四五张,但都是同一人。
4.关于各种距离度量算法的选择;
欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
这里找到了一篇很好的博客: k-近邻算法之距离度量_IT之一小佬的博客-CSDN博客_k-distance
5.实验过程中遇到的一个很关键的问题,卡住了自己很久:
Matlab中读取图片后保存的数据是uint8类型(取值范围0~255),但在图像矩阵运算的时候,使用的数据类型却是double类型。若使用uint8类型的数据进行矩阵运算,一旦数据超出255就会溢出。
这是帮助自己解决问题的那个博客: Debug:Matlab处理图像数据时超过255溢出_帅气的小白的博客-CSDN博客_灰度值超过255
6. KNN分类(K近邻)与K-Means聚类(K均值)的区别:
KNN | K-Means |
目的是为了确定一个点的分类 | 目的是为了将一系列点集分成k类 |
KNN是分类算法 | K-Means是聚类算法 |
监督学习,分类目标事先已知 | 非监督学习,将相似数据归到一起从而得到分类,没有外部分类 |
训练数据集有label,已经是完全正确的数据 | 训练数据集无label,是杂乱无章的,经过聚类后才变得有点顺序,先无序,后有序 |
没有明显的前期训练过程,属于memory-based learning | 有明显的前期训练过程 |
K的含义:“k”是用来计算的相邻数据数。来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c | K的含义:“k”是类的数目。K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识 |
K值确定后每次结果固定 | K值确定后每次结果可能不同,从 n个数据对象任意选择 k 个对象作为初始聚类中心,随机性对结果影响较大 |
时间复杂度:O(n) | 时间复杂度:O(n*k*t),t为迭代次数 |
实验六 SVM支持向量机
一、实验目的
通过实验,加深对SVM的认识,其前身为感知机,学会libSVM的安装与使用,最后利用MATLAB,调用libSVM提供的库函数,基于支持向量机理论完成对 Breast Cancer数据集的二分分类器设计。
二、实验原理
1.背景:
支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[10]。
支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力[14](或称泛化能力)。
——以上是经常被有关SVM 的学术文献引用的介绍。
上个世纪90年代,由于人工神经网络(RNN)的衰落,SVM在很长一段时间里都是当时的明星算法。被认为是一种理论优美且非常实用的机器学习算法。
SVM(support vector machine )是支持向量机,是一种可以训练的机器学习方法。
Vapnik等人在多年研究统计学习理论基础上对线性分类器提出了另一种设计最佳准则。其原理也从线性可分说起,然后扩展到线性不可分的情况。甚至扩展到使用非线性函数中去,这种分类器被称为支持向量机(SupportVectorMachine,简称SVM)。支持向量机的提出有很深的理论背景。
在理论方面,SVM算法涉及到了非常多的概念:间隔(margin)、支持向量(support vector)、核函数(kernel)、对偶(duality)、凸优化等。有些概念理解起来比较困难,例如kernel trick和对偶问题。在应用方法,SVM除了可以当做有监督的分类和回归模型来使用外,还可以用在无监督的聚类及异常检测。相对于现在比较流行的深度学习(适用于解决大规模非线性问题),SVM非常擅长解决复杂的具有中小规模训练集的非线性问题,甚至在特征多于训练样本时也能有非常好的表现(深度学习此时容易过拟合)。但是随着样本量m的增加,SVM模型的计算复杂度会呈m2或m3增加。
2.思想:
SVM的主要思想可以概括为两点:
⑴它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
⑵它基于结构风险最小化理论之上在特征空间中建构最优分割超平面,使得学习器得到
全局最优化,并且在整个样本空间的期望风险以某个概率满足一定上界。
在学习这种方法时,首先要弄清楚这种方法考虑问题的特点,这就要从线性可分的最简单情况讨论起,在没有弄懂其原理之前,不要急于学习线性不可分等较复杂的情况,支持向量机在设计时,需要用到条件极值问题的求解,因此需用拉格朗日乘子理论,但对多数人来说,以前学到的或常用的是约束条件为等式表示的方式,但在此要用到以不等式作为必须满足的条件,此时只要了解拉个朗日理论的有关结论就行。
3.原理:
传统的SVM做的事情其实就是找到一个超平面,实现二分类,一类+1,一类-1。如上所示。它的目的就是使得两类的间隔最大。黑色的块表示距离分割面最近的样本向量,称为支持向量。
如果我们在低维空间里找不到一个线性分类面把样本分开,SVM就为我们提供了一个思路:将数据从低维空间映射到高维空间后,就很可能使得这堆数据线性可分。比如说,我们要在猫科动物这个特征很局限的“低维空间”里去分猫和老虎,是比较困难的,因为他们很多特征比较相近。但是,如果我们有了更多的参考依据,从生物界的视角,即一个“高维空间”再去区分猫和老虎,我们就有了更多的理由来做出科学的辨别。至于如何低维映射到高维,就是一门数学上的学问了。
SVM方法是通过一个非线性映射p,把样本空间映射到一个高维乃至无穷维的特征空间中(Hilbert空间),使得在原来的样本空间中非线性可分的问题转化为在特征空间中的线性可分的问题.简单地说,就是升维和线性化.升维,就是把样本向高维空间做映射,一般情况下这会增加计算的复杂性,甚至会引起“维数灾难”,因而人们很少问津.但是作为分类、回归等问题来说,很可能在低维样本空间无法线性处理的样本集,在高维特征空间中却可以通过一个线性超平面实现线性划分(或回归).一般的升维都会带来计算的复杂化,SVM方法巧妙地解决了这个难题:应用核函数的展开定理,就不需要知道非线性映射的显式表达式;由于是在高维特征空间中建立线性学习机,所以与线性模型比,不但几乎不增加计算的复杂性,而且在某种程度上避免了“维数灾难”.这一切要归功于核函数的展开和计算理论。
K就是核函数,做一个内积的运算。SVM中核函数保证了低维空间里的计算量,输出到高维空间里。K相当于隐含层的神经元。核函数的输出乘上权重,进入激活函数处。
选择不同的核函数,可以生成不同的SVM,常用的核函数有以下4种:
⑴线性核空间K(x,y)=x·y;
⑵多项式核函数K(x,y)=[(x·y)+1]d;
⑶径向基函数K(x,y)=exp(-|x-y|^2/d^2)
⑷二层神经网络核函数K(x,y)=tanh(a(x·y)+b)
4.特征:
⑴SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
⑵SVM通过最大化决策边界的边缘来控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。
⑶通过对数据中每个分类属性引入一个哑变量,SVM可以应用于分类数据。
⑷SVM一般只能用在二类问题,对于多类问题效果不好。
三、实验内容
基于张加州大学数据集里面的威斯康辛州乳腺癌数据集( Breast Cancer癌症数据集),用MATLAB编写一个二分分类器,采用SVM支持向量机,可以使用libSVM的库函数。
四、实验要求
1)把数据集按照7:3的比例作为训练集和测试集,将通过训练得到的SVM支持向量机模型应用在测试数据集上,得到最终的分类结果,并试着得到决策树的分类正确率。
2)为什么一定要进行数据归一化处理, 如果不归一化, 程序错误率如何呢?
五、实验结果
1.libSVM的安装较为重要的事项
1.网址为:LIBSVM -- A Library for Support Vector Machines (ntu.edu.tw)
2. 在matlab命令行中输入mex -setup -v 查看一下电脑中有啥编译器
若是能找到c++编译器,可直接尝试在命令行窗口输入make,执行make.m程序进行编译,完成后出现4个后缀为.mexw64文件。如果没有则可去MATLAB官网下在MinGW-W64。
3.要在MATLAB添加libSVM的路径
2.程序运行过程
3、程序运行结果(程序大概需运行3分钟)
可以看出最终得到的SVM支持向量机模型应用到训练集中正确率为99.25%,测试集中正确率为94.0828%。
可以看出测试集一共169个数据,真实类别红色线上的点不在蓝色预测线上的点很少,说明错误率很低。
六、实验分析
1. SVM 的优势:
(1) 处理解决了样本数据较少的机器学习问题;
(2) 提高了学习机的泛化性能;
(3) 少数支持向量决定了最后的决策函数,因此,某种程度上对高维问题有很好的辅助解决作用,提高了方法的鲁棒性;
(4) 完善改进了对于非线性数据分类研究的问题;
(5) 规避了神经网络在结构抉择问题和局部极小值问题。
SVM 的劣势:
(1) 缺乏对数据缺失的判断能力;
(2) 解决非线性数据还没有完善的方案和措施,只能靠慎重的选择核函数来解决。 另一方面, 所有传统分类方法中, SVM 的分类性能是最好的。
2. 为什么一定要进行数据归一化处理, 如果不归一化, 程序错误率如何呢?
答:因为归一化很有可能提高精度,例如一共特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖。而且归一化还可以提高求解最优解速度,更快地收敛。
如果不进行归一化处理, 程序错误率较高, 最后进行分类的时候也出现了大量的错误归类现象。
3. 这次的实验经过决策树以后,仍然继续参考了周志华的《机器学习》第六章中关于SVM的部分,这本出名的“西瓜书”对SVM的讲解确实很好,这里有一个参考网址:
4.除了西瓜书之外,这个博客对SVM及SVR讲解的也非常全面:
模式识别之svm()---支持向量机svm 简介1995_weixin_34077371的博客-CSDN博客
- 关于libSVM的安装可参考这个博客:
MATLAB libsvm 安装和使用_qq:843375677的博客-CSDN博客_libsvm matlab
- 有关libSVM库函数的使用可参考这个网址:
关于libSVM的一些总结_sherry_gp的博客-CSDN博客_libsvmread
8. SVM 怎样能得到好的结果?
答:1) 对数据做归一化(simple scaling)
2) 应用 RBF kernel
3) 用cross-validation和grid-search 得到最优的c和g
4) 用得到的最优c和g训练训练数据
5) 测试
9. SVM的改进:解决回归拟合问题的SVR
为了利用SVM解决回归拟合方面的问题,Vapnik等人在SVM分类的基础上引入了不敏感损失函数,从而得到了回归型支持向量机(Support Vector Machine for Regression,SVR)。
SVM应用于回归拟合分析时,其基本思想不再是寻找一个最优分类面使得两类样本分开,而是寻找一个最优分类面使得所有训练样本离该最优分类面的误差最小。