神经网络用于模式识别:螃蟹识别

原文来于老饼|BP神经网络icon-default.png?t=N7T8https://www.bbbdata.com/text/702

模式识别主要解决分类问题,由于分类问题的输出是离散的,而曲线拟合的输出是连续的,因此分类问题的解决方案会与曲线拟合问题的解决方案存在一些差异。

模式识别的输出

差异关键在于输出:
在神经网络模式识别中,我们不会以 1 2 3 4 5..这样的序列号来表示我们的输出,
一般会用 0 1向量来表示输出。例如一共有三个种类,则 用[0 1 0 ]表示它属于第二类。

备注:
模式识别中不用 1 2 3…12这样的序列作为网络的输出,是因为类别与类别之间并不存在数量的大小关系,直接把类别标为1 2 3 ..12的话,计算误差时会受1 2 3 ..12的数量大小关系的影响。
例如一个属于类别10的样本在网络中被预测为类别2的时候,会被认为误差很大,而它输出9的时候会被认为误差比较小,实际 上输出9和输出2都是完全判断错误的,但会导致网络误差估计不准确,影响网络的训练


模式识别网络拓扑

模式识别可以用通用的神经网络来建立,但matlab神经网络工具箱提供专门的模式识别神经网络模型Patternnet来处理这类问题。

Patternnet网络的拓扑大概如下图:

备注:
Patternnet与标准的神经网络不同之处在于,网络的输出层传递函数不是purelin,而是tansig,而且输出会归一到[0,1]。
另一方面,matlab采取的默认训练函数也不一样,用的是量化共轭梯度法trainscg.

实例

2012B版本中自带螃蟹识别例子R2012b\toolbox\nnet\nndemos\classify_crab_demo.m是一个很好的学习神经网络模式识别的例子,

输入输出数据截图如下:

下面是作者简化改编后的代码:

%请在2012B运行,其它版本的matlab未确定是否能够顺利运行。
load crab_dataset
x = crabInputs; 
t = crabTargets;

setdemorandstream(491218382);%指定随机种子,这样每次训练出来的网络都一样。 

net = patternnet(10);              % 建立模式识别网络,隐层设为10个
[net,tr] = train(net,x,t);            % 将数据放到网络中训练
plotperform(tr)              % 画出训练记录

%%用检验数据检验网络的正确率
testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

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

%% 画出混淆矩阵,并计算正确率
plotconfusion(testT,testY)
[c,cm] = confusion(testT,testY)  %计算混淆矩阵

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
figure

plotroc(testT,testY)

运行程序后可以得到训练好的net,
假如输入是X=[1 2 5 8 10 12]’;
可以使用Y=net(X);
来得到形如Y=[0 1]格式的输出,这样就知道它是第2类。

提示:可借助vec2ind函数将 [0 1 ] 转为数字2.

结果解读
至于怎么提取网络的表达式,和网络的使用,在这里不再重复讲述。请有兴趣的同学参考其它文章。
值得一提的是运行后得到的混淆矩阵,这里加上我的注解。

从混淆矩阵图中清晰看到分类的准确性。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值