Adaboost算法多类问题Matlab实现

合集下载

Matlab机器学习工具箱中的集成学习技术

Matlab机器学习工具箱中的集成学习技术

Matlab机器学习工具箱中的集成学习技术随着人工智能领域的发展和机器学习技术的不断推进,集成学习作为一种重要的机器学习方法,正在被广泛应用于各个领域。

在Matlab机器学习工具箱中,集成学习技术得到了很好的支持和实现。

本文将详细介绍Matlab机器学习工具箱中的集成学习技术,并探讨其在实际问题中的应用。

一、集成学习简介集成学习是一种将多个学习器进行适当组合的机器学习方法。

它通过对多个学习器的预测结果进行投票或加权平均等方式,获得更准确、更稳定的预测结果。

集成学习的核心思想是“三个臭皮匠胜过一个诸葛亮”,通过组合多个学习器的优势,从而实现更好的分类或回归效果。

在Matlab机器学习工具箱中,集成学习技术被封装在ensemble子库中。

该子库提供了多种集成学习算法的实现,包括AdaBoost、Bagging、随机森林等。

同时,Matlab还提供了相关的函数和工具,方便用户进行集成学习的模型训练、预测和评估。

二、AdaBoost算法AdaBoost是集成学习中最经典的算法之一,也是Matlab机器学习工具箱中支持的算法之一。

AdaBoost的核心思想是通过迭代的方式训练一系列弱分类器,并根据它们的性能进行加权组合,获得精确的分类器。

具体算法流程如下:1. 初始化数据权重:给每个样本一个初始权重,初始权重可以是相同的或根据样本分布设定。

2. 训练弱分类器:使用当前数据权重训练一个弱分类器,通常是使用一个简单的分类算法,比如决策树。

3. 更新样本权重:根据分类器的性能更新样本的权重,被错误分类的样本权重会得到增加,被正确分类的样本权重会得到减少。

4. 组合弱分类器:对每个弱分类器根据其分类性能进行加权组合,形成最终的分类器。

通过这种方式,AdaBoost能够不断改进分类器的性能,从而提高整体的预测准确率。

在Matlab中,可以使用ensemble子库中的adaboost函数来实现AdaBoost算法。

三、Bagging算法Bagging是另一种常见的集成学习算法,也是Matlab机器学习工具箱中支持的算法之一。

数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)

数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)

数据挖掘领域⼗⼤经典算法之—AdaBoost算法(超详细附代码)相关⽂章:数据挖掘领域⼗⼤经典算法之—C4.5算法(超详细附代码)数据挖掘领域⼗⼤经典算法之—K-Means算法(超详细附代码)数据挖掘领域⼗⼤经典算法之—SVM算法(超详细附代码)数据挖掘领域⼗⼤经典算法之—Apriori算法数据挖掘领域⼗⼤经典算法之—EM算法数据挖掘领域⼗⼤经典算法之—PageRank算法数据挖掘领域⼗⼤经典算法之—K-邻近算法/kNN(超详细附代码)数据挖掘领域⼗⼤经典算法之—朴素贝叶斯算法(超详细附代码)数据挖掘领域⼗⼤经典算法之—CART算法(超详细附代码)简介Adaboost算法是⼀种提升⽅法,将多个弱分类器,组合成强分类器。

AdaBoost,是英⽂”Adaptive Boosting“(⾃适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。

它的⾃适应在于:前⼀个弱分类器分错的样本的权值(样本对应的权值)会得到加强,权值更新后的样本再次被⽤来训练下⼀个新的弱分类器。

在每轮训练中,⽤总体(样本总体)训练新的弱分类器,产⽣新的样本权值、该弱分类器的话语权,⼀直迭代直到达到预定的错误率或达到指定的最⼤迭代次数。

总体——样本——个体三者间的关系需要搞清除总体N。

样本:{ni}i从1到M。

个体:如n1=(1,2),样本n1中有两个个体。

算法原理(1)初始化训练数据(每个样本)的权值分布:如果有N个样本,则每⼀个训练的样本点最开始时都被赋予相同的权重:1/N。

(2)训练弱分类器。

具体训练过程中,如果某个样本已经被准确地分类,那么在构造下⼀个训练集中,它的权重就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提⾼。

同时,得到弱分类器对应的话语权。

然后,更新权值后的样本集被⽤于训练下⼀个分类器,整个训练过程如此迭代地进⾏下去。

(3)将各个训练得到的弱分类器组合成强分类器。

matlab神经网络多分类(模式识别神经网络nprtool)

matlab神经网络多分类(模式识别神经网络nprtool)

matlab神经⽹络多分类(模式识别神经⽹络nprtool)⼀、模式识别神经⽹络在matlab命令窗⼝输⼊:nnstart 或 nprtool 就可以进⼊matlab神经⽹络GUI⼆、鸢尾花数据集iris⽰例1.输⼊数据集,划分训练集、测试集load fisheriris;[m,n]=size(meas);data=zeros(m,n+1);data(:,1:n)=meas;for i=1:m %将字符串类别标签⽤数值形式表⽰if strcmp(species{i},'setosa') %strcmp('A','B')⽤于⽐较字符串,找出特定的字符串;类⽐find(a==b)⽤来找出特定数值data(i,n+1)=1;elseif strcmp(species{i},'versicolor')data(i,n+1)=2;elseif strcmp(species{i},'virginica')data(i,n+1)=3;endend%选择训练样本个数num_train = 60; %共150个样本,60个训练集,90个测试集%构造随机选择序列choose = randperm(length(data)); %随机种⼦打乱数据样本的顺序train_data = data(choose(1:num_train),:); %随机选取60个样本label_temp = train_data(:,end); %提取训练数据的标签 train(:,end)提取最后⼀列;label_train = zeros(length(train_data),3); %创建矩阵以储存向量形式的标签;%把输出分类标签1,2,3 改为⼯具箱要求的格式1=[100],2=[010],3=[001]for i = 1:length(train_data)label_train(i,label_temp(i)) = 1;endtrain_data = train_data(:,1:end-1)'; %提取数据集特征(剔除标签),并进⾏转置(转置也可以不必,后续GUI中转化为⾏形式即可)label_train = label_train'; %将向量形式表⽰的标签进⾏转置(也⽽不必,理由同上)test_data = data(choose(num_train+1:end),:); %提取测试集数据label_temp = test_data(:,end); %提取测试集数据的标签label_test = zeros(length(test_data),3); %创建矩阵,准备存放向量形式的测试数据的标签%把输出分类标签改为⼯具箱要求的格式for i = 1:length(test_data)label_test(i,label_temp(i)) = 1;endtest_data = test_data(:,1:end-1)'; %提取测试数据的特征,并进⾏转置label_test = label_test'; %提取测试数据的标签,并进⾏转置2. 三种⽅法进⾏模式识别神经⽹络搭建2.1 ⼿动编写m函数法法1操作⽅法:⼿动编写m函数如下(借鉴参考资料)%有三种⽅式%法1.命令窗⼝输⼊nnstart,选择pattern recognition app,⽤matlab⾃带GUI进⾏⽹络设置(最简单)%法2.完成法1后,⾃动⽣成代码,将创建⽹络的代码⽤m⽂件保存,下次要调⽤该⽹络可直接调⽤该m⽂件%法3.编写如下代码% Create a Pattern Recognition NetworkhiddenLayerSize = 10; %隐藏层神经元个数设置为10net = patternnet(hiddenLayerSize); %创建模式识别神经⽹络patternnet% 将训练集再按⽐例70:15:15分为训练集、验证集、测试集net.divideParam.trainRatio = 70/100;net.divideParam.valRatio = 15/100;net.divideParam.testRatio = 15/100;% Train the Network[net,tr] = train(net,train_data,label_train); %tr为训练过程参数?% Test the Networkpredict = net(test_data); %得到每个样本属于第⼀类、第⼆类、第三类的概率[~,predict] = max(predict); %选择概率最⼤的类别作为某⼀个测试样本的类别%% show the result --testingsfig=figure;gscatter(test_data(1,:),test_data(2,:),predict);[~,label_test] = max(label_test);accuracy = length(find(predict==label_test))/length(test_data);title(['predict the testing data and the accuracy is :',num2str(accuracy)]);法1结果:准确率:93.3%,分类效果不错。

Adaboost算法多类问题Matlab实现演示教学

Adaboost算法多类问题Matlab实现演示教学

A d a b o o s t算法多类问题M a t l a b实现一种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、把数据分成训练集和测试集Step 2、训练OAA、OAO分类器;Step3、保存相应的分类器和投票权重;Step4、测试样本,预测所以OAA分类器的权重;Step5、选择OAA预测值中最大的两个Step6、选用OAO分类器对选取预测权重最大的两个类进行预测;Step7、输出测试结果;注:为了统一,在训练OAO分类器是,把类别序列在前的类为正样本,输出+1,类别序列号在后面的为负样本,输出为-1。

测试强分类器的识别率为:0.93左右。

Adaboost算法多类问题Matlab实现

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、把数据分成训练集和测试集Step 2、训练OAA、OAO分类器;Step3、保存相应的分类器和投票权重;Step4、测试样本,预测所以OAA分类器的权重;Step5、选择OAA预测值中最大的两个Step6、选用OAO分类器对选取预测权重最大的两个类进行预测;Step7、输出测试结果;注:为了统一,在训练OAO分类器是,把类别序列在前的类为正样本,输出+1,类别序列号在后面的为负样本,输出为-1。

测试强分类器的识别率为:0.93左右。

三、小结其实这个主要的思想就是用差异的样本和差异的分类器,组合较好的分类器器,提升样本的准确性和鲁邦性。

adaboost算法程序matlab

adaboost算法程序matlab

adaboost算法程序matlabAdaboost算法是一种常用的集成学习方法,广泛应用于分类问题中。

它的核心思想是通过集成多个弱分类器,来构建一个强分类器,从而提高整体分类的准确性。

本文将介绍Adaboost算法的原理和主要步骤,并使用Matlab编写一个简单的Adaboost算法程序。

Adaboost算法的原理非常简单,它通过迭代的方式,每次训练一个弱分类器,并根据分类结果调整样本权重,使得分类错误的样本在下一轮训练中得到更多的关注。

最终,将所有弱分类器的结果进行加权投票,得到最终的分类结果。

Adaboost算法的主要步骤如下:1. 初始化样本权重。

将所有样本的权重初始化为相等值,通常为1/N,其中N为样本数量。

2. 迭代训练弱分类器。

在每一轮迭代中,根据当前样本权重训练一个弱分类器。

弱分类器可以是任何分类算法,如决策树、支持向量机等。

3. 计算分类误差率。

根据当前弱分类器的分类结果,计算分类误差率。

分类误差率定义为分类错误的样本权重之和。

4. 更新样本权重。

根据分类误差率,更新样本权重。

分类错误的样本权重会增加,而分类正确的样本权重会减少。

5. 计算弱分类器权重。

根据分类误差率,计算当前弱分类器的权重。

分类误差率越小的弱分类器权重越大,反之越小。

6. 更新样本权重分布。

根据弱分类器的权重,更新样本权重分布。

分类错误的样本权重会增加,而分类正确的样本权重会减少。

7. 终止条件判断。

如果达到预定的迭代次数或分类误差率满足终止条件,则停止迭代。

8. 构建强分类器。

将所有弱分类器的结果进行加权投票,得到最终的分类结果。

权重越大的弱分类器对分类结果的贡献越大。

接下来,我们使用Matlab编写一个简单的Adaboost算法程序。

假设我们有一个二分类问题的训练集,包含N个样本和D个特征。

我们使用决策树作为弱分类器。

我们需要定义一些参数,如迭代次数和弱分类器数量。

然后,我们初始化样本权重和弱分类器权重。

adaboost-bp的matlab代码

adaboost-bp的matlab代码

Adaboost算法和BP算法都是常用的机器学习算法,在应用中有着广泛的应用。

本文将分别介绍Adaboost和BP算法的原理,然后给出它们在Matlab中的代码实现。

1. Adaboost算法原理Adaboost(Adaptive Boosting)算法是一种集成学习方法,它通过训练多个弱分类器,然后将这些弱分类器进行组合,构成一个强分类器。

Adaboost算法的基本思想是每一轮训练都调整数据分布,使得前一轮分类错误的样本在下一轮中受到更多的关注,以此来提高分类的准确性。

Adaboost的算法流程如下:1. 初始化训练数据的权值分布,使得每个样本的权值相等。

2. 对于每一轮训练,根据当前的数据权值分布训练一个弱分类器。

3. 计算该弱分类器的分类错误率,并根据错误率调整样本的权值分布。

4. 根据弱分类器的权重,更新最终的分类器。

5. 重复步骤2-4,直到达到预定的训练轮数或者分类误差达到要求。

2. BP算法原理BP(Back Propagation)算法是一种常用的神经网络训练算法,它通过利用梯度下降法来不断调整神经网络的权值,使得网络的输出尽可能接近于期望的输出。

BP算法的基本思想是通过计算误差的梯度来调整网络中每一个连接的权值,以最小化网络的总误差。

BP算法的算法流程如下:1. 初始化神经网络的权值,可以使用随机值来进行初始化。

2. 对于每一个训练样本,通过正向传播计算网络的输出,并计算输出与期望输出之间的误差。

3. 通过反向传播计算每个权值的梯度,并根据梯度下降法来调整权值。

4. 重复步骤2-3,直到达到预定的训练轮数或者网络的误差达到要求。

3. Adaboost的Matlab代码实现以下是Adaboost算法在Matlab中的代码实现:```function [strongClassifier, alpha] = adaboost(X, y, T)N = size(X, 1); 样本数D = ones(N, 1)/N; 初始化样本权值分布weakClassifiers = cell(1, T); 初始化弱分类器数组alpha = zeros(1, T); 初始化弱分类器权重数组for t = 1:T训练一个弱分类器[weakClassifier, error, h] = tr本人nWeakClassifier(X, y, D);if error >= 0.5break; 弱分类器误差大于0.5,停止训练end更新弱分类器权重alpha(t) = 0.5 * log((1-error)/error);更新样本权值分布D = D .* exp(-alpha(t) * y .* h);D = D / sum(D);保存弱分类器和权重weakClassifiers{t} = weakClassifier;end构建强分类器strongClassifier.weakClassifiers = weakClassifiers; strongClassifier.alpha = alpha;end```4. BP算法的Matlab代码实现以下是BP算法在Matlab中的代码实现:```function [W1, W2] = tr本人nBP(X, y, hiddenSize, lr, epochs) inputSize = size(X, 2);outputSize = size(y, 2);W1 = randn(inputSize, hiddenSize); 输入层到隐藏层的权值矩阵W2 = randn(hiddenSize, outputSize); 隐藏层到输出层的权值矩阵for epoch = 1:epochsfor i = 1:size(X, 1)正向传播z1 = X(i, :) * W1;a1 = sigmoid(z1);z2 = a1 * W2;a2 = sigmoid(z2);计算误差error = y(i, :) - a2;反向传播d2 = error .* dsigmoid(z2);d1 = (d2 * W2') .* dsigmoid(z1);更新权值W2 = W2 + lr * a1' * d2;W1 = W1 + lr * X(i, :)' * d1;endendend```以上分别介绍了Adaboost算法和BP算法的原理,以及它们在Matlab中的代码实现。

MATLAB_智能算法30个案例分析

MATLAB_智能算法30个案例分析

MATLAB_智能算法30个案例分析MATLAB是一种强大的数值计算和编程工具,教育和科研领域中广泛应用于数据分析、机器学习和智能算法的研究。

在本文中,我们将介绍30个MATLAB智能算法的案例分析,并探讨其用途和优势。

分析的案例包括分类、回归、聚类、神经网络和遗传算法等不同类型的智能算法。

1. K均值聚类:利用MATLAB中的kmeans函数对一组数据进行聚类分析,得到不同的簇。

2. 随机森林:利用MATLAB中的TreeBagger函数构建一个随机森林分类器,并通过测试数据进行分类预测。

3. 人工神经网络:使用MATLAB中的feedforwardnet函数构建一个人工神经网络,并通过训练集进行预测。

4. 遗传算法:利用MATLAB中的ga函数对一个优化问题进行求解,找到最优解。

5. 支持向量机:使用MATLAB中的svmtrain和svmclassify函数构建一个支持向量机分类器,并进行分类预测。

6. 极限学习机:使用MATLAB中的elmtrain和elmpredict函数构建一个极限学习机分类器,并进行分类预测。

7. 逻辑回归:使用MATLAB中的mnrfit和mnrval函数构建一个逻辑回归模型,并进行预测。

8. 隐马尔可夫模型:使用MATLAB中的hmmtrain和hmmdecode函数构建一个隐马尔可夫模型,对一系列观测数据进行预测。

9. 神经进化算法:利用MATLAB中的ne_train函数构建一个基于神经进化算法的神经网络分类器,并进行分类预测。

10. 朴素贝叶斯分类器:使用MATLAB中的NaiveBayes对象构建一个朴素贝叶斯分类器,并进行分类预测。

11. 高斯过程回归:使用MATLAB中的fitrgp函数构建一个高斯过程回归模型,并进行回归预测。

12. 最小二乘支持向量机:使用MATLAB中的fitcsvm函数构建一个最小二乘支持向量机分类器,并进行分类预测。

13. 遗传网络:利用MATLAB中的ngenetic函数构建一个基于遗传算法和人工神经网络的分类器,并进行分类预测。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种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、把数据分成训练集和测试集Step 2、训练OAA、OAO分类器;Step3、保存相应的分类器和投票权重;Step4、测试样本,预测所以OAA分类器的权重;Step5、选择OAA预测值中最大的两个Step6、选用OAO分类器对选取预测权重最大的两个类进行预测;Step7、输出测试结果;注:为了统一,在训练OAO分类器是,把类别序列在前的类为正样本,输出+1,类别序列号在后面的为负样本,输出为-1。

测试强分类器的识别率为:0.93左右。

三、小结其实这个主要的思想就是用差异的样本和差异的分类器,组合较好的分类器器,提升样本的准确性和鲁邦性。

在对多类问题识别中。

个人觉得本算法还是有一定的缺陷,如果从OAA分类器预测值中选取的最大的两个值,不包含在我们正确的样本类别中,那么我们最后的OAO决策就没有意义。

因此对这个OAA预测值的组合也是一个比较关键的技术,也请大家有好的组合决策方法进行交流。

我对Adaboost算法理解的比较肤浅,还请大家指点。

如有需要请加QQ272122352,验证多类分类问题谢谢合作,非诚勿扰!附件1、OAO/OAA分类器训练clearclctic,%加载数据load Sheet1 Sheet1%删除无效数据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;for Flag = 0 : N%输入变量归一化处理[inputn,inputps] = mapminmax(Input);input_train = [];input_test = [];output_train = [];output_test = [];%生成测试集和训练集%训练样本和测试样本比例P = 0.8;for NN = 0 : NIndex = find(Output == NN);Long = length(Index);% 80%的训练、20%测试input_train = [input_train inputn(:,Index(1):Index(1) + floor(Long * P))];input_test = [input_test inputn(:,Index(1) + floor(Long *P) + 1 : Index(end))];output_train = [output_train Output(:,Index(1):Index(1) + floor(Long * P))];output_test = [output_test Output(:,Index(1) + floor(Long * P) + 1 : Index(end))];end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%Long1 = length(output_train);Long2 = length(output_test);for x = 1 : Long1if(output_train(x) == Flag)output_train(x) = 1;elseoutput_train(x) = -1;endendfor y = 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);for KK = 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;%统计错误样本数for j=1:Sizenif aa(j)~=output_train(j);error(KK)=error(KK)+D(KK,j);endendif error(KK) == 0Flag_error = KK;break;end%弱分类器i权重at(KK)=0.5*log((1-error(KK))/error(KK));%更新D值for j=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);endif Flag_error ~= -1NetName_OAA_C(Flag + 1,Flag_error : 10 ) = 0;%如果第一次就为零、那么该分类器就是强分类器if Flag_error == 1NetName_OAA_C(Flag + 1,1) = 1;NetName_OAA{Flag + 1,1} = net;endendend%保存分类器save NetName_OAA NetName_OAAsave NetName_OAA_C NetName_OAA_C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%生产一对一的分类器%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%tic,%一共有N*(N-1)/2个分类器NetName_OAO = {};%训练样本和测试样本比例P = 0.8;input_train = [];input_test = [];output_train = [];output_test = [];for NN = 0 : NIndex = find(Output == NN);Long = length(Index);% 80%的训练、20%测试input_train = [input_train inputn(:,Index(1):Index(1) + floor(Long * P))];input_test = [input_test inputn(:,Index(1) + floor(Long *P) + 1 : Index(end))];output_train = [output_train Output(:,Index(1):Index(1) + floor(Long * P))];output_test = [output_test Output(:,Index(1) + floor(Long * P) + 1 : Index(end))];endfor MM = 0 : Nfor NN = 0 : Nif(MM < NN)%选取样本%样本输入%样本输出%为了保存一致性,两类分类器的组合,类别序号在前的为+1,类别序号在后的为-1%如{3,4} ->{+1,-1};{MM,NN} ={+1,-1};% Input_OAO =Long1 = length(output_train);XX = 1;input_train_OAO = [];output_train_OAO = [];for x = 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;endendendtocsave NetName_OAO NetName_OAO附件2:测试clearclc%加载分类器load NetName_OAAload NetName_OAOload NetName_OAA_C%加载测试数据load Sheet1%删除无效数据while(1)if(Sheet1(end,1) == 0)Sheet1(end,:) = [];elsebreak;endend%分解输入输出Input = Sheet1(:,2:end)';Output = Sheet1(:,1)';%生产测试集、[inputn,inputps] = mapminmax(Input);input_train = [];input_test = [];output_train = [];output_test = [];N = max(max(Output));K = 10;P = 0.8;for NN = 0 : NIndex = find(Output == NN);Long = length(Index);% 80%的训练、20%测试input_train = [input_train inputn(:,Index(1):Index(1) + floor(Long * P))];input_test = [input_test inputn(:,Index(1) + floor(Long *P) + 1 : Index(end))];output_train = [output_train Output(:,Index(1):Index(1) + floor(Long * P))];output_test = [output_test Output(:,Index(1) + floor(Long * P) + 1 : Index(end))]; endtic,%测试%% 第一级分类long = length(input_test);Temp_Out_OAA = 0;for X = 1 : long% N 类K 个OAA 分类器决策test_simul(1:N+1) = 0;for NN = 1 : N + 1Temp_test_simul = 0;for KK = 1 : Knet = NetName_OAA{NN,KK};coef = NetName_OAA_C(NN,KK);if coef == 0% Flag_0 = KK;breakendTemp_test_simul = Temp_test_simul + coef * sim(net,input_test(:,X));endtest_simul(NN) = Temp_test_simul;endTemp_Out_OAA(X,1 : N + 1) = test_simul;endtoc%%第二级分类Ouput_Class = [];for X = 1 : longTemp_OAO = Temp_Out_OAA(X,:);[p1,p2] = sort(Temp_OAO,2);Max1 = p1(end);Max2 = p1(end - 1);Class_M1 = p2(end);Class_M2 = p2(end - 1);%加载单OAO分类器Change_Flag = 0;if Class_M1 < Class_M2M1 = Class_M1;M2 = Class_M2;Change_Flag = 0;elseM1 = Class_M2;M2 = Class_M1;Change_Flag = 1;endnet = NetName_OAO{M1,M2};%预测输出out_oao = sim(net,input_test(:,X));%类别判断if out_oao > 0if Change_Flag == 0Output_Class(X) = Class_M1 - 1;elseOutput_Class(X) = Class_M2 - 1;endelseif Change_Flag == 0Output_Class(X) = Class_M2 - 1;elseOutput_Class(X) = Class_M1 - 1;endendend%% 统计分类效果Error_Num = 0;for X = 1 : longif Output_Class(X) ~= output_test(X)Error_Num = Error_Num + 1;endenddisp('强分类器识别率');Error_Num/X2104年9月。

相关文档
最新文档