clc
clear all
%一、初始化部分
%1.1 预处理样本数据
load 'm_data2.txt';
M=m_data2;
p1=M(1:30,1:5);
t1=M(1:30,6);
p=p1';t=t1';
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);
p_test=M(31:35,1:5);
t_test=M(31:35,6);
p_test=p_test';
t_test=t_test';
[p_testn,minp_test,maxp_test,t_testn,mint_test,maxt_test]=premnmx(p_test,t_test);
testIn=p_testn;
testOut=t_testn;
global Ptrain;
Ptrain=pn;
global Ttrain;
Ttrain=tn;
%1.2 设置神经网络参数
global indim; %输入层神经元个数
indim=5;
global hiddennum; %隐藏层神经元个数
hiddennum=20;
global outdim; %输出层神经元个数
outdim=1;
global Gpos;
%1.3 设置微粒群参数
vmax=0.5; % 速度上限
minerr=1e-7; % 目标误差
wmax=0.95;
wmin=0.25;
global itmax; % 最大迭代次数
itmax=200;
c1=1.5;
c2=1.5;
%权值随迭代次数线性递减以保证收敛
for iter=1:itmax
W(iter)=wmax-((wmax-wmin)/itmax)*iter;
end
a=-1;
b=1;
m=-1;
n=1;
global N; % 微粒个数
N=30;
global D; % 每个微粒的维数
D=(indim+1)*hiddennum+(hiddennum+1)*outdim; %所有权值和阈值
% 初始化微粒位置
rand('state',sum(100*clock)); %产生和时间相关的随机数
global X;
X=a+(b-a)*rand(N,D,1); %X的值在a 和b之间
%初始化微粒速度
V=m+(n-m)*rand(N,D,1); %V的值在m和n之间
%二、微粒群更新迭代部分
%global net;
net=newff(minmax(pn),[hiddennum,outdim],{'tansig','purelin'},'traingdx');
global gbest; %全局最优位置
global pbest; %局部最优位置
%2.1第一次迭代
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain); %计算适应值
[C,I]=min(fitness(:,1,1)); %第一代,返回微粒群中最小适应值给C,该微粒的序号给I
L(:,1,1)=fitness(:,1,1); %第一代,每个微粒的适应值
B(1,1,1)=C; %第一代,全局最优适应值(B存储当前代最优适应值)
bestminimum(1)=C; % bestminimum存储所有代中的全局最小适应值
gbest(1,:,1)=X(I,:,1); %第一代,全局最优的微粒位置
for p=1:N
G(p,:,1)=gbest(1,:,1); %G便于速度更新运算(函数格式统一)
end
Gpos=gbest(1,:,1);
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;
else if 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); %更新位置
end
%disp('执行到这里')
%2.2 第2次到最后一次迭代
for j=2:itmax
h=j;
disp('迭代次数,当前代全局最佳适应值,本代以前所有代中的全局最佳适应值')
disp(j-1)
disp(B(1,1,j-1)) %j-1代全局最优适应值
disp(bestminimum(j-1)) %j-1代以前所有代中的全局最优适应值
disp('******************************')
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain);
[C,I]=min(fitness(:,1,j)); %第j代的最优适应值和最优微粒序号
L(:,1,j)=fitness(:,1,j); %第j代每个微粒的适应值
B(1,1,j)=C; %第j代全局最优适应值
gbest(1,:,j)=X(I,:,j); %第j代全局最优微粒的位置
[GC,GI]=min(B(1,1,:)); %所有代的全局最优适应值赋给GC,代数赋给GI
bestminimum(j)=GC; %所有代的最优适应值赋给j代的bestminimum
% 判断是否符合条件
if GC<=minerr
Gpos=gbest(1,:,GI); %若满足均方误差条件,记录最优位置,停止迭代
break
end
if j>=itmax
break %超过最大迭代次数时,退出
end
%计算历史全局最优位置
if B(1,1,j)<GC
gbest(1,:,j)=gbest(1,:,j);
else
gbest(1,:,j)=gbest(1,:,GI);
end
for p=1:N
G(p,:,j)=gbest(1,:,j);
end
%计算各微粒历史最优位置
for i=1:N;
[C,I]=min(L(i,1,:)); %计算每个微粒的历史最优适应值,赋给C,代数赋给I
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;
else if 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);
% %2.3 将最优微粒(即最优权值和阈值)赋给神经网络
if j==itmax
Gpos=gbest(1,:,GI);
end
end
end
%三、神经网络训练部分
%****************************************************************************
%---------------------nn--part---------------------------------------
% simulation network
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).';
net.IW{1,1}=x2iw;
net.LW{2,1}=x2lw;
net.b{1}=x2b1;
net.b{2}=x2b2;
net.trainparam.show=500;
net.trainparam.epochs=15000;
net.trainparam.goal=0.001;
[net,tr]=train(net,pn,tn);
y1=sim(net,testIn);
testout=postmnmx(y1,mint,maxt)
Ttest=postmnmx(testOut,mint_test,maxt_test);
figure(1);
plot(Ttest,'g-+')
hold on
plot(testout,'r--*')
legend('实际输出','预测输出')
title('PSO_BP网络预测输出','fontsize',12)
ylabel('输出','fontsize',12)
xlabel('样本','fontsize',12)
%testout=reshape(testout,5,1);
error=abs(testout-Ttest);
figure(2)
plot(error,'-*')
title('PSO_BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
%echo off
% 适应函数fitness
function fitval = fitcal(pm,net,indim,hiddennum,outdim,D,Ptrain,Ttrain,minAllSamOut,maxAllSamOut)
[x,y,z]=size(pm);
for i=1:x
for j=1:hiddennum
x2iw(j,:)=pm(i,((j-1)*indim+1):j*indim,z);
end
for k=1:outdim
x2lw(k,:)=pm(i,(indim*hiddennum+1):(indim*hiddennum+hiddennum),z);
end
x2b(1,((indim+1)*hiddennum+1):D,j)=pm(1,((indim+1)*hiddennum+1):D,j);
x2b1=x2b(1:hiddennum).';
x2b2=x2b(hiddennum+1:hiddennum+outdim).';
net.IW{1,1}=x2iw;
net.LW{2,1}=x2lw;
net.b{1}=x2b1;
net.b{2}=x2b2;
error=sim(net,Ptrain)-Ttrain;
fitval(i,1,z)=mse(error);
end
有数据集吗?