%% %%%%%%%%%%%%基于DE优化神经网络%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%需求:优化参数、网络结构
% 1. 优化参数权值、阈值
% 2. 优化隐含层数
%% 进化算法优化神经网络,其中最主要面临的问题在于误差函数的选取作为适应度函数的问题
clc
clear
close all
%% %%%%%%%%%%%%%%%%%%%%%%%确定网络各层神经元个数%%%%%%%%%%%%%%%%%%%%%%%%%%%
%所选的数据应该进行特征筛选,选择最有效的数据进行处理
% load('UCI测试数据集/iris.mat')
% data1=iris(:,1:end-1);
% load ('UCI测试数据集/Wine.mat')
% data1=Wine(:,2:end-1);
% load('UCI测试数据集/Balancescale.mat')
% data1=Balancescale(:,2:end);
% load('UCI测试数据集/breast.mat')
% data1=breast(:,1:end-1);
% load('UCI测试数据集/diabetes.mat')
% data1=diabetes(:,1:end-1);
% load('UCI测试数据集/haberman.mat')
% data1=haberman(:,1:end-1);
% load('UCI测试数据集/heart.mat')
% data1=heart(:,1:end-1);
% load('UCI测试数据集/ionosphere.mat')
% data1=ionosphere(:,1:end-1);
load('UCI测试数据集/Seeds.mat')
data1=Seeds(:,2:end);
% load('UCI测试数据集/zoo.mat')
% data1=zoo(:,1:end-1);
[row,col]=size(data1);
global insize hidesize outsize
insize = col; %输入层神经元数目--------根据数据集所决定的
hidesize = 4; %隐含层神经元数目--------由自己设定
outsize = 1; %输出层神经元数目--------输入神经元与输出神经元的个数相同
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%导入特征数据数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
input=data1';
testdata=input(:,120:140);
input_traindata=input(:,1:row)';
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%导入标签%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% output_train=iris(1:row,end)';
% output_test=iris(40:70,end)';
% output_train=Wine(1:row,1)';
% output_test=Wine(120:150,1)';
% output_train=Balancescale(1:row,1)';
% output_test=Balancescale(120:140,1)';
% output_train=breast(1:row,end)';
% output_test=breast(120:140,end)';
% output_train=diabetes(1:row,end)';
% output_test=diabetes(300:320,end)';
% output_train=haberman(1:row,end)';
% output_test=haberman(200:220,end)';
% output_train=heart(1:row,end)';
% output_test=heart(120:140,end)';
% output_train=ionosphere(1:row,end)';
% output_test=ionosphere(120:140,end)';
output_train=Seeds(1:row,1)';
output_test=Seeds(120:140,1)';
% output_train=zoo(1:row,end)';
% output_test=zoo(80:100,end)';
[output_testLable,outputps]=mapminmax(output_train); %训练样本输出值归一化到[-1,1]之间
%% %%%%%%%%使用HSDE进行优化参数----训练模型%%%%%%%%%%%%%%%%%%%
output_traindata=output_testLable'; %归一化后的结果
popsize=40; %种群大小
invidualsize=hidesize*(insize +outsize+1)+outsize;
iter=1000; %迭代次数
[best,optvalue]=DE(popsize,invidualsize,iter,input_traindata,output_traindata);
loglog(optvalue,'m-','linewidth',1.5);
xlabel('进化代数');ylabel('样本总准则函数值')
%% %%%%%%%%%%%%设计将优化出来的值进行转化为权值和阈值,存档%%%%%%%%%%%%%%%%%%%%%%
c=best(1:hidesize*(insize +outsize));
p=zeros(hidesize,insize +outsize);
pp=zeros(outsize,insize +outsize);
for i=1:size(c,2)/(insize+1)
for j=1:(insize+1)
p(i,j)=c(1);
c(1)=[];
end
end
W1=p(:,1:insize);
B1=p(:,(insize+1));
d=best(hidesize*(insize +outsize)+1:end);
for i=1:size(d,2)/(hidesize+1)
for j=1:hidesize+1
pp(i,j)=d(1);
d(1)=[];
end
end
W2=pp(:,1:hidesize);
B2=pp(:,hidesize+1);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%测试模型%%%%%%%%%%%%%%%%%%%%%%%%%
accuracy_numbers=0;
tempyout = zeros(outsize,size(testdata,2));
for i = 1:size(testdata,2)
testdata_x = testdata(:,i);
tesetdata_hidein = W1*testdata_x+B1;%隐含层输入值
testdata_hideout = zeros(hidesize,1);%隐含层输出值
for j = 1:hidesize
testdata_hideout(j) = SigmoidFun(tesetdata_hidein(j));
end
testdata_yin= W2*testdata_hideout+B2;%输出层输入值
testdata_yout = zeros(outsize,1);
for j = 1:outsize
testdata_yout(j) = SigmoidFun( testdata_yin(j));
end
tempyout(:,i) =testdata_yout; %最终测试集的输出值-----这里需要将其与测试集的类别进行对比
% if testdata_yout>0 && testdata_yout<=1.5
% result_out(i)=1;
% elseif testdata_yout>1.5 && testdata_yout<=2.5
% if result_out(i)==testdata(3,i)
% accuracy_numbers= accuracy_numbers+1;
% end
% hold on;
% else
% scatter(testdata_x(1),testdata_x(2),'g') %给分类做一个边缘分割线---怎样处理边缘框线
% result_out(i)=-1;
% if result_out(i)==testdata(3,i)
% accuracy_numbers= accuracy_numbers+1;
% end
% hold on;
% title('BP神经网络测试模型分类效果图');
% end
end
test_simu=mapminmax('reverse', tempyout,outputps); %把仿真得到的数据还原为原始的数量级
error=abs(test_simu-output_test); %预测值和真实值的误差
%% %%%%%%%%%%判断函数的预测精度%%%%%%%%%%%%%%%%%%%%%
successful_numbers=0;
unsuccessful_numbers=0;
successful_accuracy=abs(output_test-test_simu);
for i=1:size(successful_accuracy,2)
if successful_accuracy(:,i)/output_test(:,i)<0.05
successful_numbers= successful_numbers+1;
else
unsuccessful_numbers= unsuccessful_numbers+1;
end
end
prec_accuracy= successful_numbers/size(output_test,2);
disp(['预测精度为:',num2str( prec_accuracy)]);
%% 第十步 真实值与预测值误差比较
figure(2)
plot(output_test(1,:),'bo-')
hold on
plot(test_simu(1,:),'r*-')
hold on
plot(error(1,:),'square','MarkerFaceColor','b')
legend('真实值','预测值','误差');
xlabel('测试集个数');
ylabel('输出值');