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

📄 bp2.m

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

%=============计算输出层的希望值
for i = 1:length(x1)
    if x1(i)>-1 & x1(i)<(2*x2(i)-1) & x2(i)<1
        C(:,i) = [0;1;0];             % c2类(三角形内)
    elseif x1(i)>-1 & x1(i)<1 & x2(i)>-1.5 & x2(i)<-0.5
        C(:,i) = [0;0;1];             % c3类(矩形内)
    else
        C(:,i) = [1;0;0];             % c1类
    end
end

%=============下面进行网络训练
for N = 1:N_max   % N为训练次数
    for k = 1:length(x1)   % k为第k组样本
        % (1)输入模式顺序传播
        NET1 = W*X(:,k);     % 输入层到隐含层的激活矩阵
        B = 1./(1+exp(-NET1));  % 隐含层的实际输出矩阵
        B1 = [B;1];
        NET2 = V*B1;     % 隐含层到输出层的激活矩阵
        Y = 1./(1+exp(-NET2));  % 输出层的实际输出矩阵
        % (2)输出误差的逆传播
        E(:,k) = (C(:,k) - Y).^2;        % 输出层的误差
        Rr = Y.*(1-Y).*(C(:,k)-Y);  % 输出层的学习信号
        Rp = B1.*(1-B1).*(V'*Rr);% 隐含层的学习信号
        V = V+eta*Rr*B1';       % 输出层权值的更新
        W = W+eta*Rp(1:end-1,:)*X(:,k)';    % 输入层权值的更新
        %========第k个模式的权值更新完毕
    end
    E_sum = 0.5*sum(E);
    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]);

%==============下面用同样的方法产生5000个样本测试网络

%=============产生输入模式矢量
x1 = -2+4*rand(1,5000); % 输入信号
x2 = -2+4*rand(1,5000); % 输入信号
x3 = ones(1,5000); % 阈值
X = [x1;x2;x3];    % 初始输入模式向量

%=============计算输出层的希望值
for i = 1:length(x1)
    if x1(i)>-1 & x1(i)<(2*x2(i)-1) & x2(i)<1
        C(:,i) = [0;1;0];             % c2类(三角形内)
    elseif x1(i)>-1 & x1(i)<1 & x2(i)>-1.5 & x2(i)<-0.5
        C(:,i) = [0;0;1];             % c3类(矩形内)
    else
        C(:,i) = [1;0;0];             % c1类
    end
end

%=============下面进行网络训练
for i = 1:length(x1)
    NET1 = W*X(:,i);     % 输入层到隐含层的激活矩阵
    B = 1./(1+exp(-NET1));  % 隐含层的实际输出矩阵
    B1 = [B;1];
    NET2 = V*B1;     % 隐含层到输出层的激活矩阵
    Y(:,i) = 1./(1+exp(-NET2));  % 输出层的实际输出矩阵
end
Y = round(Y);

%============计算正确概率
Result = (Y==C);
Right = 0;
for ij = 1:length(x1)
    if Result(:,ij)==[1;1;1];
        Right = Right+1;
    end
end
sum1 = sum(C,2);      % 属于c1 c2 c3模式的样本总数(理想值)
sum2 = sum(Y,2);      % 属于c1 c2 c3模式的样本总数(实际值)

Prob = Right/length(x1);
disp('运算结果:------------->');
disp('目标误差:');
disp(E_mean(end));
disp('正确概率:');
disp(Prob);
disp('学习次数:');
disp(N);
disp('属于c1、c2、c3的样本总数(第一列为希望值,第二列为实际值):---------->');
disp('        c1:          c2:         c3:');
disp([sum1';sum2']);

⌨️ 快捷键说明

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