1.案例背景
1.1 LVQ 神经网络概述
学习向量量化(Learning Vector Quantization,LVQ)神经网络是一种用于训练竞争层的有监督学习(supervisedlearning)方法的输人前向神经网络,其算法是从Kohonen竞争算法演化而来的。LVQ神经网络在模式识别和优化领域有着广泛的应用。
1)LVQ神经网络的结构
LVQ神经网络由3层神经元组成,即输入层、竞争层和线性输出层,如图26-1所示。输人层与竞争层之间采用全连接的方式,竞争层与线性输出层之间采用部分连接的方式。竞争层神经元个数总是大于线性输出层神经元个数,每个竞争层神经元只与一个线性输出层神经元相连接且连接权值恒为1。但是,每个线性输出层神经元可以与多个竞争层神经元相连接。竞争层神经元与线性输出层神经元的值只能是1或0。当某个输人模式被送至网络时,与输人模式距离最近的竞争层神经元被激活,神经元的状态为“1”,而其他竞争层神经元的状态均为“0”。因此,与被激活神经元相连接的线性输出层神经元状态也为“1”,而其他线性输出层神经元的状态均为“0”。
元的输出。
2)LVQ神经网络的学习算法
LVQ神经网络算法是在有教师状态下对竞争层进行训练的一种学习算法,因此 LVQ算法可以认为是把自组织特征映射算法改良成有教师学习的算法。LVQ神经网络算法可分为LVQ1算法和LVQ2算法两种。
(1) LVQ 1算法
向量量化是利用输人向量的固有结构进行数据压缩的技术,学习向量量化是在向量量化基础上能将输人向量分类的监督学习技术。Kohonen把自组织特征映射算法改良成有教师学习算法,首先设计了LVQ 1算法。LVQ 1的训练过程开始于随机地自“标定”训练集合选择一个输人向量以及该向量的正确类别。
LVQ 1算法的基本思想是:计算距离输人向量最近的竞争层神经元,从而找到与之相连接的线性输出层神经元,若输人向量的类别与线性输出层神经元所对应的类别--致,则对应的竞争层神经元权值沿着输人向量的方向移动;反之,若两者的类别不一致,则对应的竞争层神经元权值沿着输入向量的反方向移动。基本的LVQ1算法的步骤为:
(2) LVQ2算法
在LVQ1算法中,只有一个神经元可以获胜,即只有一个神经元的权值可以得到更新调整。为了提高分类的正确率,Kohonen改进了LVQ1,并且被称为新版本LVQ2。LVQ2算法基于光滑的移动决策边界逼近Bayes极限。LVQ 2版本接着被修改,产生LVQ 2. 1,并且最终发展为LVQ 3。这些后来的LVQ版本的共同特点是引入了“次获胜”神经元,获胜神经元的权值向量和“次获胜"神经元的权值向量都被更新。具体计算步骤如下:
3)LVQ神经网络特点
竞争层神经网络可以自动学习对输人向量模式的分类,但是竞争层进行的分类只取决于输入向量之间的距离,当两个输人向量非常接近时,竞争层就可能将它们归为一-类。在竞争层:的设计中没有这样的机制,即严格地判断任意的两个输人向量是属于同一类还是属于不同类。而对于LVQ网络用户指定目标分类结果,网络可以通过监督学习完成对输人向量模式的准确分类。
与其他模式识别和映射方式相比,LVQ神经网络的优点在于网络结构简单,只通过内部单元的相互作用就可以完成十分复杂的分类处理,也很容易将设计域中的各种繁杂分散的设计条件收敛到结论上来。而且它不需要对输人向量进行归一化、正交化处理,只需要直接计算输入向量与竞争层之间的距离,从而实现模式识别,因此简单易行。
1.2 乳腺肿瘤诊断概述
目前,乳腺癌已成为世界上妇女发病率最高的癌症。近年来在中国,尤其在相对比较发达的东部地区,乳腺癌的发病率及死亡率呈明显的增长趋势。研究表明,乳腺恶性肿瘤若能早期发现、早期诊断、早期治疗,可取得良好的效果。过去的20年里,人们在分析和诊断各种乳腺肿瘤方面发现了很多方法,尤其是针对乳腺图像的分析已日趋成熟。医学研究发现,乳腺肿瘤病灶组织的细胞核显微图像与正常组织的细胞核显微图像不同,但是用一般的图像处理方法很难对其进行区分。因此,运用科学的方法,根据乳腺肿瘤病灶组织的细胞核显微图像对乳腺肿瘤属于良性或恶性进行诊断显得尤为重要。
威斯康辛大学医学院经过多年的收集和整理,建立了一个乳腺肿瘤病灶组织的细胞核显微图像数据库。数据库中包含了细胞核图像的10个量化特征(细胞核半径、质地、周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度),这些特征与肿瘤的性质有密切的关系。因此,需要建立-一个确定的模型来描述数据库中各个量化特征与肿瘤性质的关系,从而可以根据细胞核显微图像的量化特征诊断乳腺肿瘤是良性还是恶性的。
2.模型建立
2.1 设计恩路
将乳腺肿瘤病灶组织的细胞核显微图像的10个量化特征作为网络的输人,良性乳腺肿瘤
和恶性乳腺肿瘤作为网络的输出。用训练集数据对设计的LVQ神经网络进行训练,然后对
测试集数据进行测试并对测试结果进行分析。
2.2 设计步骤
根据上述设计思路,设计步骤主要包括以下几个,如图26-2所示。
1)数据采集
威斯康辛大学医学院的乳腺癌数据集共包括569个病例,其中,良性357例,恶性212例。本书随机选取500组数据作为训练集,剩余69组作为测试集。每个病例的一组数据包括采样组织中各细胞核的10个特征量的平均值、标准差和最坏值(各特征的3个最大数据的平均值)共30个数据。数据文件中每组数据共分32个字段,第1个字段为病例编号;第2个字段为确诊结果,B为良性,M为恶性;第3~12个字段是该病例肿瘤病灶组织的各细胞核显微图像的10个量化特征的平均值;第13~22个字段是相应的标准差;第23~32个字段是相应的最坏值。
2)网络创建
数据采集完成后,利用MATLAB自带的神经网络工具箱中的函数newlvq()可以构建一个LVQ神经网络,函数具体用法将在第3节中详细介绍。
3)网络训练
网络创建完毕后,若需要,还可以对神经网络的参数进行设置和修改。将训练集500个病例的数据输入网络,便可以对网络进行训练。
4)网络仿真
网络通过训练后,将测试集69组的10个量化特征数据输人网络,便可以得到对应的输出(即分类)。
5)结果分析.
通过对网络仿真结果的分析,可以得到误诊率(包括良性被误诊为恶性及恶性被误诊为良性),从而可以对该方法的可行性进行评价。同时,可以与其他方法进行比较,探讨该方法的有效性。
3.LVQ 网络的神经网络工具箱函数
MATLAB的神经网络工具箱为LVQ神经网络提供了大量的函数工具,本节将详细介绍这些函数的功能、调用格式和注意事项等问题。
3.1LVQ网络创建函数
newlvq()函数用于创建一一个学习向量量化LVQ网络,其调用格式为:
net = newlvq(PR,S1, PC,LR,LE)
其中,PR为输人向量的范围,size(PR)=[R 2],R为输人向量的维数;S1为竞争层神经元的个数;PC为线性输出层期望类别各自所占的比重;LR为学习速率,默认值为0.01;LF为学习函数,默认为“learnlv1"。
3.2LVQ网络学习函数
1) LVQ 1学习算法
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为初始学习状态。
2) LVQ2学习算法
learnlv2是LVQ2算法对应的权值学习函数,其调用格式为:
[dw,ls] = learnlv2(W,P,Z,N,A,T, E,gW,gA,D,LP,LS)
其参数意义与learnlv1中的参数意义相同,只是权值调整的方法不同,此处不再赘述。
4.MATLAB 实现
利用MATLAB神经网络工具箱提供的函数可以方便地在MATLAB环境下实现上述步骤。
%% LVQ神经网络的分类——乳腺肿瘤诊断
%% 清空环境变量
clear all
clc
warning off
%% 导入数据
load data.mat
a = randperm(569);
Train = data(a(1:500),:);
Test = data(a(501:end),:);
% 训练数据
P_train = Train(:,3:end)';
Tc_train = Train(:,2)';
T_train = ind2vec(Tc_train);
% 测试数据
P_test = Test(:,3:end)';
Tc_test = Test(:,2)';
%% 创建网络
count_B = length(find(Tc_train == 1));
count_M = length(find(Tc_train == 2));
rate_B = count_B/500;
rate_M = count_M/500;
net = newlvq(minmax(P_train),20,[rate_B rate_M],0.01,'learnlv1');
% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.show = 10;
net.trainParam.lr = 0.1;
net.trainParam.goal = 0.1;
%% 训练网络
net = train(net,P_train,T_train);
%% 仿真测试
T_sim = sim(net,P_test);
Tc_sim = vec2ind(T_sim);
result = [Tc_sim;Tc_test]
%% 结果显示
total_B = length(find(data(:,2) == 1));
total_M = length(find(data(:,2) == 2));
number_B = length(find(Tc_test == 1));
number_M = length(find(Tc_test == 2));
number_B_sim = length(find(Tc_sim == 1 & Tc_test == 1));
number_M_sim = length(find(Tc_sim == 2 &Tc_test == 2));
disp(['病例总数:' num2str(569)...
' 良性:' num2str(total_B)...
' 恶性:' num2str(total_M)]);
disp(['训练集病例总数:' num2str(500)...
' 良性:' num2str(count_B)...
' 恶性:' num2str(count_M)]);
disp(['测试集病例总数:' num2str(69)...
' 良性:' num2str(number_B)...
' 恶性:' num2str(number_M)]);
disp(['良性乳腺肿瘤确诊:' num2str(number_B_sim)...
' 误诊:' num2str(number_B - number_B_sim)...
' 确诊率p1=' num2str(number_B_sim/number_B*100) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...
' 误诊:' num2str(number_M - number_M_sim)...
' 确诊率p2=' num2str(number_M_sim/number_M*100) '%']);
某次运行神经网络训练测试的结果如下:
病例总数:569 良性:357 恶性 :212
训练集病例总数:500 良性:312 恶性 :188
测试集病例总数:69 良性:45 恶性:24
良性乳腺肿瘤确诊:43 误诊:2 确诊率 p1= 95.5556%
恶性乳腺肿瘤确诊:20 误诊:4 确诊率 p2= 83.3333%
从上述结果可以看出,在69组测试集数据中,有6组数据误诊断(2组将良性乳腺肿瘤误诊为恶性乳腺肿瘤,4组将恶性乳腺肿瘤误诊为良性乳腺肿瘤),平均诊断正确率达91. 3%(63/69)。实验结果表明,将LVQ神经网络应用于模式识别是可行的。
5.案例拓展
%% BP神经网络的分类——乳腺肿瘤诊断
%% 创建网络
net = newff(minmax(P_train),[50 1],{'tansig','purelin'},'trainlm');
%% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.show = 10;
net.trainParam.lr = 0.1;
net.trainParam.goal = 0.1;
%% 训练网络
net = train(net,P_train,Tc_train);
%% 仿真测试
T_sim = sim(net,P_test);
for i = 1:length(T_sim)
if T_sim(i) <= 1.5
T_sim(i) = 1;
else
T_sim(i) = 2;
end
end
result = [T_sim;Tc_test]
number_B = length(find(Tc_test == 1));
number_M = length(find(Tc_test == 2));
number_B_sim = length(find(T_sim == 1 & Tc_test == 1));
number_M_sim = length(find(T_sim == 2 &Tc_test == 2));
disp(['病例总数:' num2str(569)...
' 良性:' num2str(total_B)...
' 恶性:' num2str(total_M)]);
disp(['训练集病例总数:' num2str(500)...
' 良性:' num2str(count_B)...
' 恶性:' num2str(count_M)]);
disp(['测试集病例总数:' num2str(69)...
' 良性:' num2str(number_B)...
' 恶性:' num2str(number_M)]);
disp(['良性乳腺肿瘤确诊:' num2str(number_B_sim)...
' 误诊:' num2str(number_B - number_B_sim)...
' 确诊率p1=' num2str(number_B_sim/number_B*100) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...
' 误诊:' num2str(number_M - number_M_sim)...
' 确诊率p2=' num2str(number_M_sim/number_M*100) '%']);
说明:由于BP网络输出非二值结果,因此程序中进行了四舍五入处理,即若输出小于1.5则认为属于良性肿瘤,输出大于1.5则表示属于恶性肿瘤。
在训练集和测试集与LVQ神经网络相同的情况下,程序运行结果为:
病例总数:569 良性:357 恶性:212
训练集病例总数:500 良性:312 恶性:188
测试集病例总数:69 良性:45 恶性:24
良性乳腺肿瘤确诊:35 误诊:10 确诊率p1= 77.7778%
恶性乳腺肿瘤确诊:16 误诊:8 确诊率p2= 66.6667%
从上述结果可以看出,在69组测试集数据中,有18组数据误诊断(10组将良性乳腺肿瘤误诊为恶性乳腺肿瘤,8组将恶性乳腺肿瘤误诊为良性乳腺肿瘤),平均诊断正确率达73.9%(51/69)。对比LVQ神经网络及BP神经网络的仿真结果,可以看出,LVQ神经网络的效果比BP神经网络要好很多,这也表明LVQ神经网络用于模式识别是有效的。
LVQ神经网络无需对数据进行预处理,这使得相比于其他神经网络,LVQ神经网络更简单、有效。LVQ神经网络已经应用到各行各业中,如故障诊断、性能评价、风险预测等。近年来,许多人致力于研究LVQ神经网络的特点,提出了很多改进的算法以解决“死”神经元问题、改善权值调整规则等。