Main Content

归一化感知器规则

2 输入硬限制神经元被训练为将 5 个输入向量分类为两个类别。尽管一个输入向量比其他输入向量大得多,使用 LEARNPN 进行训练还是很快的。

X 中的五个列向量中的每一个都定义了一个二元素输入向量,行向量 T 定义了向量的目标类别。使用 PLOTPV 绘制这些向量。

X = [ -0.5 -0.5 +0.3 -0.1 -40; ...
      -0.5 +0.5 -0.5 +1.0 50];
T = [1 1 0 0 1];
plotpv(X,T);

请注意,4 个输入向量的幅值远远小于绘图左上角的第五个向量。感知器必须将 X 中的 5 个输入向量正确分类为由 T 定义的两个类别。

PERCEPTRON 用 LEARPN 规则创建一个新网络,相对于 LEARNP(默认值),该网络对输入向量大小的巨大变化不太敏感。

然后用输入数据和目标数据对该网络进行配置,得到其权重和偏置的初始值。(配置通常不是必需的,因为它由 ADAPT 和 TRAIN 自动完成。)

net = perceptron('hardlim','learnpn');
net = configure(net,X,T);

将神经元的最初分类尝试添加到绘图中。

初始权重设置为零,因此任何输入都会生成相同的输出,而且分类线甚至不会出现在图上。别担心...我们将对它进行训练!

hold on
linehandle = plotpc(net.IW{1},net.b{1});

ADAPT 返回一个新网络对象(它作为更好的分类器执行)、网络输出和误差。此循环允许网络自适应,绘制分类线,并继续进行直到误差为零。

E = 1;
while (sse(E))
   [net,Y,E] = adapt(net,X,T);
   linehandle = plotpc(net.IW{1},net.b{1},linehandle);
   drawnow;
end

请注意,用 LEARNP 进行训练只需要 3 轮,而用 LEARNPN 求解同样的问题需要 32 轮。因此,当输入向量大小有巨大变化时,LEARNPN 的表现优于 LEARNP。

现在,SIM 可用于对任何其他输入向量进行分类。例如,对输入向量 [0.7; 1.2] 进行分类。

此新点及原始训练集的绘图显示了网络的性能。为了将其与训练集区分开来,将其显示为红色。

x = [0.7; 1.2];
y = net(x);
plotpv(x,y);
circle = findobj(gca,'type','line');
circle.Color = 'red';

打开“hold”,这样之前的绘图不会被擦除。将训练集和分类线添加到绘图中。

hold on;
plotpv(X,T);
plotpc(net.IW{1},net.b{1});
hold off;

最后,放大感兴趣的区域。

感知器正确地将我们的新点(红色)分类为类别“零”(用圆圈表示)而不是“一”(用加号表示)。尽管存在离群值,感知器仍能在短得多的时间内正确学习(与“离群值输入向量”示例相比)。

axis([-2 2 -2 2]);