MATLAB神经网络学习(1):单层感知器

   单层感知器由一个线性组合器和一个二值阈值元件组成。

  输入是一个N维向量 x=[x1,x2,...,xn],其中每一个分量对应一个权值wi,隐含层输出叠加为一个标量值:

                      

  随后在二值阈值元件中对得到的v值进行判断,产生二值输出:

                          

  可以将数据分为两类。实际应用中,还加入偏置,值恒为1,权值为b。这时,y输出为:

                  

  单层感知器结构图:

                

  单层感知器进行模式识别的超平面由下式决定:

                    

  当维数N=2时,输入向量可以表示为平面直角坐标系中的一个点。此时分类超平面是一条直线:

                    

  这样就可以将点沿直线划分成两类。

  

  单层感知器实例:

  

  .....重复上步骤,直到达到设定的loop值,或者误差小于设定值

% perception_hand_un.m
%% 清理
clear,clc
close all

%%
n=0.1;                  % 学习率
w=[0,0,0]; 
P=[ -9,  1, -12, -4,   0, 5;...
   15,  -8,   4,  5,  11, 9];
d=[1,1,0,0,0,1];        % 期望输出

P=[ones(1,6);P];
MAX=100;                 % 最大迭代次数为100次
%% 训练
i=0;
while 1
    v=w*P; 
    y=hardlim(v);       % 实际输出
    %更新
    e=(d-y);
    ee(i+1)=mae(e);
    if (ee(i+1)<0.001)   % 判断
        disp('we have got it:');
        disp(w);
        break;
    end
    % 更新权值和偏置
    w=w+n*(d-y)*P';
    
    if (i>=MAX)         % 达到最大迭代次数,退出
        disp('MAX times loop');
        disp(w);
        disp(ee(i+1));
       break; 
    end
    i= i+1;
end


%% 显示
figure;
subplot(2,1,1);         % 显示待分类的点和分类结果
plot([  -12  -4    0],[ 4   5   11],'o');
hold on;
plot([-9 ,1,5],[15,-8,9],'*');
axis([-13,6,-10,16]);
legend('第一类','第二类');
title('6个坐标点的二分类');
x=-13:.2:6;
y=x*(-w(2)/w(3))-w(1)/w(3);
plot(x,y);
hold off;

subplot(2,1,2);         % 显示mae值的变化
x=0:i;
plot(x,ee,'o-');
s=sprintf('mae的值(迭代次数:%d)', i+1);
title(s);
% perception_newp.m
% 清理
clear,clc
close all

% 创建感知器
net=newp([-20,20;-20,20],1);

%定义输入训练向量
P=[ -9,  1, -12, -4,   0, 5;...
   15,  -8,   4,  5,  11, 9];
% 期望输出
T=[0,1,0,0,0,1]

% 训练
net=train(net,P,T);

% 输入训练数据仿真验证
Y=sim(net,P)

  

  

猜你喜欢

转载自www.cnblogs.com/54hys/p/10164676.html