📄 bppredict.asv
字号:
%BP网络非线性分类器主程序
%本程序采用50组非线性分类数据,利用BP网络进行训练分类,输入为2个神经元
%作者:梁霄
%单位:东华大学 信息科学与技术学院 控制理论与控制工程
%最后更新时间:2007.12.31 16:07
clear all;
%关闭警告消息
nntwarn off;
%隐含层神经元个数
NUMBER1=3;
NUMBER2=5;
%学习速率
lr=0.04;
%误差精度
err_goal=0.005;
%最大迭代次数
max_epoch=20000;
%训练数据集数量
TRAINNUM=20;
%随机样本数目
SamplesNum=50;
%正弦分类面幅值
A=2;
%正弦分类面周期
xp=2;
%正弦分类面初相角
phai=0;
%样本水平范围
CrX=5;
%样本垂直范围
CrY=2;
%类别1结果允许下限
CLASS_1_INF=0.7;
%类别2结果允许上限
CLASS_2_SUP=0.3;
%创建随机样本点
X1=GetPoints(SamplesNum,A,xp,phai,CrX,CrY);
%分离输入数据集
X=zeros(2,SamplesNum);
X(1,:)=X1(1,:);
X(2,:)=X1(2,:);
%分离输出数据集
T=zeros(1,SamplesNum);
T=X1(3,:);
%输出每一类的样本数目
samples_1=0;
samples_2=0;
for i=1:samplesNum,
if(T(i)==0.95)
samples_1=samples_1+1;
end
if(T(i)==0.05)
samples
%选择训练数据集
X_test=[X(:,linspace(1,TRAINNUM,TRAINNUM))];
T_test=[T(:,linspace(1,TRAINNUM,TRAINNUM))];
%取得输入神经元的个数M
[M,N]=size(X_test);
%每个输入神经元输入数据的最大值和最小值
Xr=[zeros(1,M);ones(1,M)]';
%生成BP网络
[Wij,b1,Wjk,b2,Wkl,b3]=initff(Xr,NUMBER1,'tansig',NUMBER2,'tansig',1,'tansig');
Wijs=Wij;b1s=b1;
Wjks=Wjk;b2s=b2;
Wkls=Wkl;b3s=b3;
%计时开始
tic
%开始循环
for epoch=1:max_epoch
%求出隐含层1神经元的输出
Oj=tansig(Wij*X_test,b1);
%求出隐含层2神经元的输出
Ok=tansig(Wjk*Oj,b2);
%求出输出层神经元输出
Ol=tansig(Wkl*Ok,b3);
%计算输出误差
E=T_test-Ol;
%计算输出层的delta
deltal=deltalin(Ol,E);
%计算隐含层2的delta
deltak=deltatan(Ok,deltal,Wkl);
%计算隐含层1的delta
deltaj=deltatan(Oj,deltak,Wjk);
%调整输出层加权系数
[dWkl,db3]=learnbp(Ok,deltal,lr);
Wkl=Wkl+dWkl;b3=b3+db3;
%调整隐含层2加权系数
[dWjk,db2]=learnbp(Oj,deltak,lr);
Wjk=Wjk+dWjk;b2=b2+db2;
%调整隐含层1加权系数
[dWij,db1]=learnbp(X_test,deltaj,lr);
Wij=Wij+dWij;b1=b1+db1;
%计算网络权值修正后的误差平方和
SSE=sumsqr(T_test-tansig(Wkl*tansig(Wjk*tansig(Wij*X_test,b1),b2),b3));
%如果满足误差条件就停止循环
if(SSE<err_goal)
break;
end
end
%计时结束
toc
%显示迭代次数
epoch
%使用全部的数据作测试,包括训练数据和测试数据
X_test=X;
T_test=T;
[tmp1,tmp2,Out_test,Out_E,Out_SSE]=PredictNet2(Wij,b1,Wjk,b2,Wkl,b3,X_test,T_test);
%绘图部分
figure(1);
%首先作出分类面曲线
coord_X=linspace(0,CrX,100);
coord_Y=A .* sin(2 * pi .* coord_X / xp + phai);
plot(coord_X,coord_Y);
hold on;
%计算分到两类正确的数目
correct_1=0;
correct_2=0;
%依次作出每个点的分类结果,如果分类为1则为蓝色,为0则为红色。
for i=1:SamplesNum,
if((Out_test(i)>=CLASS_1_INF)&&(T(i)==0.95))
plot(X(1,i),X(2,i),'b*');
correct_1=correct_1+1;
end
if((Out_test(i)<=CLASS_2_SUP)&&(T(i)==0.05))
plot(X(1,i),X(2,i),'rv');
correct_2=correct_2+1;
end
hold on;
end
%输出正确分类数
correct_1
correct_2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -