自组织竞争神经网络工具箱函数神经网络十五
Posted 张叔zhangshu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自组织竞争神经网络工具箱函数神经网络十五相关的知识,希望对你有一定的参考价值。
创建函数
MATLAB神经网络工具箱提供了几个用于实现自组织竞争神经网络创建的函数,下面展开介绍。
1)newc
函数
newc函数用于创建一个竞争神经网络,在MATLAB R2014b版本中被competlayer函数替代。newc函数的调用格式如下:
net=newc(range,class,klr,clr)
其中,class是数据类别个数,也是竞争层神经元的个数;klr和clr分别表示网络的权值学习率与阈值学习率。竞争神经网络在训练时不需要目标输出,网络通过对数据分布特性的学习,自动将数据划分为指定类别数。返回参数net是一个新的竞争层。该网络采用negdist作为权值函数,netsum作为网络输入函数,以及compet作为传递函数。除了权值,该网络还包含一个阈值,权值和阈值使用midpoint函数与initcon函数进行初始化。网络的训练函数有trainr函数和trains函数,两者都使用learnk函数和learncon函数进行学习。
利用newc函数创建一个竞争神经网络,并进行仿真。
程序实现代码如下:
>> clear all;
%定义输入变量
P=[0.1 0.6 0.2 0.9;0.1 0.9 0.3 0.8];
%创建自组织竞争神经网络
net=newc(P,2);
%训练神经网络
net=train(net,P);
%网络仿真
Y=sim(net,P)
YC=vec2ind(Y) %输出结果
运行程序,输出结果如下:
Y =
0 1 0 1
1 0 1 0
YC =
2 1 2 1
2)competlayer函数
competlayer函数用于创建一个竞争层神经网络,它根据输入样本之间的相似性对其进行分类,分类的类别数是给定的。该函数总是倾向于给每个类别分配相同数量的样本,尽量均衡地进行分配。competlayer函数的调用格式如下:
competlayer(numClasses,kohonenLR,conscienceLR)
其中,输入参数numClasses为分类的类别数;kohonenLR为Kohonen学习率;conscienceLR为“良心”学习率,即阈值学习规则的学习率。
由于在competlayer函数的输入参数中未给出关于网络结构的足够信息,因此无法确定输入神经元的个数。这一参数被推迟到训练时才确定,在调用train函数进行训练时,参数中给出了训练样本,因此也就给出了样本向量的维数。
利用competlayer函数创建竞争神经网络,并将给定的数据分类。
程序实现代码如下:
>> clear all;
inputs = iris_dataset; %载入MATLAB自带的鸢尾花数据
net = competlayer(6); %创建竞争层,将数据分为6类
net = train(net,inputs);
view(net) %显示网络图
outputs = net(inputs)
classes = vec2ind(outputs)
3)newsom函数
newsom函数用于创建一个SOM神经网络,在MATLAB R2014b版本中被selforgmap函数代替。newsom函数的调用格式如下:
net=newsom(PR,[d1,d2, …],tfcn,dfcn,olr,osteps,tlr,tns)
其中,输入参数PR为R个输入元素的最大值和最小值的设定值,是R×2维的矩阵;di为第i层的维数,默认值为[5,8];tfcn为拓扑函数(即结构函数),默认为hextop函数;dfcn为距离函数,默认为linkdist函数;olr为分类阶段学习率,默认值为0.9;osteps为分类阶段的步长,默认值为1000;tlr为调谐阶段的学习率,默认值为0.02;tns为调谐阶段的邻域距离,默认值为1;输出参数net为生成的SOM神经网络。
【例8-6】利用newsom函数创建一个SOM神经网络,并进行仿真。
程序实现代码如下:
>> clear all;
net = newsom([0 2; 0 1],[2 3]); %创建一个SOM神经网络
P = [.1 .3 1.2 1.1 1.8 1.7 .1 .3 1.2 1.1 1.8 1.7;... %分类数目
0.2 0.1 0.3 0.1 0.3 0.2 1.8 1.8 1.9 1.9 1.7 1.8];
net=train(net,P);
a=sim(net,P)
4)selforgmap函数
selforgmap函数利用数据本身的相似性和拓扑结构对数据进行聚类,函数的调用格式如下:
selforgmap(dimensions,coverSteps,initNeighbor,topologyFcn,distanceFcn)
其中,参数dimensions为一个表示拓扑结构的行向量,如[8,8]表示8×8二维结构;coverSteps为训练次数;initNeighbor为邻域大小的初始值;topologyFcn表示拓扑函数的字符串,可选值有hextop、gridtop、randtop等;distanceFcn表示距离函数的字符串,可选值有boxdist、dist、lindist和mandist等。
【例8-7】利用selforgmap函数创建SOM神经网络,并对数据进行分类。
程序实现代码如下:
>> clear all;
x = simplecluster_dataset; %载入自带的数据
net = selforgmap([8 8]); %创建SOM神经网络
net = train(net,x);
view(net)
y = net(x);
classes = vec2ind(y);
5)newlvq函数
newlvq函数用于创建LVQ神经网络,在MATLAB R2014b版本后被lvqnet函数替代。newlvq函数的调用格式如下:
net = newlvq(PR,S1,PC,LR,LF)
其中,输入参数PR为一个R×2维的输入矩阵,它决定了输入向量的最小值和最大值的取值范围,R为输入向量的个数;S1表示隐含层神经元的数目;PC表示在第二层的权值中列所属类别的百分比;LR表示学习率,默认值为0.01;LF表示学习函数,默认值为learnlvq;输出参数net为生成的LVQ神经网络。
【例8-8】利用newlvq函数创建LVQ神经网络,计算权值并进行仿真。
程序实现代码如下:
>> clear all;
P = [-2 -3 -1 0 0 1 0 1 2 3; 0 1 -2 1 2 -1 -2 1 -1 0]; %样本数据
Tc = [1 1 2 2 2 2 1 1 1 1]; %目标数据
T = ind2vec(Tc);
targets = full(T) %用满矩阵表示
net = newlvq(P,4,[.6 .4]); %创建LVQ神经网络
net=train(net,P,T); %训练
disp('LVQ神经网络第一层权值:')
net.IW{1,1} %LVQ神经网络第一层权值
disp('LVQ神经网络第二层权值:')
net.LW{2,1} %LVQ神经网络第二层权值
Y = sim(net,P)
6)lvqnet函数
lvqnet是LVQ神经网络的创建函数,用于解决有监督的分类问题,函数的调用格式如下:
lvqnet(hiddenSize,lvqLR,lvqLF)
其中,参数hiddenSize为竞争层神经元节点个数,lvqLR为学习率,lvqLF为学习函数。
在创建完的网络中,输入层、输出层神经元的个数均为0。当调用train函数进行训练时,才由给定的训练样本得到。
【例8-9】使用lvqnet函数创建LVQ神经网络,然后利用LVQ神经网络对鸢尾花数据进行分类。
程序实现代码如下:
>> clear all;
[x,t] = iris_dataset; %加载数据,x为输入样本,t为期望输出
net = lvqnet(10);
net.trainParam.epochs = 50;
net = train(net,x,t);
view(net)
y = net(x);
perf = perform(net,y,t)
classes = vec2ind(y);
学习函数
learnk
函数的调用格式如下:
[dW,LS] = learnk(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
【例8-10】利用learnk函数对给定的目标矩阵及学习率进行学习。
程序实现代码如下:
>> clear all;
p = rand(2,1); %输入矩阵
a = rand(3,1); %输出矩阵
w = rand(3,2); %权值矩阵
lp.lr = 0.5; %学习率
dW = learnk(w,p,[],[],a,[],[],[],[],[],lp,[]) %计算权值变化矩阵
运行程序,输出结果如下:
dW =
0.3586 -0.0259
0.2681 -0.0295
0.1339 0.3741
在训练过程中,学习率和邻域距离nd是不断变化的。排序阶段是按lp.order_steps所确定的次数反复运行的,学习率从lp.order_lr逐渐下降到lp.tune_lr,nd值从最大神经元距离下降到1。在调整阶段,学习率从lp.tune_lr继续缓慢减小,而nd总保持lp.tune_nd值不变。
【例8-15】利用learnsom
函数对给定的矩阵及学习参数进行权值计算。
程序实现代码如下:
>> clear all;
p = rand(2,1); %权值矩阵
a = rand(6,1); %输入矩阵
w = rand(6,2); %输出矩阵
pos = hextop(2,3); %六边形拓扑函数
d = linkdist(pos); %newsom函数默认的距离
%学习参数的设置
lp.order_lr = 0.9;
lp.order_steps = 1000;
lp.tune_lr = 0.02;
lp.tune_nd = 1;
%计算权值变化
ls = [];
[dW,ls] = learnsom(w,p,[],[],a,[],[],[],[],d,lp,ls)
7)learnlv1函数
learnlv1是LVQ1算法对应的权值学习函数,函数的调用格式如下:
[dW,LS] = learnlv1(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
其中,输出参数dW为权值(或阈值)变化矩阵;LS为当前学习状态(可以省略)。输入参数W为权值矩阵或阈值矢量;P为输入矢量或全为1的矢量;Z为输入层的权值矢量(可以省略);N为网络的输入矢量(可以省略);A为网络的输出矢量;T为目标输出矢量(可以省略);E为误差矢量(可以省略);gW为与性能相关的权值梯度矩阵(可以省略);gA为与性能相关的输出梯度矩阵;D为神经元的距离矩阵;LP为学习参数,默认值为0.01;LS为初始学习状态。
info = learnlv1(‘code’)
根据不同的code值返回不同的相关信息。当code=pnames时,返回学习参数的名称;当code=pdefaults时,返回默认的学习参数;当code=neegd时,如果函数使用了gW或gA,则返回1。
【例8-16】利用给出的随机矩阵,用LVQ1
算法进行学习。
程序实现代码如下:
>> clear all;
p = rand(4,1);
w = rand(3,4);
a = compet(negdist(w,p));
gA = [-1;1; 1]; %与性能相关的输出梯度
lp.lr = 0.45; %学习率
dW = learnlv1(w,p,[],[],a,[],[],[],gA,[],lp,[])
8)learnlv2函数
learnlv2
是LVQ2算法对应的权值学习函数,函数的调用格式如下:
[dW,LS] = learnlv2(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
info = learnlv2(‘code’)
learnlv2函数各参数的含义可参见learnlv1函数。
同样,在learnlv2函数的学习过程中,也需要设置学习率和窗口大小:lp.lr表示学习率,默认值为0.01;lp.window表示窗口大小,取值范围为0~1,通常为0.2~0.3,默认值为0.25。
【例8-17】利用给出的随机矩阵,用LVQ2算法进行学习。
程序实现代码如下:
>> clear all;
p = rand(4,1); %权值矩阵
w = rand(3,4); %输入矩阵
n=dist(w,p); %距离矩阵
a=compet(n); %转换神经网络
gA=[-1;1;1]; %与性能相关的输出梯度
lp.lr=0.001; %学习率
lp.window=0.25; %给定窗口的大小
dw=learnlv2(w,p,[],n,a,[],[],[],gA,[],lp,[])
初始化函数
MATLAB神经网络工具箱提供的midpoint函数可以实现把权值初始化为输入向量的值域中心。midpoint函数的调用格式如下:
W = midpoint
(S,PR)
其中,参数S为神经元的数目;PR为输入向量取值范围的矩阵;W为函数返回权值矩阵。
【例8-22】输入神经元数目及取值范围,求其权值初始化矩阵。
程序实现代码如下:
>> clear all;
>> W = midpoint(5,[1 1; -1 2]) %输入矩阵范围,神经元的数组为5个
运行程序,输出结果如下:
W =
1.0000 0.5000
1.0000 0.5000
1.0000 0.5000
1.0000 0.5000
1.0000 0.5000
以上是关于自组织竞争神经网络工具箱函数神经网络十五的主要内容,如果未能解决你的问题,请参考以下文章