📄 class_bp.m
字号:
inputs=load('E:\Matlab programs\input.txt');
targets=load('E:\Matlab programs\output.txt');
[samples,hw1]=size(inputs);%samples=50,hw1=7,layers为隐层节点数
hw11=hw1+1;
layers=7;
err_goal=0.01; %给定误差标准
max_epoch=4000; %给定训练最大次数
yinzi=0.2; %给定训练因子
w1=(rand(hw11,layers)*2-1);%随机取权值w1
w2=(rand(layers,1)*2-1)/1000;%随机取权值w2
sse=zeros(1,max_epoch);
%if samples~=1
%-------------------输入规范化----------------
for i=1:hw1 %找出最大最小值
max(1,i)=inputs(1,i);
min(1,i)=inputs(1,i);
end
for i=1:hw1
for j=1:samples
if max(1,i)<inputs(j,i)
max(1,i)=inputs(j,i);
end
if min(1,i)>inputs(j,i)
min(1,i)=inputs(j,i);
end
end
end
for i=1:hw1 %inputs归一化(0,1)
for j=1:samples
inputs(j,i)=(inputs(j,i)-min(1,i))/(max(1,i)-min(1,i));
end
end
mmax=targets(1,1); %找出最大最小值
mmin=targets(1,1);
for i=1:samples
if mmax<targets(i,1)
mmax=targets(i,1);
end
if mmin>targets(i,1)
mmin=targets(i,1);
end
end
for i=1:samples %targets归一化(0,1)
targets(i,1)=(targets(i,1)-mmin)/(mmax-mmin);
end
%--------------求样本输出out------------
%count=count+1;
for count=1:max_epoch
add=zeros(samples,1); %增加一个输入节点(作为期望的偏差值)
out=zeros(samples,1);
for k=1:samples
if k==1
add(1,1)=0;
else
add(k,1)=targets(k-1,1)-out(k-1,1);
end
hilayer=zeros(layers,1); %隐层节点输出初始化
for i=1:layers
for j=1:hw1 %w1*inputs求和
hilayer(i,1)=hilayer(i,1)+inputs(k,j)*w1(j,i);
end
hilayer(i,1)=hilayer(i,1)+add(k,1)*w1(hw1+1,i);
hilayer(i,1)=logsig(hilayer(i,1)); %对隐层节点进行s函数变换
end
for i=1:layers
out(k,1)=out(k,1)+hilayer(i,1)*w2(i,1); %隐层节点*w2求和,得到输出out
end
out(k,1)=logsig(out(k,1)); %对输出求s函数[shuchu,yinceng,count]=program(ceshi,w1,w2,layers,t)
sse(1,count)=sse(1,count)+((targets(k,1)-out(k,1))^2)/2 ; %计算均方差
%----------求梯度-------------
tidu1=zeros(layers,1);
tidu2=out(k,1)*(1-out(k,1))*(targets(k,1)-out(k,1));
for i=1:layers
tidu1(i,1)=(1-hilayer(i,1))*hilayer(i,1)*tidu2*w2(i,1);
end
for i=1:layers
w2(i,1)=w2(i,1)+yinzi*tidu2*hilayer(i,1);
end
for i=1:hw1
for j=1:layers
w1(i,j)=w1(i,j)+yinzi*tidu1(j,1)*inputs(k,i);
end
end
for j=1:layers
w1(hw11,j)=w1(hw11,j)+yinzi*tidu1(j,1)*add(k,1)*1.2;
end
end
%----------------判断均方差是否满足要求-----------------------------
if sse(1,count)<err_goal
break;
end
end
k=1:count;
plot(k,sse(1,k))
mse=sse(1,count);
jishu=0;%错误数
for k=1:samples
if (((out(k,1)>=0.6091)&(targets(k,1)>=0.6091))|((out(k,1)<=0.6091)&(targets(k,1)<=0.6091)))
jishu=jishu+1;
end
end
%预测
ti=load('E:\Matlab programs\testinput.txt');
to=load('E:\Matlab programs\testoutput.txt');
%to=to'
[outo,d,ave]=yuce(ti,to,w1,w2,7);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -