Main Content

竞争学习

竞争层中的神经元可通过学习来表示输入向量在输入空间中出现的不同区域。

P 是一组随机生成但聚类的测试数据点。下面绘制了这些数据点。

竞争网络将用于将这些点分成若干自然类。

% Create inputs X.
bounds = [0 1; 0 1];   % Cluster centers to be in these bounds.
clusters = 8;          % This many clusters.
points = 10;           % Number of points in each cluster.
std_dev = 0.05;        % Standard deviation of each cluster.
x = nngenc(bounds,clusters,points,std_dev);

% Plot inputs X.
plot(x(1,:),x(2,:),'+r');
title('Input Vectors');
xlabel('x(1)');
ylabel('x(2)');

此处 COMPETLAYER 接受两个参量,即神经元数量和学习率。

我们可以配置网络输入(通常由 TRAIN 自动完成),并绘制初始权重向量以查看其分类尝试过程。

对权重向量 (o) 进行训练,使它们出现在输入向量 (+) 的聚类的中心。

net = competlayer(8,.1);
net = configure(net,x);
w = net.IW{1};
plot(x(1,:),x(2,:),'+r');
hold on;
circles = plot(w(:,1),w(:,2),'ob');

设置在停止之前需要训练的轮数,并训练此竞争层(可能需要几秒)。

在同一图上绘制更新后的层权重。

net.trainParam.epochs = 7;
net = train(net,x);

w = net.IW{1};
delete(circles);
plot(w(:,1),w(:,2),'ob');

现在我们可以使用竞争层作为分类器,其中每个神经元都对应于一个不同的类别。此处,我们将一个输入向量 X1 定义为 [0; 0.2]。

输出 Y 指示哪个神经元正在响应,从而指示输入属于哪个类。

x1 = [0; 0.2];
y = net(x1)
y = 8×1

     0
     1
     0
     0
     0
     0
     0
     0