Matlab实现单层感知机网络识别字母

感知机网络的参数设置

% 具体用法:
% net=newp(pr,T,TF,LF);
% 
% pr:  pr是一个R×2的矩阵,R为感知器中输入向量的维度(本例中使用35个字符表征一个字母,那么其维度为35),每一行表示输入向量每个分量的最小值和最大值。在本例中只有0和1.

% T:  T表示输出节点的个数,标量(本例使用三个输出节点的组合结果来 表示某一个类标号。实际上三个类标号至少需要两个比特位表示。)
% TF: 传输函数,可选hardlim和hardlims,默认为hardlim,建议取hardlims
% LF: 学习函数,可选learnp或learnpn,默认为learnp,learnpn对输入量大小的变化不明显,
%     当输入的向量在数值的幅度上变化较大用learnpn代替learnp可以加快计算速度
% 

样本空间##

%样本空间:每个样本使用7×5的二值矩阵来表征一个字母。
E1=[0 0 0 0 0;
    1 1 1 0 0 ;
    1 0 0 0 0 ;
    1 1 1 0 0 ;
    1 0 0 0 0; 
    1 1 1 1 0 ;
    0 0 0 0 0];
E2=[0 0 0 0 0;
    1 1 1 1 0 ;
    1 0 0 0 0 ;
    1 1 0 0 0 ;
    1 0 0 0 0; 
    1 1 1 1 0 ;
    0 0 0 0 0];
E3=[0 0 0 0 0; 
    1 1 1 1 0 ;
    1 0 0 0 0 ;
    1 1 1 0 0 ;
    1 0 0 0 0; 
    1 1 1 1 0 ;
    0 0 0 0 0];
E4=[0 0 0 0 0; 
    1 1 1 1 0 ;
    1 0 0 0 0 ;
    1 1 1 0 0 ;
    1 0 0 0 0; 
    1 1 1 0 0 ;
    0 0 0 0 0];
L1=[0 0 0 0 0;
    0 1 0 0 0; 
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 1 1 0; 
    0 0 0 0 0];
L2=[0 0 0 0 0;
    0 1 0 0 0; 
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 1 1 0; 
    0 0 0 0 0];
L3=[0 0 0 0 0;
    0 1 0 0 0; 
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 1 1 0; 
    0 0 0 0 0];
L4=[0 0 0 0 0;
    0 1 0 0 0; 
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 0 0 0 ;
    0 1 1 1 0; 
    0 0 0 0 0];
I1=[0 0 0 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0 ;
    0 0 1 0 0 ;
    0 0 1 0 0; 
    0 0 0 0 0];
I2=[0 0 0 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0 ;
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 0 0 0];
I3=[0 0 0 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0 ;
    0 0 0 0 0];
I4=[0 0 0 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0; 
    0 0 1 0 0 ;
    0 0 0 0 0];
%下面将使用每个字母类型的前三个样本作为训练样本,第四个作为测试样本。

训练阶段

%选取每个字母的前三个样本作为训练样本
p=[E1(1:end);E2(1:end);E3(1:end);I1(1:end);I2(1:end);I3(1:end);L1(1:end);L2(1:end);L3(1:end)]';%注意单引号“'”表示转置

%t表示期望的输出,每一列对应于一个样本的期望,从而监督其分类标号。如第一列{1,0,1}表示字母E这个类,最后一列{0,1,0}表示字母L这个类。
 t=[1 1 1 1 1 1 0 0 0;
    0 0 0 0 0 0 1 1 1;
    1 1 1 0 0 0 0 0 0];

%初始化pr为一个35行,2列的零矩阵。
pr=zeros(35,2);

%定义输入向量每个维度的最小值和最大值。
pr(:,2)=1;

%感知机网络参数设置函数
net=newp(pr,3,'hardlim','learnp');%hardlim是二极激活函数(传递函数),learnsp是学习函数

%设置最大迭代次数为20
net.trainParam.epochs=20;

%将训练集p和期望的输出(类标号)装载进设置好的网络net
net=train(net,p,t);

测试阶段

%使用sim将测试样本进行测试,% sim函数用于仿真一个神经网络,输出结果返回到C
C1=sim(net,E4(1:end)');
C2=net(I4(1:end)');

输出结果

  在命令窗口用:

C1(回车换行)
C2(回车换行)

即可查看输出的分类结果:

>> C1

C1 =

     1
     0
     1

>> C2

C2 =

     1
     0
     0
原文地址:https://www.cnblogs.com/d0main/p/6692526.html