⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class_bp.m

📁 具有反馈的BP神经网络Matlab实现
💻 M
字号:
inputs=load('E:\Matlab programs\input.txt');
targets=load('E:\Matlab programs\output.txt');
[samples,hw1]=size(inputs);%samples=50,hw1=7,layers为隐层节点数
hw11=hw1+1;
layers=7;
err_goal=0.01;           %给定误差标准
max_epoch=4000;            %给定训练最大次数
yinzi=0.2;                 %给定训练因子
w1=(rand(hw11,layers)*2-1);%随机取权值w1
w2=(rand(layers,1)*2-1)/1000;%随机取权值w2
sse=zeros(1,max_epoch);
%if samples~=1
%-------------------输入规范化----------------
for i=1:hw1                         %找出最大最小值
    max(1,i)=inputs(1,i);
    min(1,i)=inputs(1,i);
end
for i=1:hw1
    for j=1:samples
        if max(1,i)<inputs(j,i) 
           max(1,i)=inputs(j,i);
        end
        if min(1,i)>inputs(j,i)
           min(1,i)=inputs(j,i);
        end
    end
end
for i=1:hw1                                 %inputs归一化(0,1)
    for j=1:samples
        inputs(j,i)=(inputs(j,i)-min(1,i))/(max(1,i)-min(1,i));
    end
end
mmax=targets(1,1);     %找出最大最小值
mmin=targets(1,1);  
for i=1:samples
    if mmax<targets(i,1) 
       mmax=targets(i,1);
    end
    if mmin>targets(i,1)
       mmin=targets(i,1);
    end
end
for i=1:samples                                 %targets归一化(0,1)
    targets(i,1)=(targets(i,1)-mmin)/(mmax-mmin);
end
%--------------求样本输出out------------
%count=count+1;
for count=1:max_epoch
    add=zeros(samples,1);           %增加一个输入节点(作为期望的偏差值)
    out=zeros(samples,1);
for k=1:samples
    if k==1
        add(1,1)=0;
    else
        add(k,1)=targets(k-1,1)-out(k-1,1);
    end
    hilayer=zeros(layers,1);      %隐层节点输出初始化 
    for i=1:layers
       for j=1:hw1                          %w1*inputs求和
           hilayer(i,1)=hilayer(i,1)+inputs(k,j)*w1(j,i);
       end          
       hilayer(i,1)=hilayer(i,1)+add(k,1)*w1(hw1+1,i);
       hilayer(i,1)=logsig(hilayer(i,1));  %对隐层节点进行s函数变换
    end 
    for i=1:layers
        out(k,1)=out(k,1)+hilayer(i,1)*w2(i,1);        %隐层节点*w2求和,得到输出out
    end
    out(k,1)=logsig(out(k,1));                 %对输出求s函数[shuchu,yinceng,count]=program(ceshi,w1,w2,layers,t)
    sse(1,count)=sse(1,count)+((targets(k,1)-out(k,1))^2)/2 ;      %计算均方差
   %----------求梯度-------------
    tidu1=zeros(layers,1);
   
    tidu2=out(k,1)*(1-out(k,1))*(targets(k,1)-out(k,1));
    for i=1:layers
        tidu1(i,1)=(1-hilayer(i,1))*hilayer(i,1)*tidu2*w2(i,1);
    end
    for i=1:layers
        w2(i,1)=w2(i,1)+yinzi*tidu2*hilayer(i,1); 
    end
    for i=1:hw1
        for j=1:layers
            w1(i,j)=w1(i,j)+yinzi*tidu1(j,1)*inputs(k,i);
        end
    end
    for j=1:layers
        w1(hw11,j)=w1(hw11,j)+yinzi*tidu1(j,1)*add(k,1)*1.2;
    end   
end
%----------------判断均方差是否满足要求-----------------------------
    if sse(1,count)<err_goal                    
       break;
    end 
end
k=1:count;
plot(k,sse(1,k))
mse=sse(1,count);
jishu=0;%错误数
for  k=1:samples                                                
   if (((out(k,1)>=0.6091)&(targets(k,1)>=0.6091))|((out(k,1)<=0.6091)&(targets(k,1)<=0.6091)))
      jishu=jishu+1;
   end
end
%预测
ti=load('E:\Matlab programs\testinput.txt');
to=load('E:\Matlab programs\testoutput.txt');
%to=to'
[outo,d,ave]=yuce(ti,to,w1,w2,7);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -