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