📄 bp2.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 + -