MATLAB神经网络——单层感知器


目录

单层感知器基础理论知识

MATLAB神经网络工具箱使用例程

算法实现

参考文献


单层感知器基础理论知识

关于单层感知器的理论知识与MATLAB中单层感知器相关函数,在单层感知器--matlab神经网络这篇文章中有详细的讲解。


MATLAB神经网络工具箱使用例程

实例:在下图中,o点的输出值为1,*点的输出值为0。希望能获得一个神经网络,当我们输入一个坐标时,它能给出对应的输出值。

MATLAB神经网络——单层感知器_第1张图片

根据理论知识,结果将会是一条直线(x1*w1+x2*w2+b=0),他将会把平面分割为两块区域,一块输出值为0,一块输出值为1。使用MATLAB神经网络工具箱求解代码如下:

net = newp([0 1; 0 1],1)  %创建一个单层感知器(NEW Perceptron),它有两个输入节点(假设为x1和x2),x1的取值范围是0~1,x2的取值范围是0~1,有一个节点。
P = [0 0 1 1; 0 1 0 1];  %输入样本,在这里是一个2X4的矩阵,矩阵的每一列表示一个样本点
T = [0 1 1 1];  %期望值(输出值),对应输入样本
net.trainParam.epochs = 20;  %net是已经创建的神经网络,它本质上是一个对象,在这里修改trainParam的epochs值为20,表示训练最大的迭代次数为20次
net = train(net,P,T);  %训练神经网络

%以下为理解‘单层感知器’而做的可视化部分,非求解问题必须代码
Y = sim(net,P);%对训练好的神经网络仿真(simulate),把样本值传入神经网络,观察输出结果于原结果是否一致
b = net.b{1,1};  %我们的目的实际上是为了获得直线(x1*w1+x2*w2+b=0),这里获取b值(它存储在net对象的b参数值里)
w1 = net.IW{1,1}(1);  %获取w1值
w2 = net.IW{1,1}(2);  %获取w2值
% 绘图
x1 = -1:0.1:2;
x2 = -w1/w2*x1-b;
plot(x1,x2,'k')
hold on
plot(P(1,2:end),P(2,2:end),'ko');
plot(P(1,1),P(2,1),'r*');
axis([-1,2,-1,2])
legend('分类直线','值为1','值为0')

结果如下

MATLAB神经网络——单层感知器_第2张图片

测试神经网络,过程如下(正确性可从上图中观察得出)


>> sim(net,[0.1;0.1])

ans =

     0

>> sim(net,[0.5;0.5])

ans =

     1

算法实现

根据单层感知器--matlab神经网络文中 “二、学习算法步骤:”,上面的问题可根据算法步骤,用以下MATLAB代码实现(不使用MATLAB神经网络工具箱):

n=0.2;                  % 学习率
w=[0,0,0]; 
P = [0 0 1 1; 0 1 0 1];
d=[0 1 1 1];        % 期望输出
P=[ones(1,4);P];
MAX=20;                 % 最大迭代次数为20次
i=0;
while 1
    v=w*P; 
    x2=hardlim(v);       % 实际输出
    %更新
    e=(d-x2);
    ee(i+1)=mae(e);
    if (ee(i+1)<0.001)   % 判断
        disp('we have got it:');
        disp(w);
        break;
    end
    % 更新权值和偏置
    w=w+n*(d-x2)*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(P(2,2:end),P(3,2:end),'ko');
hold on
plot(P(2,1),P(3,1),'r*');
axis([-1,2,-1,2])
x1=-1:.1:2;
x2=x1*(-w(2)/w(3))-w(1)/w(3);
plot(x1,x2);
legend('值为1','值为0','分类直线');
hold off
subplot(2,1,2);      % 显示mae值的变化
x1=0:i;
plot(x1,ee,'o-');
s=sprintf('mae的值(迭代次数:%d)', i+1);
title(s)

参考文献

陈明.MATLAB神经网络原理与实例精解

 

你可能感兴趣的:(MATLAB)