粒子群优化算法PSO优化BPMN

load data input output

%划分数据集
random_num = rand(1,2000);
[value,index] = sort(random_num);
x_train = input(index(1:1800),:)';
y_train = output(index(1:1800));
x_test = input(index(1801:2000),:)';
y_test = output(index(1801:2000));

%设置BPNN节点数
inputnum = 2;
hiddennum = 5;
outputnum = 1;

%设置PSO相关参数
sizepop = 10;       %种群规模
k = 50;             %迭代次数
c1 = 2;c2 = 2;      %学习因子
w = 0.8;            %惯性因子

%数据归一化
[input_train,inputps] = mapminmax(x_train);
[output_train,outputps] = mapminmax(y_train);

%确定优化参数的数目
length = inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
param = rand(sizepop,length);
speed = rand(sizepop,length);

%建立BPNN
net = newff(input_train,output_train,hiddennum);

%初始化(个体最佳位置lbest | 全局最佳位置gbest | 个体适应度fitness | 群体最佳适应度fitnessbest)
for i=1:sizepop
    fitness(i,:) = func(param(1,:),inputnum,hiddennum,outputnum,net,input_train,output_train);
    lbest(i,:) = param(i,:);
end
[value,index] = min(fitness);   
gbest = param(index,:);     %群体极值位置(参数)
fitnessbest = value;        %群体极值适应度(最小MSE)

%参数寻优
for T=1:k
    for i=1:sizepop
        speed(i,:) = w*speed(i,:)+c1*rand*(lbest(i,:)-param(i,:))+c2*rand*(gbest-param(i,:));
        param(i,:) = param(i,:)+speed(i,:);
        
        fit = func(param(i,:),inputnum,hiddennum,outputnum,net,input_train,output_train);
        if fit<fitness(i,:)
            fitness(i,:) = fit;
            lbest(i,:) = param(i,:);
        end
        if fit<fitnessbest
            gbest = param(i,:);
            fitnessbest = fit;
        end
    end
    MSE(T,:) = fitnessbest;
end

%建立模型并预测(gbest为最佳参数)
w1 = gbest(1:inputnum*hiddennum);
b1 = gbest(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2 = gbest(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
b2 = gbest(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net.iw{1,1} = reshape(w1,hiddennum,inputnum);
net.lw{2,1} = reshape(w2,outputnum,hiddennum);
net.b{1} = reshape(b1,hiddennum,1);
net.b{2} = b2;

net.trainParam.epochs = 100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;

net = train(net,input_train,output_train);
input_test = mapminmax('apply',x_test,inputps);
predict_test = sim(net,input_test);
predict_test = mapminmax('reverse',predict_test,outputps);
error = predict_test - y_test;
rank = sum(error.^2/200,2);
disp('均方误差mse:');
disp(rank);

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------

 

function fit = func(param,inputnum,hiddennum,outputnum,net,input_train,output_train)
w1 = param(1:inputnum*hiddennum);
b1 = param(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2 = param(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
b2 = param(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net.iw{1,1} = reshape(w1,hiddennum,inputnum);
net.lw{2,1} = reshape(w2,outputnum,hiddennum);
net.b{1} = reshape(b1,hiddennum,1);
net.b{2} = b2;

net.trainParam.epochs = 100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;

net = train(net,input_train,output_train);
predict = sim(net,input_train);
[m,n] = size(output_train);
fit = sum((output_train-predict).^2)/n;
end

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章