clc
clear all
%% 加载数据
load matlab3.mat
AllSamIn = data_train';
AllSamOut =lab_train';
AllTestIn=data_test';
AllTestOut=lab_test';
%% 训练样本归一化
global minAllSamOut;
global maxAllSamOut;
[AllSamInn,minAllSamIn,maxAllSamIn,AllSamOutn,minAllSamOut,maxAllSamOut] = premnmx(AllSamIn,AllSamOut);
TrainSamIn=AllSamInn;
TrainSamOut=AllSamOutn;
global Ptrain;
Ptrain = TrainSamIn;
global Ttrain;
Ttrain = TrainSamOut;
%% 测试样本归一化
global minAllTestOut;
global maxAllTestOut;
[AllTestInn,minAllTestIn,maxAllTestIn,AllTestOutn,minAllTestOut,maxAllTestOut] = premnmx(AllTestIn,AllTestOut);
TestIn=AllTestInn;
TestOut=AllTestOutn;
global Ptest;
Ptest = TestIn;
global Ttest;
Ttest = TestOut;
%% 加载网络的初始变量
global indim;
indim=6;
global hiddennum;
hiddennum=8;
global outdim;
outdim=1;
%% 加载PSO模型的相关参数
vmax=1;
minerr=0.001;
wmax=0.80;
wmin=0.40;
global itmax;
itmax=100;
c1=2.8;
c2=1.3;
for iter=1:itmax
W(iter)=wmax-((wmax-wmin)/itmax)*iter;
end
a=-1;
b=1;
m=-1;
n=1;
global N;
N=100;
global D;
D=(indim+1)*hiddennum+(hiddennum+1)*outdim;
rand('state',sum(100*clock));
X=a+(b-a)*rand(N,D,1);
V=m+(n-m)*rand(N,D,1);
global fvrec;
MinFit=[];
BestFit=[];
%% PSO优化ELM模型 过程 1
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain,minAllSamOut,maxAllSamOut);
fvrec(:,1,1)=fitness(:,1,1);
[C,I]=min(fitness(:,1,1));
MinFit=[MinFit C];
BestFit=[BestFit C];
L(:,1,1)=fitness(:,1,1);
B(1,1,1)=C;
gbest(1,:,1)=X(I,:,1);
for p=1:N
G(p,:,1)=gbest(1,:,1);
end
for i=1:N;
pbest(i,:,1)=X(i,:,1);
end
V(:,:,2)=W(1)*V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1));
for ni=1:N
for di=1:D
if V(ni,di,2) > vmax
V(ni,di,2) = vmax;
elseif V(ni,di,2) < -vmax
V(ni,di,2) = -vmax;
else
V(ni,di,2) = V(ni,di,2);
end
end
end
X(:,:,2)=X(:,:,1)+V(:,:,2);
for ni=1:N
for di=1:D
if X(ni,di,2) > 1
X(ni,di,2) = 1;
elseif V(ni,di,2) < -1
X(ni,di,2) = -1;
else
X(ni,di,2) = X(ni,di,2);
end
end
end
%% PSO优化ELM模型 过程 2
for j=2:itmax
disp('Iteration and Current Best Fitness')
disp(j-1)
disp(B(1,1,j-1))
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain,minAllSamOut,maxAllSamOut);
fvrec(:,1,j)=fitness(:,1,j);
[C,I]=min(fitness(:,1,j));
MinFit=[MinFit C];
BestFit=[BestFit min(MinFit)];
L(:,1,j)=fitness(:,1,j);
B(1,1,j)=C;
gbest(1,:,j)=X(I,:,j);
[C,I]=min(B(1,1,:));
if B(1,1,j)<=C
gbest(1,:,j)=gbest(1,:,j);
else
gbest(1,:,j)=gbest(1,:,I);
end
if C<=minerr, break, end
if j>=itmax, break, end
for p=1:N
G(p,:,j)=gbest(1,:,j);
end
for i=1:N;
[C,I]=min(L(i,1,:));
if L(i,1,j)<=C
pbest(i,:,j)=X(i,:,j);
else
pbest(i,:,j)=X(i,:,I);
end
end
V(:,:,j+1)=W(j)*V(:,:,j)+c1*rand*(pbest(:,:,j)-X(:,:,j))+c2*rand*(G(:,:,j)-X(:,:,j));
for ni=1:N
for di=1:D
if V(ni,di,j+1)>vmax
V(ni,di,j+1)=vmax;
elseif V(ni,di,j+1)<-vmax
V(ni,di,j+1)=-vmax;
else
V(ni,di,j+1)=V(ni,di,j+1);
end
end
end
X(:,:,j+1)=X(:,:,j)+V(:,:,j+1);
for ni=1:N
for di=1:D
if X(ni,di,j+1) > 1
X(ni,di,j+1) = 1;
elseif V(ni,di,j+1) < -1
X(ni,di,j+1) = -1;
else
X(ni,di,j+1) = X(ni,di,j+1);
end
end
end
end
disp('Iteration and Current Best Fitness')
disp(j)
disp(B(1,1,j))
disp('Global Best Fitness and Occurred Iteration')
[C,I] = min(B(1,1,:))
for t=1:hiddennum
x2iw(t,:)=gbest(1,((t-1)*indim+1):t*indim,j);
end
for r=1:outdim
x2lw(r,:)=gbest(1,(indim*hiddennum+1):(indim*hiddennum+hiddennum),j);
end
x2b=gbest(1,((indim+1)*hiddennum+1):D,j);
x2b1=x2b(1:hiddennum).';
x2b2=x2b(hiddennum+1:hiddennum+outdim).';
IWbest1=x2iw;
IWbest2=x2lw;
IBbest1=x2b1;
IBbest2=x2b2;
%% Adaboost
%训练样本
%input_train=Ptrain;
%output_train=Ttrain;
%测试样本
%input_test=Ptest;
%output_test=Ttest;
%样本权重
[mm,nn]=size(Ptrain);
DD(1,:)=ones(1,nn)/nn;
%训练样本归一化
%[inputn,inputps]=mapminmax(input_train);
%[outputn,outputps]=mapminmax(output_train);
K=10;
for i=1:K
%弱预测器训练
%net=newff(inputn,outputn,5);
%net.trainParam.epochs=20;
%net.trainParam.lr=0.1;
%net=train(net,inputn,outputn);
%弱预测器预测
%an1=sim(net,inputn);
%BPoutput=mapminmax('reverse',an1,outputps);
T_ELM1 = ELMfun2(IWbest1,IBbest1,Ptrain,Ttrain,hiddennum,IWbest2,IBbest2);
ELMout1 = postmnmx(T_ELM1,minAllSamOut,maxAllSamOut);
%ELMout1 = postmnmx(T_ELM1,minAllTestOut,maxAllTestOut);
%预测误差
erroryc(i,:)=AllSamOut-ELMout1 ;
%测试数据预测
T_sim2= ELMfun2(IWbest1,IBbest1,Ptest,Ttest,hiddennum,IWbest2,IBbest2);
test_simu(i,:) = postmnmx(T_sim2,minAllTestOut,maxAllTestOut);
%test_simu(i,:)=mapminmax('reverse',an2,outputps);
%调整D值
Error(i)=0;
for j=1:nn
if abs(erroryc(i,j))>0.2 %较大误差
Error(i)=Error(i)+DD(i,j);
DD(i+1,j)=DD(i,j)*1.1;
else
DD(i+1,j)=DD(i,j);
end
end
%计算弱预测器权重
at(i)=0.5/exp(abs(Error(i)));
%D值归一化
DD(i+1,:)=DD(i+1,:)/sum(DD(i+1,:));
end
%% 强预测器预测
at=at/sum(at);
%% 结果统计
%强分离器效果
output=at*test_simu;
T_sim_test = ELMfun2(IWbest1,IBbest1,Ptest,Ttest,hiddennum,IWbest2,IBbest2);
testsamout = postmnmx(T_sim_test,minAllTestOut,maxAllTestOut);
realtesterr=mse(testsamout-AllTestOut);
err1=norm(testsamout-AllTestOut);
disp(['优化模型测试样本的仿真误差:',num2str(err1)])
N = length(Ttest);
R1 = (N*sum(T_sim_test.*Ttest)-sum(T_sim_test)*sum(Ttest))^2/((N*sum((T_sim_test).^2)-(sum(T_sim_test))^2)*(N*sum((Ttest).^2)-(sum(Ttest))^2));
%% 不使用PSO优化ELM算法
[IW,B,LW,TF,TYPE] = elmtrain2(Ptrain,Ttrain,5,'sig',0);
T_sim_test1 = elmpredict(Ptest,IW,B,LW,TF,TYPE);
testsamout2 = postmnmx(T_sim_test1,minAllTestOut,maxAllTestOut);
realtesterr2=mse(testsamout2-AllTestOut);
err2=norm(testsamout2-AllTestOut);
R2 = (N*sum(T_sim_test1.*Ttest)-sum(T_sim_test1)*sum(Ttest))^2/((N*sum((T_sim_test1).^2)-(sum(T_sim_test1))^2)*(N*sum((Ttest).^2)-(sum(Ttest))^2));
disp(['原始模型测试样本的仿真误差:',num2str(err2)])
%% 输出参数图
% PSO 优化迭代图
figure(1);
P0 = plot(1:itmax,BestFit);
grid on
xlabel('PSO items');
ylabel('MSE rate');
string = {'PSO-ELM模型100次迭代误差变化';['决定系数:R^2=' num2str(R1) ' ' ];['模型仿真均方误差:mse=' num2str(realtesterr) ' ']};
title(string)
bestErr=min(BestFit);
fprintf(['PSO-ELM模型:\n决定系数R^2=',num2str(R1),'\n模型仿真均方误差:mse=',num2str(realtesterr),'\n'])
set(P0,'LineWidth',1.5);
% PSO与ELM结果比较图
figure(2)
P1=plot(1:76,AllTestOut,'r-square',1:76,testsamout,'b-o',1:76,testsamout2,'g-diamond',1:76,output,'m-.')
grid on
legend('真实值','PSO-ELM预测值','单纯ELM预测值','Adaboost+PSO-ELM预测值')
xlabel('样本编号')
ylabel('样本数据分类号')
string = {'测试集-预测分类-结果对比(真实值 & PSO-ELM & ELM)';['ELM:(mse = ' num2str(err2) ' R^2 = ' num2str(R2) ')'];['PSO-ELM:(mse = ' num2str(err1) ' R^2 = ' num2str(R1) ')']};
title(string)
set(P1,'LineWidth',1.0);