使用BP网络逼近函数-matlab

一、大致介绍
BP算法的学习过程是由正向传播和反向传播组成的。在正向传播的过程中,输入的信息从输入层到隐含层处理 最后传向输出层,而且每一个神经元能影响到下一层神经元的状态。当在输出层得不到期望的输出时,则转向反向传播,将误差信号按照连接通路反向计算,使用梯度下降法来调整每一层神经元的权值w,以此来减小误差。
二、逼近网络的结构

在这里插入图片描述
神经元结构:
在这里插入图片描述
三、计算开始(核心运算就是求导)
第一部分:前向传播
隐含层神经元的输入即为所有输入信号的加权和
x j = ∑ i w i j x i x_j=\sum_{i}{w_{ij}x_i} xj=iwijxi
而隐含层的输出 x j ′ x_j^{'} xj采用函数来激发 x j x_j xj
x j ′ = f ( x j ) = 1 1 + e − x j x_j^{'}=f(x_j)=\frac{1}{1+e^{-x_j}} xj=f(xj)=1+exj1
求导:
∂ x j ′ ∂ x j = e − x j ( 1 + e − x j ) 2 = x j ′ ( 1 − x j ′ ) \frac{\partial{x_j^{'}}}{\partial{x_j}}=\frac{e^{-x_j}}{(1+e^{-x_j})^2}=x_j^{'}(1-x_j^{'}) xjxj=(1+exj)2exj=xj(1xj)
则很容易就得到输出层神经元的输出为隐含层输出加权和:
y n ( k ) = ∑ j w j 2 x j ′ y_n(k)=\sum_{j}{w_{j2}x_j^{'}} yn(k)=jwj2xj
误差为:
e ( k ) = y ( k ) − y n ( k ) ; e(k)=y(k)-y_n(k); e(k)=y(k)yn(k);
准则函数设为误差平方和的一半:
E = e ( k ) 2 2 E=\frac{e(k)^2}{2} E=2e(k)2
只有正向传播还不可以,我们还需要反向传播来调整他们之间权值w
第二部分:反向传播
反向传播使用 δ \delta δ学习算法
输出层和隐含层之间的连接权值 w j 2 w_{j2} wj2学习过程(其他同理):
Δ w j 2 = − η . ∂ E ∂ w j 2 = η . e ( k ) . ∂ y n ∂ w j 2 = η . e ( k ) . x j ′ \Delta w_{j2}=-\eta .\frac{\partial{E}}{\partial{w_{j2}}}=\eta.e(k).\frac{\partial{y_n}}{\partial{w_{j2}}}=\eta. e(k) .x_j^{'} Δwj2=η.wj2E=η.e(k).wj2yn=η.e(k).xj
因此修正后的k+1时刻的 w j k w_{jk} wjk可以表示为:
w j k ( k + 1 ) = w j k ( k ) + Δ w j 2 w_{jk}(k+1)=w_{jk}(k)+\Delta w_{j2} wjkk+1=wjk(k)+Δwj2
隐含层与输入层之间连接权值 w i j w_{ij} wij的学习过程为:
Δ w i j = − η . ∂ E ∂ w i j = η . e ( k ) . ∂ y n ∂ w i j = η . e ( k ) . x j ′ = w j 2 . x j ′ . ( 1 − x j ′ ) . x i \Delta w_{ij}=-\eta .\frac{\partial{E}}{\partial{w_{ij}}}=\eta.e(k).\frac{\partial{y_n}}{\partial{w_{ij}}}=\eta. e(k) .x_j^{'}=w_{j2}.x_j^{'}.(1-x_j^{'}).x_i Δwij=η.wijE=η.e(k).wijyn=η.e(k).xj=wj2.xj.(1xj).xi
因此修正后的k+1时刻的 w i j w_{ij} wij可以表示为:
w i j ( k + 1 ) = w j k ( k ) + Δ w i j w_{ij}(k+1)=w_{jk}(k)+\Delta w_{ij} wijk+1=wjk(k)+Δwij
为了避免在学习过程中发生振荡现象,导致收敛速度变慢,我们需要引入动量因子 α \alpha α,把上次权值对本次权值变化的影响考虑进去,即:
w j 2 ( k + 1 ) = w j 2 ( k ) + Δ w j 2 + α ( w j 2 ( k ) − w j 2 ( k − 1 ) ) w i j ( k + 1 ) = w i j ( k ) + Δ w i j + α ( w i j ( k ) − w i j ( k − 1 ) ) w_{j2}(k+1)=w_{j2}(k)+\Delta w_{j2}+\alpha (w_{j2}(k)-w_{j2}(k-1))\\ w_{ij}(k+1)=w_{ij}(k)+\Delta w_{ij}+\alpha (w_{ij}(k)-w_{ij}(k-1)) wj2(k+1)=wj2(k)+Δwj2+α(wj2(k)wj2(k1))wij(k+1)=wij(k)+Δwij+α(wij(k)wij(k1))
η 为 学 习 速 率 ∈ [ 0 , 1 ] , α 为 动 量 因 子 ∈ [ 0 , 1 ] \eta为学习速率\in[0,1],\alpha为动量因子\in[0,1] η[0,1]α[0,1]
jacobian信息:对象输出对输入的敏感度 ∂ y ( k ) ∂ u ( k ) \frac{\partial{y(k)}}{\partial{u(k)}} u(k)y(k),其值可以被神经网络辨识:
将BP网络的第一个输入称为u(k),可得:
∂ y ( k ) ∂ u ( k ) ≈ ∂ y n ( k ) ∂ u ( k ) = ∂ y n ( k ) ∂ x j ′ . ∂ x j ′ ∂ x j . ∂ x j ∂ u ( k ) = ∑ j w j 2 x j ′ ( 1 − x j ′ ) w 1 j \frac{\partial{y(k)}}{\partial{u(k)}}\approx \frac{\partial{y_n(k)}}{\partial{u(k)}}=\frac{\partial{y_n(k)}}{\partial{x_j^{'}}}.\frac{\partial{x_j^{'}}}{\partial{x_j}}.\frac{\partial{x_j}}{\partial{u(k)}}=\sum_{j}{w_{j2}x_j^{'}(1-x_j^{'})w_{1j}} u(k)y(k)u(k)yn(k)=xjyn(k).xjxj.u(k)xj=jwj2xj(1xj)w1j
至此,原理部分讲完了。
三、实例
对象 u ( k ) = s i n ( π t ) 2 u(k)={sin(\pi t)}^{2} u(k)=sin(πt)2,权值w1,w2分别取, η = 0.9 , α = 0.5 \eta=0.9,\alpha =0.5 η=0.9,α=0.5 取1000个点。
逼近曲线:
在这里插入图片描述
error:
在这里插入图片描述
code:

%%本脚本用于系统辨识  BP网络逼近函数
%2019-4-17  王萌
close all
clear all
clc
xite=0.9; %学习速率
alfa=0.5; %动量因子
%初始化权重 %%三个神经元 神经元个数提高,准确度也会提高
w2=rands(3,1);
w2_1=w2;
w2_2=w2_1;
w1=rands(2,3);
w1_1=w1;
w1_2=w1;
%初始化输入
dw1=0*w1;
x=[0 0]';
%初始化输出
I=[0,0,0]';
Iout=[0,0,0]';
FI=[0,0,0];
ts=0.01;%间隔
for k=1:1000  %
time(k)=k*ts;
    u(k)=sin(pi*k*ts)^2;   %%被逼近的函数 输入
    y(k)=u(k);             %输入
    for j=1:size(w1,2)
        I(j)=x'*w1(:,j);   %激活函数
        Iout(j)=1/(1+exp(-I(j)));
    end
        yn(k)=w2'*Iout; %神经网络的输出 6 维 
        e(k)=y(k)-yn(k); %误差计算
        w2=w2_1+(xite*e(k)*Iout)+alfa*(w2_1-w2_2);%学习算法 隐含层与输出层
        %%
        for j=1:size(w1,2)
            FI(j)=exp(-I(j))/(1+exp(-I(j)))^2; %激活函数的导数
        end
        %%增量计算
        for i=1:size(w1,1)
            for j=1:size(w1,2)
                dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i);  %隐含层与输入层
            end
        end
       w1=w1_1+dw1+alfa*(w1_1-w1_2);  %学习算法 隐含层与输入层
        %%下面计算jacobian信息
        yu=0;
        for j=1:size(w1,2)
            yu=yu+w2(j)*w1(1,j)*FI(j);  
        end
        dyu(k)=yu;
        x(1)=u(k);
        x(2)=y(k);
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
end
figure(1)
plot(time,y,'r',time,yn,'b');
xlabel('times');ylabel('y and yn');
figure(2)
plot(time,y-yn,'r');
xlabel('times');ylabel('error');
figure(3)
plot(time,dyu);
xlabel('times');ylabel('dyu'); 
  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值