使用经典的BP网络逼近非线性函数matlab代码

本代码注释非常详细,适合初学者,另外,算法的思想在这里:BP网络的基本思想
% Chauncy
% Date:2020年4月30日
close all;
clear;
clc;
%% 初始化输入输出
Num_X=1001;
X=zeros(Num_X,1);
j=1;
for i=-5:0.01:5
    X(j)=i;
    j=j+1;
end
Y=zeros(Num_X,1);%每一次理想的输出
for i=1:Num_X
    Y(i)=sin(X(i)*pi);
     if abs(Y(i))<1.0e-10
         Y(i)=0;
    end
end
%% 初始化参数
Num_cell=3;%神经元个数
w1=rand(Num_cell,1); % 输入层与隐藏层的权矩阵
b1=rand(Num_cell,1); % 隐藏层神经元阈值
w2=rand(Num_cell,1); % 输出层的权矩阵
b2=rand();           % 输出层神经元阈值
threshold=0.005;
Num_gen=4000;        %迭代

E=zeros(Num_gen,1);
Out_2=zeros(Num_X,1);%记录每一次的实际输出

for gen=1:Num_gen %循环1000次
    temp=0;
    for i=1:Num_X
        In_1=zeros(Num_cell,1);
        Out_1=zeros(Num_cell,1);
        % 计算隐藏层输出
        for j=1:Num_cell
            In_1(j)=X(i)*w1(j)-b1(j);  
            Out_1(j)=Sigmoid(In_1(j));
        end
        % 计算输出层输出
        Out_2(i)=w2'*Out_1-b2; 
        %实际输出减去理想输出
        E=Out_2(i)-Y(i); 
        
        % 更新输出神经元阈值
        delta_b2 = -1 * threshold * E;
        b2=b2-delta_b2;
        % 更新输出神经元权矩阵
        delta_w2=zeros(Num_cell,1);
        for j=1:Num_cell
            delta_w2(j)=E * threshold * Out_1(j);
            w2(j)=w2(j)+delta_w2(j);%学习算法 隐含层与输出层
        end
        % 更新隐藏层神经元阈值
        delta_b1=zeros(Num_cell,1);
        for j=1:Num_cell
            delta_b1(j)=w2(j)*Sigmoid(In_1(j))*(1-Sigmoid(In_1(j)))*(-1)*E*threshold;
            b1(j)=b1(j)-delta_b1(j);
        end
        % 更新隐藏层权矩阵
        delta_w1=zeros(Num_cell,1);
        for j=1:Num_cell
            delta_w1(j)=w2(j)*Sigmoid(In_1(j))*(1-Sigmoid(In_1(j)))*X(i)*E*threshold;
            w1(j)=w1(j)-delta_w1(j);
        end
    end
end
figure(1)
plot(Y,'r');
hold
plot(Out_2,'b');
xlabel('迭代次数');ylabel('函数值');
legend('理想输出','实际输出');
title('迭代曲线');
figure(2)
plot(Y-Out_2,'r');
xlabel('迭代次数');ylabel('实际输出与理想输出的误差');
%% Sigmoid函数
function f=Sigmoid(x)
    f=1/(1+exp(-x));
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值