%% 此程序为基于遗传算法优化的DBN神经网络
% 清空环境变量
clear,close all
clc
%% 读取数据
num=xlsread('a.xlsx');
%节点个数
inputnum=8;
hiddennum=5;
outputnum=1;
%% 设置训练数据和预测数据
input=num(:,1:8);
output=num(:,end);
n = randperm(193);
input_train = input(1:120,:)';
output_train = output(1:120,:)';
input_test = input(121:193,:)';
output_test = output(121:193,:)';
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);%归一化
[outputn,outputps]=mapminmax(output_train,0,1);
inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化
outputn_test=mapminmax('apply',output_test,outputps);% 对样本数据进行归一化
inputn=inputn';
outputn=outputn';
inputn_test=inputn_test';
outputn_test=outputn_test';
bound=[[5 5 5 0.001 0.001 0.001]' [150 150 150 1 1 1 ]'];
[ f,TY0 ] = dbnfun0( inputn,outputn,inputn_test,outputn_test ,[100,150,100 0.01 0.01 0.01],bound);
%% 遗传算法求解最佳参数
maxgen=10; %进化代数,即迭代次数
sizepop=2; %种群规模
pcross=0.3; %交叉概率选择,0和1之间
pmutation=0.1; %变异概率选择,0和1之间
%节点总数:输入隐含层权值、隐含阈值、隐含输出层权值、输出阈值(4个基因组成一条染色体)
numsum=6;
lenchrom=ones(1,numsum);%个体长度,暂时先理解为染色体长度,是1行numsum列的矩阵
%
%------------------------------------------------------种群初始化--------------------------------------------------------
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体:10个个体的适应度值,10条染色体编码信息
avgfitness=[]; %每一代种群的平均适应度,一维
bestfitness=[]; %每一代种群的最佳适应度
bestchrom=[]; %适应度最好的染色体,储存基因信息
%初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=(Code(lenchrom,bound)); %编码(binary(二进制)和grey的编码结果为一个实数,float的编码结果为一个实数向量)
x=individuals.chrom(i,:);
%计算适应度
individuals.fitness(i)=dbnfun(inputn,outputn,inputn_test,outputn_test ,x,bound); %染色体的适应度
end
FitRecord=[];
%找最好的染色体
[bestfitness, bestindex]=max(individuals.fitness);%bestindex是最大值的索引(位置/某个个体),bestfitness的值为最大适应度值
bestchrom=individuals.chrom(bestindex,:); %最好的染色体,从10个个体中挑选到的
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度(所有个体适应度和 / 个体数)
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness]; %trace矩阵,1行2列,avgfitness和bestfitness仅仅是数值
%%迭代求解最佳初始阀值和权值
figure(1) %绘制迭代图
title(['最佳适应度进化曲线' ]);
xlabel('迭代次数');ylabel('最佳适应度');
hold on
% 进化开始
for i=1:maxgen
% 选择
individuals=Select(individuals,sizepop);
% avgfitness=sum(individuals.fitness)/sizepop;%种群的平均适应度值
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop);
% 变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:); %个体信息
individuals.fitness(j)=dbnfun(inputn,outputn,inputn_test,outputn_test ,x,bound); %计算每个个体的适应度值
end
%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=max(individuals.fitness);%最佳适应度值
[worestfitness,worestindex]=min(individuals.fitness);
% 最优个体更新
if bestfitness<newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;%取代掉最差的,相当于淘汰
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/sizepop;
plot(1:i,1./trace(1:i,2),'r*-')
hold on
pause(0.00001)
trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
FitRecord=[FitRecord;individuals.fitness];%记录每一代进化中种群所有个体的适应度值
end
%修饰图像
trace = 1./trace;
y_up=max(trace(:,2));
% `
%%
P = inputn;
T = outputn;
numcases=12;%每块数据集的样本个数
numdims=size(P,2);%单个样本的大小
numbatches=10;%将10组训练样本,分成10批,每一批200组
% 训练数据
for i=1:numbatches
train=P((i-1)*numcases+1:i*numcases,:);
batchdata(:,:,i)=train;
end%将分好的10组数据都放在batchdata中
%% 2.训练RBM
%% rbm参数
maxepoch=200;%训练rbm的次数
numhid=round(x(1)); numpen=round(x(2)); numpen2=round(x(3));%dbn隐含层的节点数
disp('构建一个3层的深度置信网络DBN用于特征提取');
%% 无监督预训练
fprintf(1,'Pretraining Layer 1 with RBM: %d-%d ',numdims,numhid);
restart=1;
rbm1;%使用cd-k训练rbm,注意此rbm的可视层不是二值的,而隐含层是二值的
vishid1=vishid;hidrecbiases=hidbiases;
fprintf(1,'\nPretraining Layer 2 with RBM: %d-%d ',numhid,numpen);
batchdata=batchposhidprobs;%将第一个RBM的隐含层的输出作为第二个RBM 的输入
numhid=numpen;%将numpen的值赋给numhid,作为第二个rbm隐含层的节点数
restart=1;
rbm1;
hidpen=vishid; penrecbiases=hidbiases; hidgenbiases=visbiases;
fprintf(1,'\nPretraining Layer 3 with RBM: %d-%d\n ',numpen,numpen2);%200-100
batchdata=batchposhidprobs;%显然,将第二哥RBM的输出作为第三个RBM的输入
numhid=numpen2;%第三个隐含层的节点数
restart=1;
rbm1;
hidpen2=vishid; penrecbiases2=hidbiases; hidgenbiases2=visbiases;
%%%% 将预训练好的RBM用于初始化DBN权重%%%%%%%%%
w1=[vishid1; hidrecbiases]; %12-100
w2=[hidpen; penrecbiases]; %100-50
w3=[hidpen2; penrecbiases2];%50-30
%% 有监督回归层训练
%===========================训练过程=====================================%
%==========DBN无监督用于提取特征,需要加上有监督的回归层==================%
%由于含有偏执,所以实际数据应该包含一列全为1的数,即w0x0+w1x1+..+wnxn 其中x0为1的向量 w0为偏置b
N1 = size(P,1);
digitdata = [P ones(N1,1)];
w1probs = 1./(1 + exp(-digitdata*w1));
w1probs = [w1probs ones(N1,1)];
w2probs = 1./(1 + exp(-w1probs*w2));
w2probs = [w2probs ones(N1,1)];
w3probs = 1./(1 + exp(-w2probs*w3));
H = w3probs';
nn=size(T,2);
T=T';
lamda=inf;%正则化系数
OutputWeight=pinv(H'+1/lamda) *T';%加入正则化系数lamda,lamda=inf就是没有正则化
Y=(H' * OutputWeight)';
%%%%%%%%%% 计算训练误差,不重要,看看图就行
% 反归一化
% T=(mapminmax('reverse',T,outputns));
% Y=round(mapminmax('reverse',Y,outputns));
% figure
% plot(T','-*')
% hold on
% plot(Y','o-')
% legend('期望输出','实际输出')
% firstline = '训练阶段';
% secondline = '实际输出与理想输出的结果对照';
% title({firstline;secondline},'Fontsize',12);
% xlabel('训练样本数')
%===========================测试过程=====================================%
%=======================================================================%
P_test=inputn_test;
N2 = size(P_test,1);
w1=[vishid1; hidrecbiases];
w2=[hidpen; penrecbiases];
w3=[hidpen2; penrecbiases2];
test = [P_test ones(N2,1)];
%激活函数是常用的sigmoid时,也可以换成其他函数,甚至每层的都可以不一样
w1probs = 1./(1 + exp(-test*w1));
w1probs = [w1probs ones(N2,1)];
w2probs = 1./(1 + exp(-w1probs*w2));
w2probs = [w2probs ones(N2,1)];
w3probs = 1./(1 + exp(-w2probs*w3));
H1 = w3probs';
TY=(H1' * OutputWeight)'; % TY: the actual output of the testing data
% 反归一化
% f = mse(TY-T_test');
TY=round(mapminmax('reverse',TY,outputps));
TY0=round(mapminmax('reverse',TY0,outputps));
TY(TY>1)=1;
TY(TY<0)=0;
TY0(TY0>1)=1;
TY0(TY0<0)=0;
%%%%%%%%%% 计算测试结果
error=TY-output_test;
error0=TY0-output_test;
figure
plot(output_test','r-*')
hold on
plot(TY0','bo-')
firstline = 'DBN深度信念网络测试';
secondline = '实际输出与理想输出的结果对照';
title({firstline;secondline},'Fontsize',12);
xlabel('样本')
ylabel('类别')
legend('期望输出','DBN预测输出')
figure
plot(output_test','k-*')
hold on
plot(TY','ro-')
firstline = '遗传算法改进DBN深度信念网络�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
2023ga-dbn.rar (18个子文件)
rbm1.m 5KB
xianyang.mat 6KB
Select.m 2KB
1.jpg 14KB
main.m 9KB
dbnfun.m 4KB
5.jpg 37KB
Code.m 689B
BP.m 3KB
Cross.m 2KB
test.m 742B
fun.m 1KB
dbnfun0.m 4KB
7.jpg 20KB
data.mat 45KB
Mutation.m 2KB
4.jpg 35KB
a.xlsx 21KB
共 18 条
- 1
资源评论
- TLwangshuai6102023-06-18资源有很好的参考价值,总算找到了自己需要的资源啦。
- 2301_773215032023-05-30资源内容详细全面,与描述一致,对我很有用,有一定的使用价值。
- 2301_763260322023-06-20资源很赞,希望多一些这类资源。
神经网络机器学习智能算法画图绘图
- 粉丝: 2375
- 资源: 569
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功