螃蟹的分类

这个例子的目的是根据螃蟹的品种、背壳的长宽等等属性来判断螃蟹的性别,雄性还是雌性。

训练数据一共有六个属性:

  species, frontallip, rearwidth, length, width and depth.

这里每个属性所对应的是螃蟹哪一部分的真实性状并不是关键。我们关心的只是已知样本是6维的向量,输出是0/1值,

求分类效果最好的网络模型。

 

首先载入样本数据

[x,t] = crab_dataset;
% size(x) = [6, 200];
% size(t) = [2, 200];

然后初始化神经网络

例子里使用含有一层隐含层的模型,隐含层有10个神经元。调用Matlab的patternnet()函数。

net = patternnet(10);
view(net)
----------------------------

patternnet()函数的参数有(hiddenSizes,trainFcn,performFcn)三个。hiddenSizes默认值是10,可以用数组表示多个隐含层。trainFcn默认值是'trainscg',Performance function默认值是'crossentropy'。如果想要有两个隐含层,每层的神经元都是10个,则可以写成

net = patternnet([10,10]);

接下去是训练网络。把网络模型、训练样本和测试样本作为参数传入train()函数。系统自动将数据分为training和validation.

[net,tr] = train(net,x,t);
nntraintool
--------------------------

可以在窗口点击Performance或者调用PLOTPERFORM查看训练的过程。

plotperform(tr)
------------------------

测试分类器

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testIndices = vec2ind(testY);

plotconfusion(testT,testY);

下图表示的是分类器的效果。绿色表示分类器的分类结果和测试数据的label一致,红色表示两者结果不一致。红色区域内的百分数越小,说明分类器结果的误差越小,分类结果越好。如果误差过大,则需要增加样本进再行训练或者增加隐含层的神经元个数。