河海大学物联网工程学院《模式识别》课程实验报告学号 _______________专业 ____计算机科学与技术_____ 授课班号 _________________________ 学生姓名 ___________________指导教师 ___________________完成时间 _______________实验报告格式如下(必要任务必须写上,可选的课后实验任务是加分项,不是必要任务,可不写):实验一、Fisher分类器实验1.实验原理如果在二维空间中一条直线能将两类样本分开,或者错分类很少,则同一类别样本数据在该直线的单位法向量上的投影的绝大多数都应该超过某一值。
而另一类数据的投影都应该小于(或绝大多数都小于)该值,则这条直线就有可能将两类分开。
准则:向量W的方向选择应能使两类样本投影的均值之差尽可能大些,而使类內样本的离散程度尽可能小。
2.实验任务(1)两类各有多少组训练数据?(易)(2)试着用MATLAB画出分类线,用红色点划线表示(中)(3)画出在投影轴线上的投影点(较难)3.实验结果(1)第一类数据有200组训练数据,第二类数据有100组训练数据。
(2)如图所示,先得出投影线的斜率,后求其投影线的垂直线的斜率,即分类线的斜率,再求分类线的过的中垂点,加上即可得出。
画出红线代码:m = (-40:0.1:80);kw = w(2)/w(1);b = classify(w1, w2, w, 0);disp(b);n = (-1/kw).* m + b;plot(m,n,'r-', 'LineWidth', 3);(3)画出投影上的投影点如图,点用X表示。
代码:u = w/sqrt(sum(w.^2));p1 = w1*u*u';plot(p1(:,1),p1(:,2),'r+')p2 = w2*u*u';plot(p2(:,1),p2(:,2),'b+')实验二、感知器实验1.实验原理(1)训练数据必须是线性可分的(2)最小化能量,惩罚函数法-错分样本的分类函数值之和(小于零)作为惩罚值(3)方法:梯度下降法,对权值向量的修正值-错分样本的特征向量2.实验任务(1)训练样本不线性可分时,分类结果如何?(2)程序33-35行完成什么功能?用MATLAB输出x1、x2、x的值,进行观察(中)(3)修改程序,输出梯度下降法迭代的次数(易);3.实验结果(1)在创建样本时,故意将两组数据靠近,实现训练样本非线性。
训练样本由于训练样本不是非线性的,所以无法保证收敛,得不出结果,在运行非线性样本时,无法得到收敛,所以我的程序也经常卡住,只能重启matlab。
(2)程序33-35行在计算得出训练样本,x1加上全为1的一维矩阵得到新的x1,x2也如此,只不过x2全部取烦,取负。
最后得到X = [x1;x2],为下面应用于感知器算法做准备。
(3)通过增加一些代码可得,梯度下降法迭代次数为1244次。
实验三、BP网络预测实验1.实验原理学习过程中由信号的正向传播与误差的逆向传播两个过程组成。
正向传播时, 模式作用于输入层, 经隐层处理后, 传入误差的逆向传播阶段, 将输出误差按某种子形式, 通过隐层向输入层逐层返回, 并“分摊”给各层的所有单元, 从而获得各层单元的参考误差或称误差信号, 以作为修改各单元权值的依据. 权值不断修改的过程, 也就是网络学习过程. 此过程一直进行到网络输出的误差准逐渐减少到可接受的程度或达到设定的学习次数为止. BP网络模型包括其输入输出模型, 作用函数模型, 误差计算模型和自学习模型。
BP网络由输入层, 输出层以及一个或多个隐层节点互连而成的一种多层网, 这种结构使多层前馈网络可在输入和输出间建立合适的线性或非线性关系, 又不致使网络输出限制在-1和1之间. 见图1。
2.实验任务(1)将net = newff(inputn,output, [5,5]),均方误差,运行时间如何变化,与net = newff(inputn,output, 5)进行对比(2)net = newff(inputn,output, 5)中的5,设置为6,7,8,9,10,分别观察均方误差,运行时间的变化3.实验结果(1)任务1当net = newff(inputn,output, 5)时,结果如图:当net = newff(inputn,output, [5,5])时,结果如图:前者为一个隐藏层,中有5个隐藏节点,第二个为有两个隐藏层,各有5个隐藏节点。
两者从实验结果中,均方误差后者更小,运行时间上后者需要时间长,因为其隐藏层多一层,迭代次数增加。
结论为,利用两层隐藏节点比一层误差小,效果更好。
(2)任务2当net = newff(inputn,output, 6)时如下图,当net = newff(inputn,output, 7)时如下图,下面为隐藏节点为8和9的结果:结论:随着隐藏节点的增加,运行时间逐渐变长,但是均方误差不一定越来越小,而且可能出现误差越来越大的情况,说明隐藏节点数不是越多越好,而是有一个最佳值,在最佳值往上或往下,误差都会变大,例如此实验中5便是最佳隐藏节点数。
实验四、SVM实验1.实验原理支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。
SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。
SVM的的学习算法就是求解凸二次规划的最优化算法。
svm是一个二分器,只能用于2类样本的分类,现在我们将它推广到多类问题。
本文是对svm进行推广到能够处理多类问题。
采用一对一的投票策略。
将a、b、c、d 4类样本两类两类的分成训练集,即(a,b)、(a,c)、(a,d)、(b,c)、(b,d)、(c,d),得到6个(对于n类问题,为n(n-1)/2个)svm二分器。
在测试的时候,把测试样本x依次送入这6个二分器,采取投票形式,最后得到一组结果。
投票是以如下方式进行。
初始化:vote(a)=vote(b)=vote(c)=vote(d)=0. 投票过程:如果使用训练集(a,b)得到的分类器将x判定为a类,则vote(a)=vote(a)+1,否则vote(b)=vote(b)+1;如果使用(a,c)训练的分类器将x判定为a类,则vote(a)=vote(a)+1,否则vote(c)=vote(c)+1;...;如果使用(c,d)训练的分类器将x判定为c类,则vote(c)=vote(c)+1,否则vote(d)=vote(d)+1。
最终判决:max(vote(a),vote(b),vote(c),vote(d))。
如有两个以上的最大值,则一般可以简单地取第一个最大值所对应的类别。
2.实验任务为什么一定要进行数据归一化处理,如果不归一化,程序错误率如何呢?请修改程序进行观察。
3.实验结果因为归一化很有可能提高精度,,例如一共特征值域范围非常大,那么距离计算就主要取决于这个特征,从而于实际情况相悖。
而且归一化还可以提高求解最优解速度,更快地收敛。
如果不进行归一化处理,程序错误率较高,最后进行分类的时候也出现了大量的错误归类现象。
如下两图中,左图是进行归一化处理的,右图则没有进行归一化处理,右边在执行的时候,收敛较慢,且分类结果有较大的误差,远远没有归一化的好。
实验五、决策树分类器实验1.实验原理决策树是通过一系列规则对数据进行分类的过程。
它提供一种在什么条件下会得到什么值的类似规则的方法。
决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
一棵决策树的生成过程主要分为以下3个部分:特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
决策树生成:根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。
树结构来说,递归结构是最容易理解的方式。
剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。
剪枝技术有预剪枝和后剪枝两种。
决策树的基本构造方法有ID#算法,理论基础为熵。
如果一个时间有k中可能的结果,每种结果对应的概率为Pi,i = 1,2,…,k,则用I表示该事件的不纯度:计算如下:∑=-=+++-=k i ii k k P P P P P P P P I 122222121log )log log log (这反映了节点的熵不纯度。
2. 实验任务利用决策树的程序,编写一个随机森林分类器,采用决策树,通过投票的方法,得到最终的分类结果,试比较决策树与随机森林的分类错误率。
(中)提示:随机森林的实现步骤:重采样、决策树分类、投票决策。
3. 实验结果随机森林算法我利用python 实现,具体步骤如下:(1)从样本集中用Bootstrap 采样选出n 个样本;(2)从所有属性中随机选择K 个属性,选择出最佳分割属性作为节点创建决策树;(3)重复以上两步m 次,即建立m 棵决策树;(4)这m 个决策树形成随机森林,通过投票表决结果决定数据属于那一类具体关键步骤代码:#######################随机森林模型### n_estimators :迭代次数,每次迭代为Y 产生一个模型forest = RandomForestClassifier(n_estimators =100, criterion ='gini', max_depth =1, random_state =0) forest.fit(x_train, y_train)#max_depth 一般不宜设置过大,把每个模型作为一个弱分类器#模型效果评估score = forest.score(x_test, y_test)print ("准确率:%.2f%%" % (score * 100))forest_y_score = forest.predict_proba(x_test)# prodict_proba 输出概率下图一为决策树分类器,图2为随机森林分类由此可见,多个决策树形成的随机森林效果要好于决策树分类。
并且随机森林通过调参等方法可以使得正确性进一步提升。
我还计算出了随机森林中树数目、深度和错误率的关系如图:当树深度越深,数目越大,错误率也就越小。