Matlab学习笔记 3 BP神经网络及求逼近函数

Matlab学习笔记之BP神经网络求逼近函数及示例------------锋锋的快乐小窝

  • BP:误差反向传播算法(Error Back Propagtion)
  • BP 神经网络一般是多层的,与之相关的另一个概念是多层感知器 (Multi-LayerPerceptron,MLP)
  • 多层感知器除了输入层和输出层以外,还具有若干个隐含层
  • 多层感知器强调神经网络在结构上由多层组成,BP 神经网络则强调网络采用误差反向传播的学习算法
  • 大部分情况下多层感知器采用误差反向传播的算法进行权值调整,因此两者一般指的是同一种网络
  • 如图 1 所示,BP神经网络的隐含层可以为一层或多层,一个包含两层隐含层的BP神经网络的拓扑结构
    在这里插入图片描述
图1 BP神经网络的结构
  • BP神经网络有以下特点:
    • (1) 网络由多层构成,层与层之间全连接,同一层之间的神经元无连接。多层的网络设计,使 BP 网络能够从输入中挖掘更多的信息,完成更复杂的任务。
    • (2) BP 网络的传递函数必须可微。
      感知器的传递函数 —— 一二值函数在这里没有用武之地
      • BP 网络一般使用Sigmoid 函数或线性函数作为传递函数。根据输出值是否包含负值,Sigmoid 函数又可分为 Log-Sigmoid 函数和 Tan-Sigmoid 函数
      • 一个简单的Log-Sigmoid函数可由下式确定: f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1
      • 其中 x x x 的范围包含整个实数域,函数值在 0~1 之间,具体应用时可以增加参数,以控制曲线的位置和形状
      • Log-Sigmoid函数和Tan-Sigmoid函数的曲线区别如图 2所示
        在这里插入图片描述
      • Sigmoid 函数是光滑的、可微的,在分类时比线性函数跟准确,容错也较强
      • 它将输入从负无穷到正无穷的范围映射到(-1,1)或(0,1)区间内,具有非线性的放大功能
      • 以正半轴为例,在靠近原点处,转输入信号较小,此时曲线上凸,输出值大于输入值;随着信号增大,非线性放大的系数逐深斩减小
      • Sigmoid函数可微的特性使它可以利用梯度下降法
      • 在输出层,如果采用 Sigmoid 函数,将会把输出值限制在一个较小的范围,因此,BP神经网络的典型设计是隐含层采用 Sigmoid函数作为传递函数,而输出层则采用线性函数作为传递函数
    • 采用误差反向传播算法(Back-Propag ation Algorithm)进行学习在 BP 网络中,数据从输入层经隐含层逐层向后传播,训练网线各权值时,则沿着减少误差的方向,从输出层经过中间各层逐层向前修正网络的连接权值
      • 随着学习的不断进行,最终的误差越来越小
clear
clc

p=[-0.96 0.577 -0.0729 0.377 0.641 0.66 0.461 0.1336 -0.201 -0.434 -0.5 -0.393 -0.1647 0.0988 0.3072 0.396 0.3449 0.1816 -0.0312 -0.2183 -0.3201]; %神经网络输入值
t=-1:0.1:1 ; %神经网络目标值

rng('default')
rng(0)
nTrainNum = 21; %21个训练样本
%nSampDim = 2; %数据维度
M = 1000; %迭代次数
ita = 0.01;%学习率
alpha = 0.3;

%%构建网络
NH = 21; % 隐含层层数
net.w1 = rand(2,NH);
net.w2 = rand(NH+1,1);


%%归一化数据
a = min(p);
b = max(p);
p_S = (p-a)/(b-a);


%%训练
net2_plot=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
for y=1:1:21
    for x=1:M % 迭代
        %ind = randi(21);% 从1-21中随机取一个数
        in = [p_S(:,y),1];% 输入层输出
        net1_in = in*net.w1;% 隐含层输入
        net1_out = tansig(net1_in);% 隐含层输出
        net2_int = [net1_out,1];% 隐含层输入
        net2_in = net2_int*net.w2;% 隐含层输入
        net2_out = tansig(net2_in);% 隐含层输出
        
        net2_plot(1,y)=net2_out;
        err = t(y)-net2_out;
        errt(x)=1/2*sqrt(sum(err.^2));
        
        
        if errt(x)<=ita
            fprintf('第%d次循环,第%d个数据,误差%f\n',x,y,errt(x));
            break;
        end
        
        % 调整权值
        for i=1:length(net1_out)+1
            for j=1:1
                % 局部梯度
                ipu1(j)=err(j);
                % 输出层与隐含层之间的调整量
                delta1(i,j) = ita.*ipu1(j).*net2_int(i);
            end
        end
        
        for m=1:2
            for i=1:length(net1_out)
                % 局部梯度
                ipu2(i)=net1_out(i).*(1-net1_out(i)).*sum(ipu1.*net.w2);
                % 输出层与隐含层之间的调整量
                delta2(m,i) = ita.*in(m).*ipu2(i);
            end
        end
        
        if x==1
            net.w1 = net.w1 + delta2;
            net.w2 = net.w2 + delta1;
        else
            net.w1 = net.w1 + delta2*(1-alpha) + alpha *delta2;
            net.w2 = net.w2 + delta1*(1-alpha) + alpha *delta1;
        end
        
    end
    plot(p,t,'*')
    title('使用BP神经网络函数逼近');
    xlabel('输入值');
    ylabel('目标值/输出值');
    hold on;
end
plot(p,net2_plot,'-')


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值