数学建模竞赛化验结果
的处理解题论文
【IMB 5AB- IMBK 08- IMB 2C】
IMB standardization office
2007年北京工业大学数学建模竞赛初赛试题B题:
化验结果的处理题解
摘要:
本文运用了距离判别和Fisher判别两种方法对问题进行分析求解,得出了我们想要的结论,即通过体内元素含量较准确的判别个体是否患有肾炎。
1、 问题的提出
人们到医院就诊时,通常要化验一些指标来协助医生的诊断。诊断就诊人员是否患肾炎时通常要化验人体内各种元素含量。表是确诊病例的化验结果,其中1-30号病例是已经确诊为肾炎病人的化验结果;31-60号病例是已经确定为健康人的结果。表是就诊人员的化验结果。我们的问题是:
1) 根据表中的数据,提出一种或多种简便的判别方法,判别属于患者或健康人的方法,并检验你提
出方法的正确性。
2) 按照1提出的方法,判断表中的30名就诊人员的化验结果进行判别,判定他(她)们是肾炎病
人还是健康人。
3) 能否根据表的数据特征,确定哪些指标是影响人们患肾炎的关键或主要因素,以便减少化验的指
标。
4) 根据3的结果,重复2的工作。
5) 对2和4的结果作进一步的分析。(表见附录) 2、问题分析
1) 题目中表.1中给出了已经确诊为肾炎病人和健康人的各30组数据;
2) 每一组数据都有七个数,分别代表了Zn,Cu,Fe,Ca,Mg,K,Na在每个人体内的量;
3) 第一问要求我们提出判别一个人属于患者还是健康人的方法,这就需要通过对60组数据的分析
得出健康人和肾炎患者体中这些元素量之差异,这些差异的大小又同时是解决第三问的主要影响因素;
4) 在寻找数据的差异时,我们用到的传统方法就是求数据的方差和均值,用excel列表分析,用
matlab作直方图分析。
5) 第二问最可靠的方法就是用判别分析来做,这就需要在R软件中进行一些必要的编程和处理; 6) 第四问是建立在第三问的基础上的;当解决了第三问中到底是那些因素影响到了人们患肾炎的关
键时,只需要在那些主要因素中进行判断就可以省去一些复杂繁琐的步骤;
7) 将以上问题都解决之后,我们使用和步骤5)相同的方法,使用R软件帮助我们高效地对精简后
的数据进行再次分析,并且把第二问和第四问的结果之间进行比较,观察差异和详细的分析。 8) 为了进一步验证我们这种做法的合理性,我们又要用C语言编一个程序,把表B2中的数据与
4)中所求出各元素的均值进行比较,进行了一下直观的分析。
3.符号约定
后缀为1:患者体内元素的含量(例如:Zn1代表患者体内Zn的含量); 后缀为2:健康人体内元素的含量(例如:Zn2代表健康人体内Zn的含量); 1:患者; 2:健康人; 4.模型假设
1) 题中所给的内容和数据都是真实可信的;
2) 除了表中列出的元素外,其他元素对是否会患肾炎的影响很小; 3) 外界条件对肾炎患者的影响不计;
4) 没病的个体都是健康体。 5.模型建立
该问题的关键是如何判断一个人是有病的还是健康的,即这是个判别问题,可以采用统计方法中的判别分析法进行分析处理。题目中只有两类——病体和健康体,所以可采用二类群体的判别方法。
首先考虑用一种简单而直观的判别方法——Mahalanobis距离判别。根据两个母体样本计算出他们的均值向量和协方差阵,求取待测样本x对两个样本的Mahalanobis距离,二者取差值,判断离那个母体近似。
设x,y是从均值为μ,协方差阵为Σ的总体A中抽取的样本,则总体A内两点x与y的Mahalanobis距离定义为d(x,y)?(x?y)T??1(x?y).定义样本x与A的Mahalanobis距离为
d(x,A)?(x??)T??1(x??)。在现实中,母体的均值向量和协方差阵由样本的均值向量(1)(1)(2)(2)(2)
和协方差阵来代替:设x1(1),x2,……xn1是来自母体A的n1个样本,x1,x2,……xn2是来
1自母体A的n2个样本,则样本的均值与协方差为?i?x?ni?(i)??xj?1ni(i)j,i?1,2,,
ni2ni1??S1?S2,Si??(x(ji)?x(i))(x(ji)?x(i))T,i?1,2.对于待测样本x,如果两个??n1?n2?2i?1j?1j?1母体样本的协方差相同,由d2(x,B)?d2(x,A)得到判别函数为
??(x)?(x?x)T??1(x(1)?x(2)),其中x?x?x2(1)(2)???A,(x)?0,,其判别准则是x???。如果两??B,(x)?0.??个母体样本协方差不同,即?1??2,?1??2,对于样本x判别函数定义为:
?(x)?(x?x)??i?(2)T???12(x?x)?(x?x)(2)(1)T???11(x?x(1)),
1ni(i)1(i)(i)(i)T?(x?x)(x?x)?Si,i?1,2。 ?jjni?1j?1ni?1其次考虑用另外一种方法求取解决办法——Fisher判别法,即按类内方差尽量小,类间方差尽量大的准则来求判断函数。
设两个总体A、B的均值和协方差阵分别是?1、?2和?1、?2,对任一测样本x,设它的判别函数为u?u(x),并假设u1?E(u(x)x?A),u1?E(u(x)B),?1?Var(u(x)x?A),?2?Var(u(x)B),使
222u(x)满足类内偏差平方和W0??12??2最小,而类间偏差平方和B0?(u1?u)?(u2?u)最大,其中
22B1u?(u1?u2)。即u(x)要满足I?0最大,若u(x)?u1?u(x)?u2,则x?A,否则x?B。通过
W02
12ni(i)(i)1推导得出判别函数u(x)=dS(x?x),其中x???xj,x?ni?1j?1niT?1?xj?1ni(i)j,i?1,2,
Si??(xj?x(i))(xj?x(i))T,i?1,2,当u(x)?0,x?A,否则x?B。
j?1ni(i)(i)6.模型求解
利用模型求解时通过R软件将以上两种算法编写成程序代码,通过手动输入样本,利用计算机进行求解,程序清单如下: Mahalanobis距离判别:
A<-matrix(c(166,,,700,112,179,513,185,,,701,125,184,427,193,,,541,163,128,642,159,,,896,,239,726,226,,,606,152,,218,171,,,307,187,,257,201,,,551,101,,141,147,,,659,102,154,680,172,,,551,,,318,156,,,639,107,103,552,132,,,578,,1314,1372,182,,,767,111,264,672,186,,,958,233,,347,162,,,625,108,,465,150,,,627,140,179,639,159,,,612,190,,390,117,,,988,,136,572,181,,,1437,184,101,542,146,,,1232,128,150,1092,,,,629,,439,888,,,,370,,454,852,154,,,621,105,160,723,179,,,1139,150,,218,,,,135,,,182,175,,,807,123,,126,113,,,626,,168,627,,,,608,,,139,,,,421,,133,464,,,,622,,770,852,178,,,992,112,,169),ncol=7,byrow=T) B<-matrix(c(213,,,2220,249,,168,170,,,1285,226,,330,162,,,1521,166,,133,203,,,1544,162,,394,167,,,2278,212,,134,164,,,2993,197,,,167,,,2056,260,,237,158,,,1025,101,,,133,,,1633,401,180,899,156,135,322,6747,1090,228,810,169,,308,1068,,,289,247,,,2554,241,,373,166,,,1233,252,134,649,209,,,2157,288,,219,182,,,3870,432,143,367,235,,,1806,166,,188,173,,,2497,295,,287,151,,,2031,403,182,874,191,,,5361,392,137,688,223,,,3603,353,,479,221,,155,3172,368,150,739,217,,,2343,373,110,494,164,,,2212,281,153,549,173,,,1624,216,103,257,202,,,3785,225,,,182,,,3073,246,,109,211,,,3836,428,,351,246,,,2112,354,,195,164,,,2135,152,,240,179,,,1560,226,,330),ncol=7,byrow=T) X<-matrix(c,,,323,138,179,513,106,,,542,177,184,427,152,,,1332,176,128,646,,,,503,,238,,144,,,547,,,,,,,790,170,,,144,,,417,552,,,170,,,943,260,155,,176,,,318,133,,,192,,,1969,343,103,553,188,,,1208,231,1314,1372,153,,,328,163,264,,143,,,265,123,,,213,,,2220,249,,,192,,,1606,156,,168,171,,,672,145,,,162,,,1521,166,,133,203,,,1544,162,,,164,,,1062,161,,,167,,,2278,212,,,164,,,2993,197,,,167,,,2056,260,,,158,,,1025,101,180,,133,,,1633,401,228,289,169,,,1068,,,817,247,,,2554,241,,,185,,,1211,190,134,,209,,,2157,288,,,182,,,3870,432,143,,235,,,1806,166,,188),ncol=7,byrow=T)
discri1<-function(TrnA,TrnB,TstX=NULL,
=FALSE){//*TrnA,TrnB,TstX分别为有病,健康和待测得样本, 缺省值为FALSE,意思是以样本TrnA为参考 if(TstX)==TRUE)
TstX<-rbind(TrnA,TrnB)
nx<-nrow(TstX);blong<-array(0,c(nx))//*把待测样本数(30)给nx,建立一个向量值为0的1行30列的矩阵
Ab<-apply(TrnA,2,mean);Bb<-apply(TrnB,2,mean)//Ab为1行7列的矩阵,列向量为TrnA矩
阵对应列的所有数的均值,Bb同理
if==TRUE||==T){//两个样本的协方差相等时 S<-var(rbind(TrnA,TrnB));Xb<-(Ab+Bb)/2
?
ni2ni1//计算??S1?S2,Si??(x(ji)?x(i))(x(ji)?x(i))T,i?1,2. ??n1?n2?2i?1j?1j?1for(iin1:nx){
w<-(TstX[i,]-Xb)%*%solve(S,Ab-Bb);//得到判别函数值 if(w>0)
blong[i]<-1//待测体有病 else blong[i]<-2 } }
else{
Sa<-var(TrnA);Sb<-var(TrnB);//两个样本的协方差不等时 for(iin1:nx){
y<-TstX[i,]-Ab;z<-TstX[i,]-Bb
w=z%*%solve(Sb,z)-y%*%solve(Sa,y)//得到判别函数值 if(w>0) blong[i]<-1 else
blong[i]<-2 } }
blong }
discri1(A,B,X) Fisher判别:
A<-
//待测体没病