您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Adaboost算法多类问题Matlab实现
一种adaboost多类分类算法Matlab实现一、adaboost算法简介Adaboost算法的主要思想是给定一个训练集(x1,y1),…,(xm,ym),其中xi属于某个域或者实例空间X,yi=-1或者+1。初始化时Adaboost指定训练集上的分布为1/m,并按照该分布调用弱学习器对训练集上的分布,并按照该分布调用弱学习器对训练集进行训练,每次训练后,根据训练结果更新训练集上的分布,并按照新的样本分布进行训练。反复迭代T轮,最终得到一个估计序列h1,..,hT,每个估计都具有一定的权重,最终的估计H是采用权重投票方式获得。Adaboost算法的伪代码如图1所示。图1、Adaboost算法二、多类问题从上面的流程可以看出,Adaboost算法是针对二类问题的。但是我们面对的问题很多都是不是简单的非0即1,而是多类问题。常见的就是解决方法,就是把多类问题转换成二类问题。用的比较多就是两种组合方法,OAA和OAO,我这里就是采用对这种方法的结合,实现adaboost算法对多类问题的分类。目前需要对7类问题进行分类,依次编号:0、1、2、3、4、5、6。特征向量28个。样本总数840个;OAA分类器的个数7个OAO分类器的个数7(7-1)/2=21个。弱分类器的个数K=10;弱分类用BP神经网络算法的思路:Step1、把数据分成训练集和测试集Step2、训练OAA、OAO分类器;Step3、保存相应的分类器和投票权重;Step4、测试样本,预测所以OAA分类器的权重;Step5、选择OAA预测值中最大的两个Step6、选用OAO分类器对选取预测权重最大的两个类进行预测;Step7、输出测试结果;注:为了统一,在训练OAO分类器是,把类别序列在前的类为正样本,输出+1,类别序列号在后面的为负样本,输出为-1。测试强分类器的识别率为:0.93左右。三、小结其实这个主要的思想就是用差异的样本和差异的分类器,组合较好的分类器器,提升样本的准确性和鲁邦性。在对多类问题识别中。个人觉得本算法还是有一定的缺陷,如果从OAA分类器预测值中选取的最大的两个值,不包含在我们正确的样本类别中,那么我们最后的OAO决策就没有意义。因此对这个OAA预测值的组合也是一个比较关键的技术,也请大家有好的组合决策方法进行交流。我对Adaboost算法理解的比较肤浅,还请大家指点。如有需要请加QQ272122352,验证多类分类问题谢谢合作,非诚勿扰!附件1、OAO/OAA分类器训练clearclctic,%加载数据loadSheet1Sheet1%删除无效数据while(1)if(Sheet1(end,1)==0)Sheet1(end,:)=[];elsebreak;endend%分解输入输出Input=Sheet1(:,2:end)';Output=Sheet1(:,1)';N=max(max(Output));%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成一对多(one-against-all)分类器%%%类别标志,把样本组合成一对多的分类器。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%NetName_OAA={};NetName_OAA_C=0;forFlag=0:N%输入变量归一化处理[inputn,inputps]=mapminmax(Input);input_train=[];input_test=[];output_train=[];output_test=[];%生成测试集和训练集%训练样本和测试样本比例P=0.8;forNN=0:NIndex=find(Output==NN);Long=length(Index);%80%的训练、20%测试input_train=[input_traininputn(:,Index(1):Index(1)+floor(Long*P))];input_test=[input_testinputn(:,Index(1)+floor(Long*P)+1:Index(end))];output_train=[output_trainOutput(:,Index(1):Index(1)+floor(Long*P))];output_test=[output_testOutput(:,Index(1)+floor(Long*P)+1:Index(end))];end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Long1=length(output_train);Long2=length(output_test);forx=1:Long1if(output_train(x)==Flag)output_train(x)=1;elseoutput_train(x)=-1;endendfory=1:Long2if(output_test(y)==Flag)output_test(y)=1;elseoutput_test(y)=-1;endend%训练弱分类器[Sizem,Sizen]=size(input_train);D(1,:)=ones(1,Sizen)/Sizen;%弱分类器个数K=10;[Out,Outn]=mapminmax(output_train);forKK=1:K%错误率error(KK)=0;Flag_error=-1;%NetName=strcat(num2str(Flag),'_',num2str(KK),'Class');%net=NetName;%BP神经网络构建net=newff(input_train,output_train,9);net.trainParam.epochs=50;net.trainParam.lr=0.1;net.trainParam.goal=0.00004;%BP神经网络训练net=train(net,input_train,output_train);%训练集数据预测an1=sim(net,input_train);test_simu1(KK,:)=mapminmax('reverse',an1,Outn);%%测试数据预测%an=sim(net,input_test);%test_simu(KK,:)=mapminmax('reverse',an,Outn);%%统计训练集输出效果kk1=find(test_simu1(KK,:)0);kk2=find(test_simu1(KK,:)0);aa(kk1)=1;aa(kk2)=-1;%统计错误样本数forj=1:Sizenifaa(j)~=output_train(j);error(KK)=error(KK)+D(KK,j);endendiferror(KK)==0Flag_error=KK;break;end%弱分类器i权重at(KK)=0.5*log((1-error(KK))/error(KK));%更新D值forj=1:SizenD(KK+1,j)=D(KK,j)*exp(-at(KK)*aa(j)*test_simu1(KK,j));end%D值归一化Dsum=sum(D(KK+1,:));D(KK+1,:)=D(KK+1,:)/Dsum;%NetName=strcat(num2str(Flag),'_',num2str(KK),'Class');%save(NetName,'net');NetName_OAA{Flag+1,KK}=net;NetName_OAA_C(Flag+1,KK)=at(KK);%强分类器分类结果%OutPut=sign(at*test_simu);endifFlag_error~=-1NetName_OAA_C(Flag+1,Flag_error:10)=0;%如果第一次就为零、那么该分类器就是强分类器ifFlag_error==1NetName_OAA_C(Flag+1,1)=1;NetName_OAA{Flag+1,1}=net;endendend%保存分类器saveNetName_OAANetName_OAAsaveNetName_OAA_CNetName_OAA_C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生产一对一的分类器%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%tic,%一共有N*(N-1)/2个分类器NetName_OAO={};%训练样本和测试样本比例P=0.8;input_train=[];input_test=[];output_train=[];output_test=[];forNN=0:NIndex=find(Output==NN);Long=length(Index);%80%的训练、20%测试input_train=[input_traininputn(:,Index(1):Index(1)+floor(Long*P))];input_test=[input_testinputn(:,Index(1)+floor(Long*P)+1:Index(end))];output_train=[output_trainOutput(:,Index(1):Index(1)+floor(Long*P))];output_test=[output_testOutput(:,Index(1)+floor(Long*P)+1:Index(end))];endforMM=0:NforNN=0:Nif(MMNN)%选取样本%样本输入%样本输出%为了保存一致性,两类分类器的组合,类别序号在前的为+1,类别序号在后的为-1%如{3,4}-{+1,-1};{MM,NN}={+1,-1};%Input_OAO=Long1=length(output_train);XX=1;input_train_OAO=[];output_train_OAO=[];forx=1:Long1if(output_train(x)==MM)output_train_OAO(XX)=1;input_train_OAO(:,XX)=input_train(:,x);XX=XX+1;endif(output_train(x)==NN)output_train_OAO(XX)=-1;input_train_OAO(:,XX)=input_train(:,x);XX=XX+1;endend%BP神经网络构建net=newff(input_train_OAO,output_train_OAO,9);net.trainParam.epochs=50;net.trainParam.lr=0.1;net.trainParam.goal=0.00004;%BP神经网络训练net=train(net,input_train_OAO,output_train_OAO);NetName_OAO{MM+1,NN+1}=net;elseNetName_OAO{MM+1,NN+1}=0;endendendtocsaveNetName_OAONetName_OAO附件2:测试clearclc%加载分类器loadNetName_OAAloadNetName_OAOloadNetName_OAA_C%加载测试数据loadSheet1%删除无效数据while(1)if(Sheet1(end,1)==0)Sheet1(end,:)=[];elsebreak;endend%分解输入输出In
本文标题:Adaboost算法多类问题Matlab实现
链接地址:https://www.777doc.com/doc-5007261 .html