[数学建模(四)]MATLAB神经网络工具箱的简单应用

问题:蠓虫分类问题

1 问题描述

蠓虫分类问题可概括叙述如下:生物学家试图对两种蠓虫(Af 与Apf)进行鉴别,依据的资料是触角和翅膀的长度,已经测得了9 只Af 和6 只Apf 的数据如下:

 Af: (1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),(1.48,1.82),(1.54,1.82),(1.56,2.08).

Apf: (1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
现在的问题是:
(i)根据如上资料,如何制定一种方法,正确地区分两类蠓虫。
(ii)对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的3 个标本,用所得
到的方法加以识别。

已知的蠓虫数据分布如图(圆圈为Apf类,六角为Af,米字型为未知型)

2.MATLAB 实现

clear
p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90;1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08];  %Af
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00;1.28,2.00;1.30,1.96];                                %Apf
p=[p1;p2]';
pr=minmax(p);
goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)]; %p1类为1;p2类为0
x=[1.24 1.80;1.28 1.84;1.40 2.04];

for i=1:9
plot(p1(i,1),p1(i,2),'h')
hold on
end

for i=1:6
plot(p2(i,1),p2(i,2),'o');
end

for i=1:3
plot(x(i,1),x(i,2),'*')
text (x(i,1),x(i,2),'?');
end

%Rx2的矩阵以定义R个输入向量的最小值和最大值;设定每层神经元个数的数组
net=newff(pr,[3,2],{'logsig','logsig'});
net.trainParam.show = 10; % 训练显示间隔
net.trainParam.lr = 0.05; %学习步长
net.trainParam.goal = 1e-10; %最小均方误差
net.trainParam.epochs = 50000; %最大训练次数
net = train(net,p,goal); %训练神经网络
y0=sim(net,p); %对已知的数据进行验证
x=x';
y=sim(net,x); %对未知的数据进行分类

 3 结果

目标标签设置

goal =

1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1

已知数据训练后:

y0 =

1 至 10 列                                                                                                         11 至 15 列

0.9999 0.9999 0.9999 0.9998 0.9995 0.9999 0.9999 0.9999 0.9999 0.0001 0.0001 0.0001 0.0001 0.0002 0.0006
0.0001 0.0001 0.0001 0.0002 0.0005 0.0001 0.0001 0.0001 0.0001 0.9999 0.9999 0.9999 0.9999 0.9998 0.9994

未知数据分类: 

y =

0.0004 0.0036 0.9899
0.9996 0.9964 0.0101

从结果可知:(1.24,1.80),(1.28,1.84)属于Apf,(1.40,2.04)属于Af

4 工具箱界面简介

更具体的介绍详见:http://blog.csdn.net/q1302182594/article/details/8790613

神经网络训练参数说明:http://blog.sina.com.cn/s/blog_5c9288aa0101gsu2.html

5 拓展

可以通过蒙卡特罗法产生大量数据点,通过神经网络进行分类。

因为有一些数据点分布在神经网络的分界面附近,因此可以大约知道分界面的位置。

N=1000;
k1 = 1.1 + (1.6-1.1).*rand(1,N);
k2 = 1.2 + (2.1-1.2).*rand(1,N);
z=[k1;k2];
z1=sim(net,z);
for i=1:1000
    if z1(1,i)<0.5
         plot(z(1,i),z(2,i),'o');
            hold on
    end
    
    if z1(1,i)>0.5
         plot(z(1,i),z(2,i),'h');
    end
end

6.非监督学习

clear
p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90; 1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08];
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00; 1.28,2.00;1.30,1.96];
p=[p1;p2]'
pr=minmax(p)
goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)]
net = newlvq(pr,4,[0.6,0.4])
net = train(net,p,goal)
Y = sim(net,p)
x=[1.24 1.80;1.28 1.84;1.40 2.04]'
sim(net,x)
原文地址:https://www.cnblogs.com/youngsea/p/7471732.html