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

📄 bppredict.asv

📁 MATLAB编写的误差反向传播(BP)神经网络简单分类器。
💻 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 + -