%% I. 清除环境变量
clear all
clc
%% II. 训练集/测试集产生
%%
% 1. 导入数据
load test_data.mat
%% III. 导入数据
%%
% 2. 训练集和测试集
% 训练集——125个样本
P_train = P';
T_train = T';
% 测试集——25个样本
P_test = Pt';
T_test = Tt';
N = size(P_test,2);
%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);
%% II. 声明全局变量
global p % 训练集输入数据
global t % 训练集输出数据
global R % 输入神经元个数
global S2 % 输出神经元个数
global S1 % 隐层神经元个数
global S % 编码长度
S1 = 8;
% 训练数据
p = p_train;
t = t_train;
%% IV. BP神经网络
%%
% 1. 网络创建
net = newff(minmax(p),[S1,1],{'tansig','purelin'},'trainlm');
%%
% 2. 设置训练参数
net.trainParam.show = 10;
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
%%
% 3. 网络训练
[net,tr] = train(net,p,t);
%%
% 4. 仿真测试
t_sim = sim(net,p_test); % BP神经网络的仿真结果
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
%%
% 3. 结果对比
result = [T_test' T_sim' error']
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('样本数')
ylabel('凸模位移')
string = {'测试集凸模位移预测结果对比';['R^2=' num2str(R2)]};
title(string)
%% V. GA-BP神经网络
R = size(p,1);
S2 = size(t,1);
S = R*S1 + S1*S2 + S1 + S2;
aa = ones(S,1)*[-1,1];
%% VI. 遗传算法优化
%%
% 1. 初始化种群
popu = 60; % 种群规模
initPpp = initializega(popu,aa,'gabpEval',[],[1e-6 1]); % 初始化种群
%%
% 2. 迭代优化
gen = 100; % 遗传代数
% 调用GAOT工具箱,其中目标函数定义为gabpEval
[x,endPop,bPop,trace] = ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
'normGeomSelect',[0.08],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%%
% 3. 绘均方误差变化曲线
figure(1)
plot(trace(:,1),1./trace(:,3),'r-');
hold on
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('Generation');
ylabel('Sum-Squared Error');
%%
% 4. 绘制适应度函数变化
figure(2)
plot(trace(:,1),trace(:,3),'r-');
hold on
plot(trace(:,1),trace(:,2),'b-');
xlabel('Generation');
ylabel('Fittness');
%% VII. 解码最优解并赋值
%%
% 1. 解码最优解
[W1,B1,W2,B2,val] = gadecod(x);
%%
% 2. 赋值给神经网络
net.IW{1,1} = W1;
net.LW{2,1} = W2;
net.b{1} = B1;
net.b{2} = B2;
%% VIII. 利用新的权值和阈值进行训练
net = train(net,p,t);
%% IX. 仿真测试
t_ga = sim(net,p_test) %遗传优化后的仿真结果
% 5. 数据反归一化
T_ga = mapminmax('reverse',t_ga,ps_output);
%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_ga - T_test)./T_test;
%%
% 2. 决定系数R^2
R2 = (N * sum(T_ga .* T_test) - sum(T_ga) * sum(T_test))^2 / ((N * sum((T_ga).^2) - (sum(T_ga))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
%%
% 3. 结果对比
result = [T_test' T_ga' error']
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_ga,'r-o')
legend('真实值','预测值')
xlabel('样本数')
ylabel('凸模位移')
string = {'测试集凸模位移预测结果对比';['R^2=' num2str(R2)]};
title(string)
%% 保存训练好的神经网络
save('GA-BP','net');
评论6