• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: Matlab
  • 标签: bp  神经网络  

资源简介

多层前馈神经网络bp(back propagation)代码附带数据集,matlab版本

资源截图

代码片段和文件信息

%基于梯度下降法的三层sigmoid单元的前向网络的BP算法
%Train为输入样本,行表示特征,列表示样本,Except为目标向量
%第一层有4个神经元
%隐含层层有3个神经元
%输出层有3个神经元
clear all;
%导入数据
data = load(‘iris.txt‘);
data(:5 ) = [];%现在的鸢尾花数据集第五列不需要,所以在这里删除它
%利用每一类的前40个数据作为训练数据
Train = [data(1:40:);data(51:90:);data(101:140:)]‘;
%定义期望输出
class1 = repmat([0.950.050.05]401);
class2 = repmat([0.050.950.05]401);
class3 = repmat([0.050.050.95]401);
Expect = [class1;class2;class3]‘;

[it] = size(Train);%i表示输入层神经元的个数
[kt] = size(Expect);%k表示输出层神经元的个数
j = 5;%表示第一层神经元的个数
b = 5;%表示第二层神经元的个数

%开始训练数据
alpha = 0.05;%学习速率 
goal = 0.02;%精度要求
err = 1;%误差的初始值
iter = 0;%用来记录迭代的次数

%初始化网络权值
W01 = -0.5 + 0.5 * rand(ji+1);%输入与第一层之间的网络权值
W12 = -0.5 + 0.5 * rand(bj+1);%第一层与的二层之间的网络权值
W23 = -0.5 + 0.5 * rand(kb+1);%第二层与第三层之间的网络权值

%初始化权重变化量矩阵
dW01 = zeros(size(W01));
dW12 = zeros(size(W12));
dW23 = zeros(size(W23));

%初始化误差矩阵
ErrArray = [];
while err > goal%检查退出循环条件
    iter = iter + 1;%迭代次数增加一
for m = 1:t
    Inet = W01 * [Train(:m);1];%前向计算过程
    O1 = 1 ./ (1 + exp(-Inet));%获得第一层的输出
    Nnet = W12 * [O1;1]; %获得第二层的输出
    O2 = 1 ./ (1 + exp(-Nnet));
    Lnet = W23 * [O2;1]; %获得输出层输出
    O3 = 1 ./ (1+exp(-Lnet));
    E(:m) = Expect(:m) - O3;%计算误差
   %误差反向传播
   deltak=O3.*(1-O3).*E(:m);%对于输出单元
   dW23=alpha*deltak*[O2;1]‘; %输出层权重调整
   deltaj=O2.*(1-O2).*(W23(:1:b)‘*deltak);%对于第二层单元
   dW12=alpha*deltaj*[O1;1]‘; %第二层权值调整
   deltai=O1.*(1-O1).*(W12(:1:j)‘*deltaj); %对于第一层
   dW01=alpha*deltai*[Train(:m);1]‘; %第一层的权值调整 ‘
   %更新权值
   W01=W01+dW01;
   W12=W12+dW12;
   W23=W23+dW23;
end
total=0;%每一次迭代的误差
for i=1:t
    total=total+sum(E(:m).*E(:m));
end
err=0.5*total;
time(iter)=iter;
ErrArray=[ErrArrayerr];%记录每次的迭代误差
end

%显示误差的变化趋势
figure;
subplot(121);
plot(timeErrArray(1:iter));
title(‘网络误差‘);
xlabel(‘迭代的次数‘);
ylabel(‘误差‘);

%下面利用得到的模型对数据进行分类
Test = [data(41:50:);data(91:100:);data(141:150:)]‘;
%下面的三个矩阵用来记录那些数据分到那些类里面,order123分别统计第一 第二 第三类的数据
order1=[];
order2=[];
order3=[];
count=[0 0 0];%用来统计对应类的个数
for i=1:30%总共有30个数据,分别对每一个进行分类
I1=W01*[Test(:i);1];%得到第一层输入
O1=1./(1+exp(-I1));%得到第一层输出
I2=W12*[O1;1];%得到第二层的输入
O2=1./(1+exp(-I2));%得到第二层输出
I3=W23*[O2;1];%得到第三层的输入
O3=1./(1+exp(-I3));%得到第三层的输出
%[numk]=max(O3);%选取第三层的输出的最大值,哪个分量最大就归为哪一类
%count(k)=count(k)+1;
if O3(1)>=0.9 & O3(2)<=0.1 & O3(3)<=0.1
    order1=[order1i];
    count(1)=count(1)+1;
elseif O3(2)>=0.9 & O3(1)<=0.1 & O3(3)<=0.1
        order2=[order2i];
        count(2)=count(2)+1;
elseif O3(3)>=0.9 & O3(2)<=0.1 & O3(1)<=0.1
        order3=[order3i];
        count(3)=count(3)+1;
    end
end
fprintf(‘分类为第一个类的个数为:%d\n‘count(1));
disp(‘序号为:‘);
disp(order1);
fprintf(‘分类为第二个类的个数为:%d\n‘count(2));
disp(‘序号为:‘);
disp(order2);
fprintf(‘分类为第三个类的个数为:%d\n‘count(3));
disp(‘序号为:‘);
disp(order3);
fprintf(‘本次总共迭代了 %d 次\n‘iter);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3468  2017-12-24 20:31  bp代码\BPNet.m
     文件        2848  2017-12-17 19:18  bp代码\Iris.txt
     目录           0  2018-03-07 20:47  bp代码\

评论

共有 条评论