wenxuegeng 2020-06-26
这篇文章是我的一个结课小论文,分享出来,希望对各位有所帮助,源码以及解释都有。
author:xiao黄
缓慢而坚定的生长
公众号:Community Detection
欢迎各位关注嘻嘻嘻
程序和数据上传到网盘中,程序也可以看附录。
链接:https://pan.baidu.com/s/1cxVOK54Qx1ohhg-hURBtaw
提取码:k2yx
摘要:对于乳腺肿瘤分类过程中的问题,用LVQ神经网络来实现乳腺肿瘤的分类。LVQ算法是一种有监督的学习方法,其在模式识别和优化领域有广泛的应用。本文在MATLAB平台中建立LVQ神经网络识别器进行训练、测试。通过实验结果表示,本文中的LVQ算法分类精度为94.2%,与其他分类方法相比,分类精度得到进一步提高。
关键字:LVQ;乳腺肿瘤;分类;MATLAB
目前,乳腺癌已经成为世界上妇女发病率最高的癌症。今年来在中国,尤其在相对比较发达的东部地区,乳腺癌的发病率及死亡率呈明显的增长趋势。研究表明,乳腺恶性肿瘤若能早期发现、早期诊断、早期治疗,可能取得良好的效果。过去的20年里,人们在分析和诊断各种乳腺肿瘤方面了很多方法,尤其是针对乳腺图像的分析已日趋成熟。医学研究发现,乳腺肿瘤病灶组织的细胞核显微图像与正常组织的细胞核显微图像不同,但是用一般的图像处理方法很难对其进行区分。因此,运用科学的方法,根据乳腺肿瘤病灶组织的细胞核显微图像对乳腺肿瘤属于良性或者恶性进行诊断显得尤为重要。
威斯康辛大学医学院经过多年的收集和整理,建立了一个乳腺肿瘤病灶组织的细胞核显微图像数据库。数据库中包含了细胞核图像的10个量化特征(细胞核半径、质地、周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度),这些特征与肿瘤的性质有密切的关系。因此需要建立一个确定的模型来描述数据库中各个量化特征与肿瘤性质的关系,从而可以根据细胞核显微图像的量化特征诊断乳腺肿瘤是良性还是恶性的。与其他模式识别和映射方式相比,LVQ神经网络的优点在于网络结构简单,只通过内部单元的相互作用就可以完成十分复杂的分类处理,也很容易将设计域中的各种繁杂分散的设计条件收敛到结论上来。而且它不需要对输入向量进行归一化、正交化处理,只需要直接计算输入向量与竞争层之间的距离,从而实现模式识别,因此简单易行。本文通过LVQ神经网络对乳腺肿瘤分类进行深入研究。
学习向量量化(Learning Vector Quantization, LVQ)神经网络是由芬兰学者Teuvo Kohonen在竞争型神经网络基础上提出的。LVQ神经网络是一种用于训练竞争层的有监督学习(supervised learning)方法的输入前向神经网络。LVQ神经网络已被广泛用于模式识别和优化领域。LVQ网络结构图如图1所示。
LVQ神经网络由3层神经元组成,即输入层、竞争层和线性输出层。输入层与竞争层之间采用全连接的方式,竞争层与线性输出层之间采用部分连接的方式。竞争层神经元个数总是大于线性输出层神经元个数,每个竞争层神经元只与一个线性输出层神经元相连接且连接权值恒为1。但是,每个线性输出层神经元可以与多个竞争层神经元相连接。竞争层神经元与线性输出层神经元的值只能是1或0。当某个输入模式被送至网络时,与输入模式距离最近的竞争层神经元被激活,神经元的状态为“1”,而其他竞争层神经元的状态均为“0”。因此,与被激活神经元相连接的线性输出层神经元状态也为“1”,而其他线性输出神经元的状态均为“0”。
其中,p为R维的输入模式;S1为竞争层神经元个数;IW1,1为输入层与竞争层之间的连接权系数矩阵;n1为竞争层神经元的输入;a1为竞争层神经元的输出;LW2,1为竞争层与线性输出层之间的连接权系数矩阵;n2为线性输出层神经元的输入;a2为线性输出层神经元的输出。
LVQ神经网络算法是在有教师状态下对竞争层进行训练的一种学习算法,因此LVQ算法可以认为是把自组织特征映射算法改良成有教师学习的算法。LVQ神经网络算法可分为LVQ1算法和LVQ2算法两种。
(1) LVQ1算法
向量量化是利用输入向量的固有结构进行数据压缩的技术,学习向量量化是在向量量化基础上能将输入向量分类的监督学习技术。Kohonen把自组织特征映射算法改良成有教师学习算法,首先设计了LVQ1算法。LVQ1的训练过程开始于随机地自“标定”训练集合选择一个输入向量及该向量的正确类别。
LVQ1算法的基本思想是:计算距离输入向量最近的竞争层神经元,从而找到与之相连接的线性输出层神经元,若输入向量的类别与线性输出神经元所对应的类别一致,则对应的竞争层神经元权值沿着输入向量的方向移动;反之,若两者的类别不一致,则对应竞争层神经元权值沿着输入向量的反方向移动。基本的LVQ1算法的步骤为:
步骤1:初始化输入层与竞争层之间的权值wij及学习率η(η>0)。
步骤2:将输入向量x=(x1,x2,…,xR)T送入到输入层,并计算竞争层神经元与输入向量的距离:
式中,wij为输入层的神经元j与竞争层的神经元之间的权值。
步骤3:选择与输入向量距离最小的竞争层神经元,若di最小,则记与之连接的线性输出层神经元的类标签为Ci。
步骤4:记输入向量对应的类标签为Cx,若Ci=Cx,则用如下方法调整权值:
否则,按如下方法进行权值更新:
(2) LVQ2算法
在LVQ1算法中,只有一个神经元可以获胜,即只有一个神经元的权值可以得到更新调整。为了提高分类的正确率,Kohonen改进了LVQ1,并且被称为新版本LVQ2,。LVQ2算法局域光滑的移动决策边界逼近Bayes极限。LVQ2版本接着被修改,产生LVQ2.1,并且最终发展为LVQ3。这些后来的LVQ版本的共同特点是引用了“次获胜”神经元,获胜神经元的权值向量和“次获胜”神经元的权值向量都被更新。具体计算步骤如下:
步骤1:利用LVQ1算法对所有输入模式进行学习。
步骤2:将输入向量x=(x1,x2,…,xR)T送入到输入层,并根据公式(1)计算竞争层与输入向量的距离。
步骤3:选择与输入向量距离最小的两个竞争层神经元i,j。
步骤4:如果神经元i和神经元j满足以下两个条件:
1神经元i和神经元j对应于不同的类别;
2神经元i和神经元j与当前输入向量的距离di和dj满足公式(4):
其中,ρ为输入向量可能落进的接近于两个向量中段平面的窗口宽度,一般取2/3左右。则有
1若神经元i对应的类别Ci与输入向量对应的类别Cx一致,即Ci=Cx,则神经元i和神经元j的权值如下方法进行修正。
2若神经元j对应的类别Cj与输入向量对应的类别Cx一致,即Cj=Cx,则神经元i和神经元j的权值按如下方法进行修正。
步骤5:若神经元i和神经元j不满足步骤4中的条件,则只更新距离输入向量最近的神经元权值,更新公式与LVQ1算法步骤4相同。
3 模型建立
3.1 设计思路
将乳腺肿瘤病灶组织的细胞核显微图像的10个量化特征作为网络的输入,良性乳腺肿瘤和恶性乳腺肿瘤作为网络的输出。用训练数据集对设计的LVQ神经网络进行训练,然后对测试集数据进行测试并对测试结果进行分析,最后通过与BP神经网络测试的结果进行对比分析。
3.2 设计步骤
根据上述设计思路,设计步骤主要包括以下几个,如图2所示
1)数据采集:采用威斯康辛大学的数据集;
2)网络创建:利用MATLAB自带的神经网络工具箱中的函数newlvq()可以构建一个LVQ神经网络;
3)网络训练:网络创建完毕后,根据数据的格式对神经网络的参数进行设置和修改。将训练集的数据输入网络,然后对LVQ神经网络进行训练;
4)网络仿真:LVQ神经网络通过训练后,将测试集的量化特征输入网络,便可以得到对应的输出(即分类)。
5)结果分析:通过对网络仿真结果的分析,可以得到误诊率(包括良性被误诊为恶性及恶性被误诊为良性),从而可以对该方法的可行性进行评价。
4 实验验证
为了验证基于LVQ神经网络乳腺肿瘤分类的可靠性与识别精度,利用MATLAB(2018-a)平台构建LVQ神经网络模型。本文采用威斯康辛大学医学院的乳腺肿瘤癌数据集中共包括569个病例,其中,良性357例,恶性212例。本文随机选取500组数据作为训练集,剩余69组作为测试集。
每个病例的一组数据包括采样组织中各细胞核的10个特征量的平均值、标准差和最坏值(各特征的3个最大数据的平均值)共30个数据。数据文件中每组数据共分32个字段,第1个字段为病例编号;第2个字段为确诊结果,B为良性,M为恶性;第3-12个字段是该病例肿瘤病灶组织的各细胞核显微图像的10个量化特征的平均值;第13-22个字段是相应的标准差;第23-32个字段是相应的最坏值。
本文使用多特征信号对神经网络进行训练,由于输入层为30组不同的特征信号,识别目标为2种不同的肿瘤类别;所以LVQ神经网络结构确定为30-20-2型,其中20为竞争层神经元个数。最大迭代次数设置为1000,显示频率设置为10,学习率选取0.1,训练目标最小精度设为0.1.经过7步训练网络达到稳定并满足误差精度要求,训练结束。随机将500组数据进行训练,将69组测试样本输入已经训练好的LVQ模型,进行乳腺肿瘤分类验证。
由于训练集和测试集是随机产生的,因此每次运行的结构都会有所不同。某次运行结构如图xx所示。并通过与BP算法乳腺肿瘤分类进行对比,具体数据如表1、表2所示,LVQ神经网络的分类效果良好。
结合表1和表2可知,在69组测试集数据中心,有4组数据误诊断(1组将良性乳腺肿瘤误诊为恶性乳腺肿瘤,3组将恶性乳腺肿瘤误诊为良性乳腺肿瘤),平均诊断正确率达94.2%(65/69)。
由表2中的数据可知:
LVQ算法的总误差为5.80%,而BP算法的误差高达14.49%,即LVQ神经网络的误差要小于BP神经网络的误差,约为BP神经网络的2/5;故LVQ神经网络的识别准确率优于BP神经网络,具有较高的分类精度。
LVQ神经网络的运行速度为9.000s,而BP神经网络的运行时间为3.000s,即LVQ的运行速度要小于BP神经网络,是BP神经网络的3倍。
5 结论
针对乳腺肿瘤的特征多样性,提出了LVQ神经网络识别分类方法,建立了乳腺肿瘤的LVQ神经网络分类模型。通过训练与试验,试验结果表明LVQ神经网络有效地提高了模型识别准确度,验证了LVQ神经网络具有较强的学校、泛化能力,能够精确地分类乳腺肿瘤。
附录:
LVQ神经网络
%% 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] result1 = result(1, :); %% 结果显示 % 预测结果图形 figure(1) plot(Tc_test, ‘-*‘) % 正确结果 hold on plot(result1, ‘r:o‘) xlabel(‘测试集样本编号‘) ylabel(‘测试集输出‘) title(‘LVQ测试集输出‘) legend(‘期望输出‘, ‘预测输出‘) % 图标 % 网络预测误差图形 error = result1 - Tc_test; figure(2) plot(error, ‘-*‘); xlabel(‘样本‘) ylabel(‘误差‘) title(‘LVQ预测误差‘) 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) ‘%‘]);
附录2:BP神经网络
%% 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] result1 = result(1, :); % 预测结果图形 figure(1) plot(Tc_test, ‘-*‘) % 正确结果 hold on plot(result1, ‘r:o‘) xlabel(‘测试集样本编号‘) ylabel(‘测试集输出‘) title(‘BP测试集输出‘) legend(‘期望输出‘, ‘预测输出‘) % 图标 % 网络预测误差图形 error = result1 - Tc_test; figure(2) plot(error, ‘-*‘); xlabel(‘样本‘) ylabel(‘误差‘) title(‘BP预测误差‘) 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) ‘%‘]);