EEMD-GA-BPNN

data = csvread('D:\demo\dataset\train_passenger_volume.csv');

%EEMD(集成经验模态分解):eemd(ts,高斯白噪声标准差[0.01-0.4],噪声次数[50|100])
imfs = eemd(data,0.01,50);      %第一列(原时间序列) | 其余列(分解的IMF)

%构造输入向量与输出向量
sample = size(imfs,1);
timespan = 3;                   %窗口宽度
imfindex = 1;                    %列数索引
for i = 1:(sample-timespan)
    x(i,:) = imfs(i:i+timespan-1,imfindex)';
end
y = imfs(timespan+1:end,imfindex);

%划分数据集
predictspan = 5;                %控制要预测的记录数
dividindex = size(x,1) - predictspan + 1;
x_train = x(1:dividindex-1,:);
y_train = y(1:dividindex-1,:);
x_test = x(dividindex:end,:);
y_test = y(dividindex:end,:);

%数据归一化
[train_input,inputps] = mapminmax(x_train');
[train_output,outputps] = mapminmax(y_train');

%节点设置
inputnum = size(x,2);
hiddennum = 5;
outputnum = 1;

%初始化
length = inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum; %优化参数个数
bounds = ones(length,1)*[-1,1];                                      
sizepop = 20;
param = rand(sizepop,length);

net = newff(train_input,train_output,hiddennum);
for i = 1:sizepop
    fit(i,:) = func(param(i,:),inputnum,hiddennum,outputnum,net,train_input,train_output);
end
initPop = [param,fit];

%GA寻优
bestparam = ga(bounds,'gaEval',[],initPop);
bestparam = bestparam(1:length);               %最后一个数值为适应度

%建立模型并预测
w1 = bestparam(1:inputnum*hiddennum);
b1 = bestparam(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2 = bestparam(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
b2 = bestparam(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,train_input,train_output);
input_test = mapminmax('apply',x_test',inputps);
predict_test = sim(net,input_test);
predict_test = mapminmax('reverse',predict_test,outputps);
RD = (predict_test-y_test')./y_test';
disp('相对偏差如下:')
disp(RD)
RMSE = sqrt(sum((predict_test-y_test').^2)/predictspan);
disp(['RMSE = ',num2str(RMSE)])

%结果可视化
figure(1)
plot(predict_test,'-b')
hold on
plot(y_test,'--r')
legend('预测输出','期望输出')

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

猜你喜欢

转载自blog.csdn.net/qinlan1994/article/details/82054972
GA