《MATLAB 神经网络43个案例分析》:第26章 LVQ神经网络的分类——乳腺肿瘤诊断
1. 前言
《MATLAB 神经网络43个案例分析》是MATLAB技术论坛(www.matlabsky.com)策划,由王小川老师主导,2013年北京航空航天大学出版社出版的关于MATLAB为工具的一本MATLAB实例教学书籍,是在《MATLAB神经网络30个案例分析》的基础上修改、补充而成的,秉承着“理论讲解—案例分析—应用扩展”这一特色,帮助读者更加直观、生动地学习神经网络。
《MATLAB神经网络43个案例分析》共有43章,内容涵盖常见的神经网络(BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等)以及相关智能算法(SVM、决策树、随机森林、极限学习机等)。同时,部分章节也涉及了常见的优化算法(遗传算法、蚁群算法等)与神经网络的结合问题。此外,《MATLAB神经网络43个案例分析》还介绍了MATLAB R2012b中神经网络工具箱的新增功能与特性,如神经网络并行计算、定制神经网络、神经网络高效编程等。
近年来随着人工智能研究的兴起,神经网络这个相关方向也迎来了又一阵研究热潮,由于其在信号处理领域中的不俗表现,神经网络方法也在不断深入应用到语音和图像方向的各种应用当中,本文结合书中案例,对其进行仿真实现,也算是进行一次重新学习,希望可以温故知新,加强并提升自己对神经网络这一方法在各领域中应用的理解与实践。自己正好在多抓鱼上入手了这本书,下面开始进行仿真示例,主要以介绍各章节中源码应用示例为主,本文主要基于MATLAB2015b(32位)平台仿真实现,这是本书第二十六章LVQ神经网络的分类实例,话不多说,开始!
2. MATLAB 仿真示例
打开MATLAB,点击“主页”,点击“打开”,找到示例文件 选中chapter26_lvq.m,点击“打开”
chapter26_lvq.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: LVQ神经网络的分类——乳腺肿瘤诊断
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-18
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LVQ神经网络的分类——乳腺肿瘤诊断
%% 清空环境变量
clear all
clc
warning off
tic
%% 导入数据
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) '%']);
toc
添加完毕,点击“运行”,开始仿真,输出仿真结果如下:
result =
1 至 19 列
1 1 2 1 2 2 1 1 1 1 1 1 1 1 2 2 2 1 2
1 1 2 1 2 2 2 1 1 1 1 1 1 1 2 2 1 1 2
20 至 38 列
1 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1
2 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1
39 至 57 列
1 1 1 1 1 1 1 1 2 2 1 1 2 2 2 1 1 1 1
1 2 2 2 2 2 1 1 2 2 2 1 2 2 1 1 1 1 1
58 至 69 列
1 1 1 2 2 2 1 1 1 1 2 1
1 1 1 2 2 2 1 2 1 1 2 1
病例总数:569 良性:357 恶性:212
训练集病例总数:500 良性:314 恶性:186
测试集病例总数:69 良性:43 恶性:26
良性乳腺肿瘤确诊:41 误诊:2 确诊率p1=95.3488%
恶性乳腺肿瘤确诊:17 误诊:9 确诊率p2=65.3846%
时间已过 6.838382 秒。
依次点击Plots中的Performance,Training State,Confusion,Receiver Operating Characteristic,可弹出以下图示: 回到MATLAB中,打开文件视图中chapter26_bp.m chapter26_bp.m源码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:BP神经网络的分类——乳腺肿瘤诊断
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-19
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% BP神经网络的分类——乳腺肿瘤诊断
tic
%% 创建网络
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) '%']);
toc
点击“运行”,开始仿真,输出仿真结果如下:
result =
1 至 19 列
1 1 2 1 2 2 1 1 1 1 1 1 1 1 2 2 2 1 2
1 1 2 1 2 2 2 1 1 1 1 1 1 1 2 2 1 1 2
20 至 38 列
1 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1
2 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1
39 至 57 列
1 1 1 1 1 1 1 1 2 2 1 1 2 2 2 1 1 1 1
1 2 2 2 2 2 1 1 2 2 2 1 2 2 1 1 1 1 1
58 至 69 列
1 1 1 2 2 2 1 1 1 1 2 1
1 1 1 2 2 2 1 2 1 1 2 1
病例总数:569 良性:357 恶性:212
训练集病例总数:500 良性:314 恶性:186
测试集病例总数:69 良性:43 恶性:26
良性乳腺肿瘤确诊:41 误诊:2 确诊率p1=95.3488%
恶性乳腺肿瘤确诊:17 误诊:9 确诊率p2=65.3846%
时间已过 6.838382 秒。
>> chapter26_bp
result =
1 至 19 列
1 1 2 1 2 2 2 1 1 1 1 1 1 1 2 2 1 2 2
1 1 2 1 2 2 2 1 1 1 1 1 1 1 2 2 1 1 2
20 至 38 列
1 1 1 2 1 1 2 2 2 1 1 2 1 1 1 1 1 1 1
2 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 1
39 至 57 列
1 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 1 1 1
1 2 2 2 2 2 1 1 2 2 2 1 2 2 1 1 1 1 1
58 至 69 列
1 1 1 2 1 2 2 2 1 2 2 1
1 1 1 2 2 2 1 2 1 1 2 1
病例总数:569 良性:357 恶性:212
训练集病例总数:500 良性:314 恶性:186
测试集病例总数:69 良性:43 恶性:26
良性乳腺肿瘤确诊:34 误诊:9 确诊率p1=79.0698%
恶性乳腺肿瘤确诊:23 误诊:3 确诊率p2=88.4615%
时间已过 2.954276 秒。
依次点击Plots中的Performance,Training State,Regression,可弹出以下图示:
3. 小结
LVQ(Learning Vector Quantization)神经网络是Kohonen于1989年提出基于竞争网络的学习矢量量化网络,主要用于做分类。属于前向神经网络类型,在模式识别和优化领域有着广泛的的应用。LVQ神经网络由三层组成,即输入层、隐含层和输出层,网络在输入层与隐含层间为完全连接,而在隐含层与输出层间为部分连接,每个输出层神经元与隐含层神经元的不同组相连接。隐含层和输出层神经元之间的连接权值固定为1。输入层和隐含层神经元间连接的权值建立参考矢量的分量(对每个隐含神经元指定一个参考矢量)。在网络训练过程中,这些权值被修改。隐含层神经元(又称为Kohnen神经元)和输出神经元都具有二进制输出值。当某个输入模式被送至网络时,参考矢量最接近输入模式的隐含神经元因获得激发而赢得竞争,因而允许它产生一个“1”,而其它隐含层神经元都被迫产生“0”。与包含获胜神经元的隐含层神经元组相连接的输出神经元也发出“1”,而其它输出神经元均发出“0”。产生“1”的输出神经元给出输入模式的类,由此可见,每个输出神经元被用于表示不同的类。
本章将LVQ神经网络与BP神经网络在乳腺肿瘤诊断预测上进行对比仿真,可以看到在良性与恶性两种分类预测中,LVQ神经网络与BP神经网络各有优劣,本实例仿真需要首先运行LVQ得到相应数据,再运行BP进行仿真。对本章内容感兴趣或者想充分学习了解的,建议去研习书中第二十六章节的内容。后期会对其中一些知识点在自己理解的基础上进行补充,欢迎大家一起学习交流。
|