老饼讲解:一步一步上手学习
LVQ学习矢量量化(Learning Vector Quantization)是1988年提出的一种用来解决样本分类问题的神经网络,它的特点是通过初始化多个矢量来作为各类别的中心,再通过样本来让这些矢量中心学习到更好的位置,最后通过竞争来判别样本属于哪个类别,好了,下面就让我们更正式的详细看看LVQ神经网络是怎么一回事吧!
LVQ神经网络主要用来解决样本分类的问题,也就是判断样本是哪个类别。我们先不急着讲LVQ神经网络,我们先来看看它的思想和意图,然后再正式看看LVQ神经网络,这样理解起来会比较轻松。
好了,我们都知道LVQ神经网络就是对样本分类,那它是怎么解决样本分类问题的呢,先来上个图:

如图所示,LVQ先对每个类别都初始化一些判别中心,每个判别中心的背后都代表一个类别,然后通过训练来调整这些判别中心的位置,使得判别中心能较好地识别训练样本的所属类别, 这样,来了新样本,只要判断新样本离哪个判别中心最近,就认为样本属于该判别中心的类别。
知道了LVQ的思想,那就容易理解LVQ神经网络了,LVQ神经网络的拓扑结构如下:

好了,我们一起来解读一下LVQ神经网络的结构,说说图中每一块分别是什么意思。
首先,输入层就是我们的输入,然后隐层的隐节点就代表着各个判别中心,而输入与隐节点的连接权重W,就是判别中心的位置,隐节点的值呢,就代表着输入x是不是归属于该隐节点(也就是x是不是离该判别中心最近),用数学来表示,隐节点的值就是:
这个公式的大概意思是,先计算x与各个判别中心的距离,然后取反后进行compet,compet(竞争)是指向量中哪个值最大,就取为1,其余为0,所以最终,h是一个one-hot向量,它只有与x最小的隐节点的取值为1,其余为0。这公式大概看一下有个印象就好了,下面会用例子来具体解说,看完例子就会完全理解它了。
再来看看隐层到输出层的部分,输出层每个节点代表着一种类别,而每个隐节点(也就是判别中心)只与一个输出节点连接,也就是隐节点连接哪个输出节点,就代表着这个隐节点(判别中心)属于哪一个类别,用数学来表示,则是:
其中,h是隐层的输出,它是一个one-hot向量,则是输出层的权重,时,代表第i个输出与第j个隐节点有连接,时,就代表无连接。
好了,直接来看一个LVQ神经网络的计算例子,就会非常具体了。
以 为例
(1) 计算与各个判别中心的负距离
(2) 计算哪个判别中心胜出
(3)计算输出
摸清楚了LVQ神经网络的结构,也知道它用来干什么,那下面就可以开始来看看它是怎么训练的。
首先,LVQ的训练,只需要训练隐层权重W(也就是各个判别中心的位置)就可以了,而输出层的权重,它是不需要训练的,因为它就代表隐节点(判别中心)与输出节点(类别)的对应关系,所以只要从一开始就设置好就可以了。例如共有10个隐节点,然后设定好这10个隐节点分别与哪个输出节点连接就好了。

所以,LVQ的训练主要是训练隐层权重W,也就是训练各个判别中心的位置,而LVQ模型对的训练方法有两种:LVQ1规则与LVQ2规则,其中LVQ2是LVQ1的改进。
LVQ1规则和LVQ2规则都是使用逐样本更新的方法来训练LVQ,它每次只用一个样本来调整判别中心的位置,我们先来说LVQ1训练方法,LVQ1规则较为简单,它根据预测的准确性来更新隐节点,如下:

如图所示,如果样本预测正确,就将当前胜出的判别中心往样本靠近,否则远离样本,LVQ1规则就只是这么简单,好了,如果用公式来表述,那么LVQ1规则就是如下的更新公式:
其中,lr是学习率,w则是指竞争胜出的隐神经元与输入所连接的权重,也就是竞争胜出的判别中心的位置。
接下来我们再看一下LVQ2规则,其实LVQ2规则是LVQ1的改进,也可以当作是补丁,它主要解决LVQ1训练后,可能会有些样本属于中心A,又差不多属于B的问题:

如图所示,虽然对训练样本的判别没问题,但“界限”不够清晰,会影响实际预测效果,所以就引入了LVQ2规则,来使样本点尽量更“清晰”地划分于某一个判别中心。
在讲述LVQ2规则前,我们先对相关符号进行说明
** 符号说明
:离样本最近的判别中心(即所竞争成功的隐节点)
:离样本次近的判别中心
:分别代表样本到的距离
好了,下面我们来继续说LVQ2规则。
LVQ2规则是指:如果 ,则对判别中心作如下更新:
上式的意义为"d1和d2差别不大,其中 一般取0.25,此时s=0.6

如果判别中心k1、k2对样本类别的判断准确 ,则将k1靠近样本,将k2远离样本
如果判别中心k1、k2对样本类别的判断不准确,则将k2往样本靠近,k1远离样本
用数学表述则为:
相比于LVQ1,LVQ2考虑了次近节点的位置,使界限更为清晰。
下面我们借用matlab工具箱,来实现一个LVQ神经网络,来对样本进行分类。
闲话少说,直接上代码,LVQ代码实现例子,如下:
% 本代码展示如何用matlab工具箱训练一个LVQ神经网络
% 本代码来自《老饼讲解神经网络》www.bbblearn.com ,matlab版本:2018a
% ----数据准备--------
clear all ;close all
rand('seed',70)
P = [-3 -2 -2 0 0.5 -0.5 0 +2 +2 +3; ...
0 +1 -1 +2 +1 -1 -2 +1 -1 0]; % 输入数据
Tc = [1 1 1 2 2 2 2 1 1 1]; % 输出类别
T = ind2vec(Tc); % 将输出转为one-hot编码(代表类别的01向量)
% -----网络训练---------
net = newlvq(P,4,[0.5 ,0.5],0.01,'learnlv1'); % 初始化LVQ神经网络,共设4个隐节点,按0.5,0.5分配给两个类别
net = train(net,P,T); % 训练神经网络
Y = sim(net,P); % 预测(one-hot形式)
Yc = vec2ind(Y); % 将one-hot编码形式转回类别编号形式
% 提取出各个类别的判别中心
W1 = net.iw{1,1}; % 判别中心W1
W2 = net.lw{2,1}; % 判别中心的类别W2
% -------打印结果-----------------
disp('判别中心W1:') % 打印
W1 % 打印类别中心判别中心W1
disp('判别中心的类别W2:') % 打印
W2 % 打印判别中心的类别W2
disp('样本的真实标签Tc:') % 打印
Tc % 打印样本的真实标签
disp('样本的预测标签Yc:') % 打印
Yc % 打印样本的预测标签代码运行结果如下:

从结果可以看到,模型的预测标签与真实标签一致,成功地对样本的类别进行判别。
LVQ神经网络就是一种用来做分类的模型,它对每个类别都初始化一些判别中心,然后通过训练来调整这些判别中心的位置,使得判别中心能较好地识别训练样本的所属类别,LVQ的训练可以使用LVQ1或LVQ2规则,也可以先用LVQ1训练一下,再用LVQ2继续训练。
评论