粒子羣優化算法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

 

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