心脏病判别论文
心脏病判别
摘 要
心脏病的判别指标有很多种,本文解决的就是如何根据这些指标判别心脏病以及这些指标的关键程度的问题.结合多元线性回归分析法对数据作初步处理和分析,利用Fisher判别法和SVM神经网络法分别建立判定模型,并进行正确率检验,以比较得到心脏病的最佳诊断方法.
对于问题一: 先用Fisher判别模型对附录二中的数据进行判别检验,得到判别的准确率仅为47.92%.再用线性不可分的SVM神经网络模型进行相同的判别检验,得到判别的准确率为76%,明显高于前者,故我们选用SVM神经网络模型来判别心脏病及患病程度的方法.
对于问题二: 经过比较后,用线性不可分的SVM神经网络对问题二进行求解,得到44人中只有第9、15、21、26、28、29、38、39号这 8人患有程度为1的心脏病,其他36人无心脏病.
对于问题三: 用主成分分析法分析附录二的数据特征,最后确定剔除掉B、C、D三个次要的指标,其余十项关键因素保留,减少了化验的指标,提高了诊断效率.接着,我们用SVM神经网络模型对剔除后的总体进行检验得到判别的准确率为72%,比没剔除之前仅少了4%.可见,这样的剔除还是比较合理的.
对于问题四: 根据第三问的结果,重复问题二的工作,求解得到44名就诊病人均不患心脏病.这个结果与问题二的结果相似度约为82%,可见,问题三中的剔除确实比较合理.
关键词: 多元回归分析 Fisher判别法 SVM神经网络 主成分分析法
1.问题重述
1.1问题的背景
心脏是维持全身血液循环的最重要器官.全世界1/3的人口死亡是心脏病引起的,而我国,每年有几十万人死于心脏病.心脏病已经成为威胁人类生命的十大疾病之一,除了老年人,中青年也成为心脏病猝死的高危人群.
心脏病包括风湿性心脏病、先天性心脏病、高血压性心脏病、冠心病、心肌炎等各种心脏病.患心脏病的可能生理表现常为呼吸困难、胸闷、手指浮肿等.心脏病患者体检时应查的项目有内科检查、血压、心电图、血脂、血糖、肝肾功能、血常规. 1.2问题的信息
题目给出到某医院做心脏病检测的一些确诊者的生理指标数据如下表(完整表见附录一):
并给出了指标A,B,…,M的含义,见下表:
表1:指标含义
1.3需要解决的问题
问题一:根据附录一中的数据,提出判别心脏病以及患病程度的方法,并检验你提出方法的正确性.
问题二:按照问题一提出的方法,判断附录二中的44名就诊人员的患病情况.
问题三:能否根据附录一的数据特征,确定哪些指标是影响人们患心脏病的关键或主因素,以便减少化验的指标.
问题四:根据问题三的结果,重复问题二的工作,并与问题二的结果对比作进一步分析.
2.问题分析
本文主要研究心脏病判别和确定影响人体患心脏病的关键因素的问题。解决心脏病判别问题的方法主要有判别分析法、基于神经网络系统的判别方法和SPSS软件等。解决确定关键因素的评价类问题,我们可以用主成分分析法。
针对问题一:题目要求提出判别心脏病的以及患病程度的方法,并检验方法的正确性。可以断定问题一的求解方法为判别分析,现在的判别方法有很多种,例如马氏距离,Fisher判别法,SPSS回归分析以及LVQ神经网络等智能算法。由于问题一中的有250个样本,每个样本又有13种影响因素,而且表示患病的有五种(0,1,2,3,4)可能的取值.针对影响因素较多,目标集较大的问题。我们选取人工神经网络系统里的BP神经网络(运用最广泛,成熟的网络)和支持向量机SVM(适合多目标的分类)作为问题一的模型。
针对问题二:在问题一的三个判别模型中,我们选择其中判别效果最好的模型,对附录二中的44名就诊人员的患病情况进行判别.
针对问题三:心脏病诊断时,如果能确定13个因素中的关键因素,可以减少化验的指标。主成分分析旨在利用降维的思想,设法将原来众多的具有一定相关性的指标,重新组合成一组新的互补相关的综合指标来代替原来指标,于是我们运用主成分分析法建立了主成分分析模型。我们先对附录一中的数据进行标准化处理,得到标准化矩阵。根据该矩阵求的相关系数矩阵,然后求得该矩阵对应的特征值和特征向量。根据特征值,按累计贡献率超过85%的条件得到主成分个数。最后求出以上主成分关于所有指标的线性表出式,经分析,确定所有指标中的关键因素。
针对问题四:仅考虑问题三中确定的关键指标,对附录二中的44名就诊人员的患病情况进行判别。将判别结果与问题二中的结果作对比,若准确度不低于问题二,说明问题三确定的关键指标很适合;否则,问题三确定的关键指标不合理,还需要进一步确定。
3.基本假设和符号说明
3.1基本假设
假设一:所给数据均是真实的;
假设二:所给数据中的所有-9均表示该项数据缺失,并不具有其他含义;
假设三:所给生理指标包含了可以准确诊断出得心脏病与否的所有决定性信息; 假设四:所给数据具有一般性,没有进行主观地挑选。 3.2符号说明
4.数据处理和分析
4.1患病者信息的统计
根据题目所给附录一中的确诊者信息,我们统计了心脏病患者在男女中的分布情况,如下表:
表2:心脏病患者在男女中的分布情况
其中,0表示正常,1、2、3和4均表示患病程度,数值越大说明病情越严重。由上表可知,男性患病率高出女性2倍多,所以男性更需要注意心脏病的危害;同时,心脏病在男女中的发生率均不低,说明心脏病对人群的危害很大。
针对老龄人容易患心脏病的现状,我们统计了心脏病在不同年龄段的分布情况,如下表:
其中,0表示正常,1、2、3和4均表示患病程度,数值越大说明病情越严重。由上表可知,在以上四个等分的年龄段内,患病率与年龄呈正相关,说明随着年龄的增长,心脏病对人体的危害也增加;尤其是58岁以后,老年人患病率高达59.091%,老龄人更加需要注意心脏病的危害。
4.2确诊者信息的异常数据处理
我们对附录一所给数据进行分析发现,-9这个数据出现频率很高,甚至在部分根据医学背景资料知道不可能为负值的参数列中也出现,统计结果如下表:
由上表可知,K、L、M三个指标中的-9所占比例均超过了50%, i而表1中对-9没有任何解释,所以可以认为-9为缺损数据标号。考虑到如果用最常用的异常数据剔除法来处理此数据会造成大量数据信息损失,故我们采用先进行数据挖掘再根据数据服从的规律进行插值修正数据的方法处理数据。具体做法如下:
(1)分析数据找出修正价值较大的因素列
仔细分析上表,由于K、L、M三列中缺损数据超过60%,所以可以认为这三列所包含的信息相当少,故数据插值修正所能用的信息太少,修正价值不高,而E、F两列中有用信息量较大缺损值较少,所以最终选定E、F两列作为数据插值修正对象。
(2)分析预修正列的数据分布并检验
用MATLAB软件编写程序对E指标列数据绘制频数直方图如下:
图1:E指标列数据频数直方图
上图呈现中间高两边低的形状,于是猜想其符合正态分布,进一步做正态分布检验,得到正态分布检验图如下:
图2:正态分布检验图
数据点基本分布在直线两侧,认为该组数据基本服从正态分布,并用normfit函数求得该分布的期望为250,标准差为67.3178。
(3)产生符合所得分布规律的随机数并根据相关系数进行插值修正 用MATLAB软件生成符合上面分布的17个随机数如下: 252.4572、83.6304、253.3182、288.0966、326.5113、292.5179、264.4538、260.1472、263.5684、208.5671、284.3616、209.3477、195.5644、319.9505、227.2172、260.6262、235.9998。
又由spss软件对附件一的所有数据进行统计分析得出E与其他因素之间的相关系数(仅给出相关系数较大的数据)如下表:
表5:E与其他因素之间的相关系数
考虑数据量不大,故我们采取根据相关系数进行人工匹配插值。最终插值修正结果见附录三。
(4)原始数据与插值修正后数据服从分布的情况比较
我们用MATLAB软件中的ttest函数对两组数据服从的分布的期望做假设检验,结果如下表:
由上表可知,两组数据均接受0假设,且sig值均为1,所以原始数据与插值修正后数据服从的规律相似,修正数据不会影响E因素的总体规律,说名这种处理方法是合理的。
4.3确诊者修正信息的标准化
为了便于使用异常处理后的数据,我们对数据进行平移·标准差变换。变换公式为
'=xik
xik-k
,n,k=; (i=1,2
sk
1,2m,
1n其中 xk=∑xik,sk=。 ni=1经过变换后,每个变量的均值为0,标准差为1,且消除了量纲的影响。但
'不一定在区间[0,1]内。经平移·标准差变换后的数据如下表(完是,得到的xik整表见附录四):
5.问题一的解答
问题一要求提出判别心脏病以及患病程度的方法,并检验提出方法的正确性.该问题属于判别问题,解决此类问题的方法有判别分析法和网络神经系统等,我们选择用BP神经网络和支持向量基SVM的方法建立模型求解。为了检验提出方法的正确性,我们选取附录一中任意200组数据进行训练,利用其余50组数
据进行检测。
首先,我们用BP神经网络的方法建立模型。 5.1模型一的建立:BP神经网络模型 5.1.1 BP神经网络的基本理论
人工神经网络(ANN)的是由大量简单的基本元件——神经元相互连接,通过模拟人的大脑神经处理信息的方式,进行信息并行处理和非线性转换的复杂网络系统。神经网络的优点是多输入多输出实现了数据的并行处理及学习能力。
BP神经网络是一种具有三层及三层以上的多层神经网络,每一层都由若干个神经元组成,如下图所示:
图3:BP神经网络结构
上下层之间实现全连接,而同一层的神经元之间无连接,输入神经元与隐含层神经元之间是网络的权值,其意思是两个神经元之间的连接强度隐含层或输出层任一神经元将前一层所有神经元传来的信息进行整合,通过还会在整合过的信息中添加一个阀值,这主要是模仿生物学中的神经元必须到达一定的阀值才会触发的原理,然后将整合过的信息作为该层神经元输入。BP算法的核心是数学中的‘负梯度下降’理论,即BP网络的误差调整方向总是沿误差下降最快的方向进行,常规三层BP网络权值和阀值调整公式如下:
wij(t+1)=-η
∂E∂E
+wij(t) , ηwjk(t+1)=-η+w∂wij∂wjk∂E∂E
+Bij(t) , Bjk(t+1)=-η+B∂Bij∂Bjk
jk
(t)
Bij(t+1)=-η
jk
(t)
其中,E为网络的输出的与实际输出样本之间的误差平方和;η为网络的学习速率;B为神经元的阀值,下标的意义与权值的相同。
5.2 BP神经网络模型的实现
(1)网络学习样本的建立
根据附录一给出的数据,我们随机选择了其中的80%作为训练样本,其余20%作为测试样本。该数据共有250个随机样本,每个样本有13个影响因数。该数据是随机进行排序的,所以我们选择原始数据的1—200的样本作为训练样本,201—250的样本作为测试样本。
(2)原始数据预处理
由于原始数据中的各个因数的数值所代表的含义不同,而且各个因数的量纲也不相同,所以需要对导入的数据进行一定的预处理。MATLAB中提供了一种对数据进行归一化处理的函数:[PN1,minp,maxp] = premnmx(P1).
利用归一化函数分别对训练样本,训练目标,测试样本,测试目标进行了归一化处理。需要说明的是归一化并非一个不可或缺的处理步骤,具体问题应该具体分析,从而决定是否要归一化。
(3)设置网络参数
训练样本共有200个,在满足网络需求的前提下我们设置隐含层节点数为10个;由于训练目标和测试目标为一维的向量,输出维数为1维;判别函数我们根据网络的层数分别选择了非线性的tansig以及线性的purelin函数;训练显示间隔,学习步长,……最大训练时间等均设置在合理的范围内。
(4)网络的训练
利用MATLAB提供的神经网络工具箱实现人工神经网络的功能。首先,我们利用训练样本对网络实行训练,通过调节各项参数以及判别函数来提高训练样本精度;然后,当训练精度达到一定程度的时候,我们再加入测试样本,对网络进行检验。BP网络的运行结果不是十分的稳定,当训练次数达到100次以后,我们连续测得20组数据,求的均值如下表所示:
只有60.1%,并不理想。于是,我们采用支持向量基SVM的方法建立模型求解。 5.3模型二的建立:SVM模型
记x1, ,x13分别表示13个指标变量,已知观测样本为[ai,yi](i=1, ,n,这里n=250),其中,y有0,1,2,3,4五种可能的取值。
首先进行线性分类,即要找一个最优分类面(ω⋅x)+b=0,其中x表示指标向量,满足条件如下:
⎧(ω⋅x
)+b≤1
(y=1或-1) ; ⎨
⎩(ω⋅x)+b≥1,
即有yi[ω⋅b+b]≥1,i=1, ,n,其中满足方程(ω⋅ai)+b=±1的样本为支持向量。 要使两类总体到分类面的距离最大,则有:
(1)求分类函数
12
2
可求得最优值对应的w,b,可得分类函数.
求解分类函数是一个二次规划模型,为了利用MATLAB求解,下面将原问题化为其对偶问题。
min
定义广义lagrange函数
n
12
L(ω,α)=ω+∑αi1-yi⎡αi)+b⎤(ω ⎣⎦2i-1
{}
由KKT互补条件,通过对w和b求偏导,得到
ω=∑αiyiai,∑αiyi=0,
i=1
i=1
nn
带入原lagrange函数得
1nn
L=∑αi-∑∑αiαjyiyj(ai aj).
2i=1j=1i=1
(2)求解最优权重向量
n
1nn
max∑αi-∑∑αiαjyiyj(ai aj)
2i=1j=1i=1
n
⎧n
⎪∑αiyi=0,
s..t⎨i=1
⎪0≤α,i=1,2, ,n.
i⎩
解此二次归化得到最优解a,从而得到权重向量
n
ω=∑αi*yiai,
*
i=1
最终的分类函数表达式如下:
⎡n*⎤
g(x)=sgn⎢∑αigj(ti x)+b*⎥
⎣i=1⎦
(3)核函数求解
1nn
max∑αi-∑∑αiαjyiyjK(ai,aj)
2i=1j=1i=1
n
⎧n
⎪∑αiyi,
s..t⎨i=1
⎪0≤α,i=12,i=1,2, ,n.
i⎩
分类函数的表达式为
⎡n*⎤
g(x)=sgn⎢∑αiyiK(ai,x)+b*⎥
⎣i=1⎦
综上所述,我们建立的模型二为
⎡n*⎤
g(x)=sgn⎢∑αiyiK(ai,x)+b*⎥。
⎣i=1⎦
5.4 SVM模型的实现
(1)选定训练集和测试集
首先,根据原始数据中的患病情况(可能标签值分别为:0,1,2,3,4)的不同,对原始数据经行排序。将第一类的1-125,第二类的158-191,第三类的192-209,第四类的215-233,第五类的238-248做为训练集;将第一类的126-157,第二类的185-191,第三类的210-214,第四类的234-237,第五类的249-248做为测试集。需要说明的是数据的选择是随机的。
(2)数据预处理
由于原始数据中的各个因数的数值所代表的含义不同,而且各个因数的量纲也不相同,所以需要对导入的数据进行一定的预处理,将训练集和测试集归一化到[0,1]区间。利用MATLAB自带的归一化函数mapminmax。
(3)SVM网络训练
利用MATLAB的工具箱中的函数svmtrain对导入的训练集进行训练。在题目给定的范围内,对c和g两个参数经行调节;同时选择第二类核函数。
(4)最后对测试集的数据经行SVM网络预测,SVM的结果非常稳定。对导入的测试集经行预测,得到的结果为76%。
6.问题二的解答
本问要求按照问题一提出的方法,判断附录二中的44名就诊人员的患病情况.于是我们选择了问题一中判别心脏病准确率较高的SVM模型,用该模型求解。
首先,我们定义附录二中的44个样本为新的测试集,初始标签统一定义为1,这样便于后期的数据统计;接着我们将新的测试集与目标集导入到问题一中的SVM的model进行分类预测。分类预测的结果如下图:
测试集的实际分类和预测分类图
类别标签
测试集样本
图4:分类预测的结果
由上图可知,测试集中的44个样本均为健康。
7.问题三的解答
诊断一个人患心脏病需检测的项目众多,题目给出了人体患心脏病的13种影响因素.为了减少化验的指标,我们运用主成分分析法建立了模型二,确定了影响人体患心脏病的关键因素. 7.1主成分分析的基本思想
主成分分析旨在利用降维的思想,设法将原来众多的具有一定相关性的指标,重新组合成一组新的互补相关的综合指标来代替原来指标.
通常数学上的处理就是将原来的P个指标作线性组合,作为新的综合指标.线性组合的选取应遵循以下准则:在所有线性组合中所选取的F1应该是方差最大的,故称F1为第一主成分.如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合.为了有效的反映原有信息,F1已有的信息就不需要再出现在F2中,用数学的语言表达就是要求Cov(F1,F2)=0,称F2为第一主成分,依次类推可以构造出第三、第四、„、第P个主成分.
7.2模型三的建立
我们以附录一中的250组数据为样本数据,记n=250;以从A到M的13个生理特征为指标,记p=13,得到原始数据矩阵
⎡x11⎢x21
X=(X1 XP)=⎢
⎢ ⎢⎢⎣xn1
*
(1) 样本数据xij标准化为xij
x1p⎤
x22 x2p⎥⎥. ⎥
⎥
xn2 xnp⎥⎦
x12
为了消除各项因素之间在量纲化和数量级上的差别,对样本数据进行标准化,
*
得到标准化矩阵X*=(X1* Xp*)=(xij*)n⨯p.用标准化后的数据xij代替xij,得
xij*=
xij-xj
sj
;
n
其中,xj=
1
xij为因素j 的平均数, sj=∑ni=1
n
∑(x
i=1
ij
-xj)2
n-1
为因素j 的标准差.
(2)根据标准化矩阵X*建立相关系数矩阵R
相关系数矩阵R=(rij)p⨯p是反映标准化后的数据之间的相关关系的密切程度的统计指标,值越大,说明有必要对数据进行主成分分析.由于矩阵R是一个实对称矩阵,故
1n**
rij=xkixkj=∑n-1k=1
∑(x
n
ki
-xi
)(x
kj
-xj
)
;
其中,i=1, ,n;j=1, ,p.
(3) 根据相关系数矩阵求特征值λi及正交化单位特征向量ai
求解相关系数矩阵R的特征方程λE-R=0,得到特征值λi(i=1, ,p).由于R是一个正定矩阵,故其特征值均为正数,将其按从大到小的数序排列得
λ1≥λ2≥ ≥λp≥0.
将特征值λi带入方程(R-λiE)ai=0,求得对应的特征向量ai=(aji)p⨯1,由于
ai正交化单位特征向量,故
a1j2+a2j2+ +apj2=1.
(4) 确定主成分个数m
选取主成分个数的两个原则:
原则一:前m个主成分的累计贡献率
∑λ∑λ
i=1i=1p
m
i
≥85%;
i
原则二:选取的主成分对应的特征值大于1,即λ1≥λ2≥ ≥λm≥1. 综上所述,m即为主成分的个数. (5)计算主成分得分
计算n个样品在m个主成分上的得分如下:
⎧F1=a11X1*+a21X2*+ +ap1XP*⎪
. ⎨
⎪F=aX*+aX*+ +aX*
1m12m2pmP⎩m(6) 综合评价函数F
每个主成分的贡献率为
wi=
λi
∑λ
k=1
m
(i=1, ,m);
k
则综合评价函数
F=∑wiFi.
i=1m
综上所述,我们得到模型三如下:
∑wa(j=1, ,p)
iji
i=1
m
7.3模型三的求解
(1)主成分个数m的确定
我们用SPSS软件求解,得到相关系数矩阵的特征值及所有主成分的贡献率情况,如下表所示:
由表可知,主成分F1, ,F9累计贡献率为
∑λ
k=113i=1
9
k
=88.327%≥85%,故可以确定主
i
∑λ
成分的个数m=9. (2) 主成分的解释
确定主成分后,我们在SPSS里得到主成分对每个原指标的相关系数,如下表:
表9:主成分矩阵系数
结论一:第一主成分F1与原指标A、B、C密切相关; 结论二:第二主成分F2与原指标F密切相关; 结论三:第三主成分F3与原指标G密切相关; 结论四:第四主成分F4与原指标I密切相关; 结论五:第五主成分F5与原指标J密切相关; 结论六:第六主成分F6与原指标H、I、M密切相关; 结论七:第七主成分F7与原指标G、K、L密切相关; 结论八:第八主成分F8与原指标L密切相关; 结论九:第九主成分F9与原指标M密切相关.
(3) 根据表达式∑wiaji(j=1, ,p)计算个主成分对原指标的相关系数
i=1m
为保证原来数据的信息最大程度的保留,故将累计大于等于85%的前面几个生理指标定为关键指标,如下表:
表10:综合评价系数
由上表可知,关键指标的重要程度按从大到小的顺序依次排列为:年龄、静息血压、性别、胸痛类型、最大心跳速率、运动心电图st下降程度、是否地中海贫血、大血管属性、血清中胆固醇含量、运动是否诱发心绞痛、静息心电图结果。这11项为关键因素,无论是从本模型所得的数据上来看还是从医学背景资料上做对比分析都是比较合理的,故可以认为这11项生理指标即为对心脏病诊断最关键的指标。
8.问题四的解答
本问题要求以问题三确定的影响人们患心脏病的主要指标为依据,重新对问题二中的44个样本进行患病及患病程度判断。
首先,根据问题三的模型去掉样本中的次要因素(斜坡类型、空腹血糖含量是否高于120mg/dl),导入新的测试集(44*11),标签同样统一设定为1;接着我们将新的测试集与目标集导入到问题一中的SVM的model进行分类预测。分类预测的结果如下图:
测试集的实际分类和预测分类图
类别标签
测试集样本
图5:分类预测的结果
从图形我们可以得到,与问题二诊断结果不同样本分别是15号、26号、29
号、38号、39号,共有5个不同的检验结果。假设问题二中的诊断全为正确,则经过去除次要因素后的诊断误差为11.1%,结果在误差允许的范围内是合理的。
9.模型的评价、改进与推广
9.1模型的优缺点 9.1.1模型一的优缺点 优点:
(1)网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题。
(2)网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力。
(3)网络具有一定的推广、概括能力。
缺点:BP算法的学习速度较慢;容易出现过拟合现象,参数的设置十分繁复,且无明确的理论指导依据;算法结果不稳定 9.1.2模型二的优缺点 优点:
(1)svm支持向量机算法样本训练速度很快。
(2)通过一定的转化对与分类问题有很好的适应性。
(3)通过svm求的的结果是我们所用的几种方法中最优的。 (4)本算法的结果十分的稳定,而且我们通过大量实验找到较好的参数设置。 缺点:
对非0-1分类问题分类效果并不是别好,需要通过一定的转化才能将本题中各0到4这五种患病程度分类问题较好的解决。本模型可以推广到其他疾病的诊断以及类似的分类问题上,尤其对疾病的诊断问题具有较好的效果。 9.1.2模型三的优缺点 优点:
采用主成份分析法的主要思想,并在其工作之上提出了新的主要影响因素系数计算方法,并以此作为判断各个因素重要性的指标。 缺点:
在其最终的信息量的判定上,我们采取了归一化在进行累加求值然后主观地认为重要性指标前几名的因素指标之和大于等于85%便可以认为他们可以包含原数据的大部分信息,此处并无我们已知的理论支撑,所以可以在此处采用更为合理的判定指标。 9.2模型的改进
(1)问题一中,BP神经网络模型和SVM模型的判别准确率不高,原因在于题目所给确诊者信息数据未得到很好的处理,我们可以尝试将该数据处理得更合理。
(2)问题三中的主成分分析法带有一定主观性,可以尝试寻找更为科学的方法评价题目所给的13个指标。 9.3模型的推广
BP神经网络模型和SVM模型均解决判别问题,故可以用于除心脏病以外的其他疾病诊断;主成分分析模型解决评价问题,故可以用于其他评价问题,如影
响车辆内轮差的主要因素。
10.参考文献
[1]李建婷1, 邓兆智2, 郭新峰1, 余煜棉3 广州中医药大学学报 2008年3月第25 卷第2期 主成分分析法结合马氏距离判别法在类风湿性关节炎中医证候诊断中的应用
[2]司首奎 孙玺菁 国防工业出版社 2011年8月第一版 数学建模算法与应用 [3]赵静 但琦 高等教育出版社 2000年11月第一版 数学建模与数学实验 [4]史峰 王辉 郁磊 胡斐 北京航空航天大学出版社 2011年7月第一版 MATLAB智能算法30个案例分析
11.附录
21
22
23
24
25
26
27
28
29
30
附录五:BP神经网络
clc clear close all
%---------------------------------------------------
% 产生训练样本与测试样本,每一列为一个样本 load data;
P1=data1; P1=P1'; %训练目标向量t T1=data2; T1=T1'; %测试样本P_test P2=data3; P2=P2'; %测试目标t1
T2=data4; T2=T2'; warning off
%--------------------------------------------------- % 归一化
[PN1,minp,maxp] = premnmx(P1); PN2 = tramnmx(P2,minp,maxp);
%---------------------------------------------------
% 设置网络参数
NodeNum = 10; % 隐层节点数 TypeNum = 1; % 输出维数
TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值) % %TF1 = 'tansig';TF2 = 'logsig'; % %TF1 = 'logsig';TF2 = 'purelin'; % %TF1 = 'tansig';TF2 = 'tansig'; % %TF1 = 'logsig';TF2 = 'logsig'; % %TF1 = 'purelin';TF2 = 'purelin';
net = newff(minmax(PN1),[13 NodeNum TypeNum],{TF1 TF1 TF2}); %--------------------------------------------------- % 指定训练参数
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法 % net.trainFcn = 'traingda'; % 变学习率梯度下降算法
% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法 % (大型网络的首选算法 - 模式识别)
% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小 % 共轭梯度算法
net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大 % (大型网络的首选算法 - 函数拟合,模式识别)
% net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
% (中小型网络的首选算法 - 函数拟合,模式识别)
%net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快 % net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' %---------------------%
net.trainParam.show = 1; % 训练显示间隔
net.trainParam.lr = 0.3; % 学习步长 - traingd,traingdm
net.trainParam.mc = 0.95; % 动量项系数 - traingdm,traingdx
net.trainParam.mem_reduc = 10; % 分块计算Hessian矩阵(仅对Levenberg-Marquardt算法有效)
net.trainParam.epochs =1000; % 最大训练次数 net.trainParam.goal = 0.001; % 最小均方误差 net.trainParam.min_grad = 1e-20; % 最小梯度 net.trainParam.time = inf; % 最大训练时间
%--------------------------------------------------- % 训练与测试
net = train(net,PN1,T1); % 训练
%--------------------------------------------------- % 测试
Y1 = sim(net,PN1); % 训练样本实际输出 Y2 = sim(net,PN2); % 测试样本实际输出 % Y1 = full(compet(Y1)); % 竞争输出 % Y2 = full(compet(Y2)); Y1=fix(Y1); c1=T1-Y1;
B1=find(c1==0); q1=size(B1,2); w1=q1/200
Y2=fix(Y2); c2=T2-Y2;
B2=find(c2==0); q2=size(B2,2); w2=q2/50
附录六:SVM算法
%% SVM神经网络的数据分类预测----心脏病诊断第一问 %% 清空环境变量 close all; clear; clc;
format compact; %% 数据提取
% 载入测试数据datas,其中包含的数据为classnumber = 3,datas:178*13的矩阵,datas_labes:178*1的列向量 load data3;
% 选定训练集和测试集
% 将第一类的1-125,第二类的158-191,第三类的192-209,第四类的215-233,第五类的238-248做为训练集.
train_datas = [datas(1:125,:);datas(158:191,:);datas(192:209,:);datas(215:233,:);datas(238:248,:)]; % 相应的训练集的标签也要分离出来 train_datas_labels = [labels(1:125);labels(158:191);labels(192:209);labels(215:233);labels(238:248)];
% 将第一类的126-157,第二类的185-191,第三类的210-214,第四类的234-237,第五类的249-248做为测试集
test_datas
[datas(126:157,:);datas(187:191,:);datas(210:214,:);datas(234:237,:);datas(249:248,:)]; % 相应的测试集的标签也要分离出来 test_datas_labels
[labels(126:157,:);labels(187:191,:);labels(210:214,:);labels(234:237,:);labels(249:248,:)];
%% 数据预处理
% 数据预处理,将训练集和测试集归一化到[0,1]区间
[mtrain,ntrain] = size(train_datas); [mtest,ntest] = size(test_datas);
dataset = [train_datas;test_datas];
% mapminmax为MATLAB自带的归一化函数 [dataset_scale,ps] = mapminmax(dataset',0,1); dataset_scale = dataset_scale';
train_datas = dataset_scale(1:mtrain,:);
test_datas = dataset_scale( (mtrain+1):(mtrain+mtest),: ); %% SVM网络训练
model = svmtrain(train_datas_labels, train_datas, '-c 1 -g 2 t 2');
%% SVM网络预测
[predict_label, accuracy] = svmpredict(test_datas_labels, test_datas, model);
%% 结果分析
% 测试集的实际分类和预测分类图
% 通过图可以看出只有一个测试样本是被错分的 figure; hold on;
plot(test_datas_labels,'o'); plot(predict_label,'r*');
xlabel('测试集样本','FontSize',12); ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',12); grid on;
=
=