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

📄 bp3.m

📁 matlab,神经网络
💻 M
字号:
clear all;
clc;
%=============初始化
eta = 0.003;    % 学习率
epsilon = 0.4;   % 目标误差
N_max = 20000;    % 最大学习次数
W = -0.1+0.2*rand(10,2);    % 输入层到隐含层的初始权值
V = -0.1+0.2*rand(1,11);    % 隐含层到输出层的初始权值
x1 = -4+8*rand(1,100); % 输入信号
x2 = ones(1,100); % 阈值
X = [x1;x2];    % 初始输入模式向量
Noise = 0.1*randn(1,100);

%=============计算输出层的希望值
F = 1.1*(1-x1+2*x1.^2).*exp(-(x1.^2)/2)+Noise;

%=============下面进行网络训练
for N = 1:N_max   % N为训练次数
    for k = 1:length(x1)   % k为第k个模式
        % (1)输入模式顺序传播
        NET1 = W*X(:,k);     % 输入层到隐含层的激活矩阵
        B = 1./(1+exp(-NET1));  % 隐含层的实际输出矩阵(标准Sigmoidal激活函数)
        B1 = [B;1];
        NET2 = V*B1;     % 隐含层到输出层的激活矩阵
        Y(:,k) = NET2;       % 输出层的实际输出矩阵(线性激活函数)
        % (2)输出误差的逆传播
        E(:,k) = (F(:,k) - Y(:,k)).^2;        % 输出层的误差
        Rr = F(:,k)-Y(:,k);  % 输出层的学习信号
        Rp = B1.*(1-B1).*(V'*Rr);% 隐含层的学习信号
        V = V+eta*Rr*B1';       % 输出层权值的更新
        W = W+eta*Rp(1:end-1,:)*X(:,k)';    % 输入层权值的更新
        %========第k个模式的权值更新完毕
    end
    E_sum = sum(E,1);
    E_mean(N) = mean(E_sum);      % k个模式的平均误差
    n(N) = N;
    if E_mean(N)<epsilon
        break;
    end
end

plot(n,E_mean);grid on;
xlabel('训练次数');ylabel('所有模式的平均误差');
title('学习误差曲线,最大学习次数N_{max}=10000,\eta=0.1,\epsilon=0.01');
xlim([0 N]);

% 下面利用训练好的网络绘制图形

%=============产生输入模式矢量
x1 = linspace(-4,4,100); % 输入信号
x2 = ones(1,100); % 阈值
X = [x1;x2];    % 初始输入模式向量
Noise = 0.1*randn(1,100);

%=============计算输出层的希望值
F1 = 1.1*(1-x1+2*x1.^2).*exp(-(x1.^2)/2)+Noise;

%=============下面进行函数逼近
for i = 1:length(x1)
    NET1 = W*X(:,i);     % 输入层到隐含层的激活矩阵
    B = 1./(1+exp(-NET1));  % 隐含层的实际输出矩阵(标准Sigmoidal激活函数)
    B1 = [B;1];
    NET2 = V*B1;     % 隐含层到输出层的激活矩阵
    Y1(:,i) = NET2;       % 输出层的实际输出矩阵(线性激活函数)
end

%============绘制理想图形和逼近图形
figure;
plot(x1,F1(1,:),'r');grid on;hold on;
plot(x1,Y1(1,:),'b');
xlabel('自变量');ylabel('函数值');
title('理想函数与逼近函数的对比,最大学习次数N_{max}=20000,\eta=0.003,\epsilon=0.5');
legend('理想函数曲线','逼近函数曲线');

disp('运算结果:------------->');
disp('目标误差:');
disp(E_mean(end));
disp('学习次数:');
disp(N);

⌨️ 快捷键说明

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