Matlab BPNet逼近函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1-6-1结构

function BPNet
%% 参数初始化
l = 0.09; % 学习率
n = 20; % 样本数
cells1 = 6; % 神经元个数
cells2 = 2;
times = 500; % 训练轮数
x = (linspace(0,2*pi*19/20,20)); % 选取样本点
t = 0.5*(1+cos(x)); % 样本需要学习的函数
w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [6 ,1]
w2 = rand(1,cells1); % 随机赋值第二层连接权系数 [1, 6]
% w3=rand(1,cells2);
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值
yw2 = rand(1,1); % 随机赋值第二层输出阈值
% yw3=rand;
y = rand(1,n); % 随机赋值输出
counts = 1; % 计数值初始化
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
    ei=0;
    for a=1:n % 样本数
        net1=w1*x(a)-yw1; % 第一层网络的输入 [6, 1]
        out1=logsig(net1); % 第一层网路的输出 [6, 1]
        y(a)=w2*out1-yw2; % 第二层网络的输入 [1, 6]*[6 ,1]=[1]
%         out3=logsig(net2); % 第二层网络的输出 [1]
%         net3=w3*out2-yw3; 
%         y(a)=net3;
        det2=t(a)-y(a); % 计算偏差 [1]
        det1=((det2*(w2))'.*out1).*(1-out1); %%2*1 ([6, 1]'*[6 ,1])*[6, 1] = [6, 1]
%         det1=((det2'*(w2))'.*out1).*(1-out1);%%4*1
     
        w1=w1+det1*x(a)*l; % [6, 1]
        w2=w2+(det2*out1')*l; % [1, 6]
%         w3=w3+(det3*out2')*l;
        
        yw1=-det1*l+yw1;
        yw2=-det2*l+yw2;
%         yw3=-det3*l+yw3;
        ei=ei+det2^2/2;
        e(i)=ei;      
    end % 结束一次样本遍历
    
    if ei<0.008
        break;
    end
    counts=counts+1;
    
end % 结束学习
%% 计算学习的曲线
for a=1:n
    net1=w1*x(a)-yw1;
    out1=logsig(net1);
    net2=w2*out1-yw2;
%     out2=logsig(net2);
%     net3=w3*out2-yw3;
    y(a)=net2;
end
%% 绘图
subplot(2,1,1);
plot(x,t,'b-',x,y,'ro-');
grid on
title('BP学习方法逼近y=0.5*(1+cos(x))');
xlabel('x轴');
ylabel('y=0.5*(1+cos(x))');

if (counts<times)
    count=1:counts;
    sum=counts;
else 
    count=1:times;
    sum=times;
end

subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');
return;

请添加图片描述

1-4-2-1结构

function BPNet
%% 参数初始化
l = 0.09; % 学习率
n = 20; % 样本数
cells1 = 4; % 神经元个数
cells2 = 2;
times = 3000; % 训练轮数
x = (linspace(0,2*pi*19/20,20)); % 选取样本点
t = 0.5*(1+cos(x)); % 样本需要学习的函数
w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [6 ,1] [4, 1]
w2 = rand(cells2,cells1); % 随机赋值第二层连接权系数 [1, 6] [2, 4]
w3=rand(1,cells2); % 随机赋值第三层连接权系数 [1, 2]
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值 [6, 1] [4, 1]
yw2 = rand(cells2,1); % 随机赋值第二层输出阈值 [1] [2, 1]
yw3=rand; % 随机赋值第三层输出阈值 [1]
y = rand(1,n); % 随机赋值输出
counts = 1; % 计数值初始化
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
    ei=0;
    for a=1:n % 样本数
        net1=w1*x(a)-yw1; % 第一层网络的输入 [6, 1] [4, 1]
        out1=logsig(net1); % 第一层网路的输出 [6, 1] [4, 1]
        net2=w2*out1-yw2; % 第二层网络的输入 [1, 6]*[6 ,1]=[1] [2, 1]
        out2=logsig(net2); % 第二层网络的输出 [1] [2, 1]
        net3=w3*out2-yw3; % 第三层网络的输出 [1]
        y(a)=net3; % 第三层网络的输出 [1]
        det3=t(a)-y(a); % 计算偏差 [1]
        det2=((det3*(w3))'.*out2).*(1-out2); %%2*1 ([6, 1]'*[6 ,1])*[6, 1] = [6, 1] [2, 1]
        det1=((det2'*(w2))'.*out1).*(1-out1);%%4*1 [4, 1]
     
        w1=w1+det1*x(a)*l; % [6, 1] [4, 1]
        w2=w2+(det2*out1')*l; % [1, 6] [2, 4]
        w3=w3+(det3*out2')*l; % [1, 2]
        
        yw1=-det1*l+yw1;
        yw2=-det2*l+yw2;
        yw3=-det3*l+yw3;
        ei=ei+det3^2/2;
        e(i)=ei;      
    end % 结束一次样本遍历
    
    if ei<0.008
        break;
    end
    counts=counts+1;
    
end % 结束学习
%% 计算学习的曲线
for a=1:n
    net1=w1*x(a)-yw1;
    out1=logsig(net1);
    net2=w2*out1-yw2;
    out2=logsig(net2);
    net3=w3*out2-yw3;
    y(a)=net3;
end
%% 绘图
subplot(2,1,1);
plot(x,t,'b-',x,y,'ro-');
grid on
title('BP学习方法逼近y=0.5*(1+cos(x))');
xlabel('x轴');
ylabel('y=0.5*(1+cos(x))');

if (counts<times)
    count=1:counts;
    sum=counts;
else 
    count=1:times;
    sum=times;
end

subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');
return;

请添加图片描述

不同的写法(效果差不好)

%BP identification
clear all;
close all;

%% 变量初始化
xite=0.05;
alfa=0.005;

w1=rand(1,6); % k+1时刻权值
w1_1=w1; % k时刻权值
w1_2=w1_1; % k-1时刻权值

w2=rand(6,1); % k+1时刻权值
w2_1=w2; % k时刻权值
w2_2=w2_1; % k-1时刻权值

dw1=0*w1;

%% 模型学习
for times = 1:500
for  k=1:1:20

    time(k) = k;
    x = 2*pi*(k-1)/20;
    y(k) = 0.5*(1+cos(x));

    I = x*w1; % 计算隐层的输入 [1, 6] 
    for j=1:1:6
        Iout(j) =1/(1+exp(-I(j))); % 计算隐层的输出 sigmoid [1, 6]
    end

    yn(k) = Iout * w2; % Output of networks [1, 6]*[6, 1] = [1]

    e(k) = y(k)-yn(k); % Error calculation

    w2 = w2_1+(xite*e(k))*Iout'+alfa*(w2_1-w2_2); % 隐层和输出层之间的权重学习,并且为了避免学习中发生震荡等问题,加入了动量因子=0
    
    for j=1:1:6
        FI(j) = exp(-I(j))/(1+exp(-I(j)))^2; % xj‘(1-xj’) [1, 6]
    end 

    for j=1:1:6
        dw1(j)=e(k)*xite*FI(j)*w2(j)*x; % [1, 6]
    end
    w1 = w1_1+dw1+alfa*(w1_1-w1_2); % 隐层和输入层之间的权重学习,并且为了避免学习中发生震荡等问题,加入了动量因子=0

    %%%%%%%%%%%%%%Jacobian%%%%%%%%%%%%%%%%计算输出对输出入的敏感度
    yu=0;
    for j=1:1:6
       yu=yu+w2(j)*w1(j)*FI(j);
    end
    dyu(k)=yu;

    w1_2=w1_1; % 更新权值
    w1_1=w1;

    w2_2=w2_1; % 更新权值
    w2_1=w2;
end
end

%% 绘图
figure(1);
plot(time,y,'b-',time,yn,'ro-');
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');

在这里插入图片描述
跟上面的主要区别还是权重更新的方式不一样,所以导致的效果不同,具体细节没在研究!!!

代码

韦巍《智能控制基础》课本例3-2 BP神经网络代码

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值