【预测模型】基于狮群算法优化核极限学习机Kelm实现数据分类matlab源码

146 阅读3分钟

1 简介

本发明公开了一种基于狮群算法优化极限学习机集成学习的方法及系统,将改进后的狮群算法应用于极限学习机的集成学习中,充分利用狮群算法精度高,收敛快以及极限学习训练速度快的特点,通过使用狮群算法追随当前搜索到的最优值来寻找全局最优解以减少迭代次数来优化极限学习机个体,并根据极限学习机相关理论制定了相应的选择机制,将输出权值的模小并且训练误差小的极限学习机选择出来以供集成网络,在可接受的训练时间内,网络稳定性和泛化能力得到了显著提升,是一种有实际应用价值的新方法.

2 部分代码

clc
clear all

DataSetName = 'magic04';                 %以matlab格式存储的数据集名称
TrainSamplesPartio = 0.5;                %每类训练样本所占比例  
C = 100;                                 %正则化因子 
DataSet = load(DataSetName, '-mat');    %加载文件到程序
DataSet = getfield(DataSet, DataSetName);%获取文件中数据
KindIdx = DataSet(:,1);                  %获取类别号,数据第1列为类别编号
KindCount = length(unique(KindIdx));     %总类别数
SortedDataSet = sortrows(DataSet, 1);    %按类标号排列数据,按类标号从小到大重排数据,方便后面随机抽取数据
clear DataSet

EachKindCount = zeros(1,KindCount);         %每类数据个数
for i=1:KindCount
   EachKindCount(i) = sum(sum( i == SortedDataSet(:,1)));  %第i类数据个数
end

KindData = cell(1,KindCount);                               %每类的数据以cell数组数据存储
TempCount = 0;                                              %前i类数据总数目计数
for i=1:KindCount
   if i == 1
       TempCount = EachKindCount(1,i);
       KindData{1,i} = SortedDataSet(1:TempCount,:);
   else
       %因为数据为按类标有序排列,故可以由每类数据数目直接获取每类数据
       KindData{1,i} = SortedDataSet(TempCount+1:TempCount+EachKindCount(1,i),:);
       TempCount = TempCount + EachKindCount(1,i);
   end
end
clear SortedDataSet

%获取每类的训练数据和测试数据
TrainDataEachKind = cell(1, KindCount);
TestDataEachKind = cell(1, KindCount);
    
TrainSamCountEachKind = floor(TrainSamplesPartio*EachKindCount);    %每类训练样本数(每类数据总数*训练数据所占比例)
RndIdxEeahKind = cell(1,KindCount);
for i=1:KindCount
   %随机产生每类索引号,例如某类总共3个样本,则随机产生6种排列[1 2 3] [1 3 2] [2 1 3] 
   %[2 3 1] [3 1 2] [3 2 1]一种
   RndIdxEeahKind{1,i} = randperm(EachKindCount(i));               %随机产生每类索引号
end
for i=1:KindCount
   %RndIdx每次运行时是随机产生的,所以此处每次按顺序提取的结果也是随机的
   TrainDataEachKind{1,i} = KindData{1,i}(RndIdxEeahKind{i}(1:TrainSamCountEachKind(i)),:);  
   TestDataEachKind{1,i} = KindData{1,i}(RndIdxEeahKind{i}(TrainSamCountEachKind(i)+1:end),:);
end
TrainData = [];
TestData = [];
%将所有类别的训练数据和测试数据放一个矩阵里
TrainTemp = [];
TestTemp = []
for i=1:KindCount
   if i==1
       TempIdx1(1:TrainSamCountEachKind(i),1) = i;     %标示训练数据类标号
       TempIdx2(1:size(TestDataEachKind{i},1),1) = i;  %标示测试数据类标号
       TrainData = [TempIdx1 TrainDataEachKind{1,i}];  %第一列为类标号
       TestData = [TempIdx2 TestDataEachKind{1,i}];
       TempIdx1 = [];                                  %此处要清空类标号,否则可能产生错误类标号,因为每类数据个数可能不同
       TempIdx2 = [];
       TrainTemp = TrainData;
       TestTemp = TestData;
   else
       TempIdx1(1:TrainSamCountEachKind(i),1) = i;
       TempIdx2(1:size(TestDataEachKind{i},1),1) = i;
       TrainData = [TrainTemp;[TempIdx1 TrainDataEachKind{1,i}]];
       TestData = [TestTemp;[TempIdx2 TestDataEachKind{1,i}]];
       TrainTemp = TrainData;
       TestTemp = TestData;
       TempIdx1 = [];
       TempIdx2 = [];
   end
end
clear TrainTemp TestTemp TrainDataEachKind TestDataEachKind 

%统计结果
[TrainingTime, TestingTime, TrainingAccuracy, TestingAccuracy] = elm(TrainData, TestData, 1, KindCount, 'sig');
%格式化输出相关信息,可根据自己需要修改
fprintf('Run Information:\n')
fprintf('+-----------------------------------------------+\n')
fprintf('|KindIdx | EachKindCount | EachTrainKindCount |\n');
fprintf('+-----------------------------------------------+\n')
Msgemat='| %2d     |%9d     |%11d         |\n';
for i=1:KindCount
   fprintf(Msgemat, i, EachKindCount(i), TrainSamCountEachKind(i));
   fprintf('+-----------------------------------------------+\n')
end
fprintf('+------------------------------------------------------+\n')
fprintf('| TrainTime | TestTime | TrainAccuracy | TestAccuracy |\n')
MsgMat= '|   %0.2fs |   %0.2fs |   %0.2f       |     %0.2f   |\n';
fprintf('+------------------------------------------------------+\n')
fprintf(MsgMat, TrainingTime, TestingTime, TrainingAccuracy, TestingAccuracy);
fprintf('+------------------------------------------------------+\n')

3 仿真结果

4 参考文献

[1]刘伟等. "一种基于狮群算法优化极限学习机集成学习的方法及系统.", CN110147890A. 2019.

5 MATLAB代码与数据下载地址

见博客主页