具有遗传性疾病和性状的遗传位点分析
![具有遗传性疾病和性状的遗传位点分析](https://img.360docs.net/img0c/11fiebs6r8kge2pjovhhsw6bvlt9tcad-c1.webp)
![具有遗传性疾病和性状的遗传位点分析](https://img.360docs.net/img0c/11fiebs6r8kge2pjovhhsw6bvlt9tcad-32.webp)
参赛密码
(由组委会填写)
“华为杯”第十三届全国研究生
数学建模竞赛
学校江苏科技大学
参赛队号
队员姓名1. 孙佳伟
2. 李袁
3. 李肇基
参赛密码
(由组委会填写)
“华为杯”第十三届全国研究生
数学建模竞赛
题目具有遗传性疾病和性状的遗传位点分析
摘要:
本文设计了基于属性重要度的选择算法,并通过SVM分类器构建出预测模型,对不同的位点和基因进行分析,判断每个位点或基因对某种疾病的预测精度,从而判断是否为致病位点或者致病基因。最后利用该算法和模型,预测出十种性状相关的致病位点。
问题1,针对每个位点有碱基对组成的性质,为了方面描述和分析,本文采用了十进制编码,每个位点的属性值可以通过0-9中的一个数进行表示,具体的编码格式,文中给出了详细的编码表。
问题 2,设计了基于属性重要度的特征选择算法,通过SVM分类器构建出预测模型,通过问题1中的特征表示方式,提取所有样本每列的特征,并对每列的特征属性进行重要度分析,进而判断该疾病与位点rs, rs,rs2486182,rs2274119,rs2235537相关。
问题 3,每个基因是由不同位点组成的集合,则每个基因的所有特征属性
即对应集合里位点特征属性的集合,利用问题2优化的模型,通过预测精度,对每个基因的对某疾病的重要度进一步分析得出,该疾病与致病基因gene_171相关。
问题 4,利用本文提出的模型,对10种性状中的每种性状中,继续通过属性重要度分析,识别出在不同性状中最有可能的致病位点,最后得出10个形状的相关致病位点分别为:rs, rs935075, rs2840758, rs1855786, rs2647168, rs, rs744834, rs4920522, rs, rs。
本文亮点是,提出基于属性重要度的选择算法,通过SVM构建出预测模型,利用网格搜索进行寻优,判断每列属性的重要度,从而判断致病位点或者致病基因。
关键词:属性重要度;SVM分类器;优化模型;位点(SNPs)
一问题重述
问题1,请用适当的方法,把中每个位点的碱基(A,T,C,G)编码方式转化成数值编码方式,便于进行数据分析。
问题2,根据附录中1000个样本在某条有可能致病的染色体片段上的9445个位点[1]的编码信息(见和样本患有遗传疾病A的信息(见文件)。设计或采用一个方法,找出某种疾病最有可能的一个或几个致病位点,并给出相关的理论依据。
问题3,同上题中的样本患有遗传疾病A的信息(文件)。现有300个基因,每个基因所包含的位点名称见文件夹gene_info中的300个dat文件,每个dat文件列出了对应基因所包含的位点(位点信息见文件。由于可以把基因理解为若干个位点组成的集合,遗传疾病与基因的关联性可以由基因中包含的位点的全集或其子集合表现出来请找出与疾病最有可能相关的一个或几个基因,并说明理由。
问题4,在问题二中,已知9445个位点,其编码信息见文件。在实际的研究中,科研人员往往把相关的性状或疾病看成一个整体,然后来探寻与它们相关的位点或基因。试根据文件给出的1000个样本的10个相关联性状的信息及其9445个位点的编码信息(见,找出与中10个性状有关联的位点。
二问题分析
问题1的分析
问题1提供的1000个样本,每个样本均有9445个位点,每个位点是一个碱基对,本文通过十进制对所有碱基对[2]进行编码,利用此特征表示方法,每个样本得到9445个属性,每个属性通过0-9中的数值进行表示。
问题2的分析
问题2和问题3都是要利用某种方法,进行致病位点和致病基因的检测,预测某种疾病的致病位点。预测该疾病相关的致病位点,其实就是判断不同位点对该疾病的影响程度,即判别每个位点的属性重要度。本文设计了基于属性重要度的选择算法,并利用SVM构建预测器,计算每个位点对疾病的预测精度,从而得到与该疾病相关的致病位点。
问题3的分析
问题3与问题2比较,问题2是识别与某疾病相关的致病位点,而某个基因是由多个位点组成的集合,问题3是识别某疾病相关的致病基因,为了识别致病基因,由于基因是由多个位点组成的集合,则基因的特征属性即多个位点特征属性组成的集合。利用每个基因的特征属性,通过问题2中设计的算法和构建的预测模型,从而识别与某疾病相关的致病基因。
问题4的分析
问题4中,人的某些疾病是和性状相关的,材料中提供了10种性状,要求判断与这10种性状的相关的致病位点。可以对每个性状分析,通过问题2种设计的选择算法和构建的预测模型,识别出某个性状相关的致病位点。
三模型假设和符号说明
模型假设
(1)假设给出的样本数据能分别代表整个的正常和患病群体。
(2)忽略寻优时SVM分类器本身造成的偏差。
(3)给出的位点和基因均是有效的位点和基因。
符号说明(未说明)
(1) A,C,G,T :DNA中的四种碱基
(2) Acc :即accuracy,预测精度
(3) PC
:第n个位点的属性
n
(4) S :特征属性子集
(5))
f:通过十进制编码得到位点子集的特征属性
(S
(6):第i个位点的属性,在第1组属性选择中进行融合
(7) Sig :即significant,属性重要度
四、模型建立与求解
问题1:每个位点碱基编码方式转化
数据分析
本文所使用位点测试数据集,来自1000个可能致病的染色体片段试验检测结果,标签分布为500个无病染色体使用0表示,500个患病染色体使用1表示,且每个致病染色体上有9445个碱基对,以此作为位点。
十进制编码
本文采用十进制{0,1,2,...9}编码将每个碱基对转化成数据编码方式,以便于数据分析。“AA”为“0”;“AC”为“1”;“AG”为2;“AT”为3...“TT”为9,详见碱基对编码表1(其中{AC,CA};{CG,GC};...碱基对表示方式相同)。
另外,位点中出现字符‘I’和‘D’,根据说明,分别用‘T’和‘C’代替问题2:找出与疾病最有可能相关的一个或几个位点
位点属性矩阵
由于所有样本序列上的本一个二核苷酸位点代表了一个属性,本文总共有9445个位点即9445个不同的属性,这些属性由十进制表示(见附图1)。其中,
属性列中PC
1~PC
n
表示9445个不同的属性指标;AA,AC,AG,AT,...,TT表示16
中不同的原始二核苷酸。
.........
......
...9 1 ... 89 4 ... 76 4 ... 76 1 ... 74 4 ... 79 4 (7)
rs10015rs5641rs21132
pc 1pc 2
pc n
图1 十进制编码编码碱基对
实验测试方法和分类器设计
1. 实验测试方法
K 折交叉验证、Jackknife (留一法)测试和独立数据集测试是三种常用的实验测试方法。在本试验中采取了K 折交叉验证,K 折交叉验证是指经过初始采样后将初始样本分割成K 个子样本,然后选择一个单独的子样本作为测试数据,剩下的K-1个样本用来训练模型。将这个交叉验证重复K 次,使得每个子样本都验证一次,将K 次结果取平均,得到一个估测结果。这个方法优势在于随机产生的子样本的训练和验证能够同时进行,每次的结果验证一次,本文采用了5折交叉验证。
2. 分类器设计
特征向量提取完成后便要面临对向量的分类问题,选取一个合适的分类器,将大大提高相关识别问题的精度,然而分类器研究至今出现了许多,例如贝叶
斯分类器[3],支持向量机(SVM )[4,5,6,7]
,K 近邻分类器[8,9,10]以及DeepLearning [11,12]
。在本篇论文中,我们采用支持向量机对样本进行分类。
支持向量机是由Vapnik 等根据统计学习理论提出的,在考虑结构风险最
小化原则和VC 维理论的基础上,在有限的样本信息中,寻找模型复杂性和学习能力的最佳折中点。这个分类方法在解决模式分类与非线性映射问题中非常适用。例如图2便是在二维平面中一个分类,线AB 上的点组成的向量就是这个样
本的支持向量,然而在多数情况下数据样本将不仅仅局限于二维,通常都是在高维空间中的样本,如图3,这时的支持向量是以面的形式表现出来。
图2 支持向量机二维原理图
图3 支持向量机高维原理图
在生物信息学中,非线性以及高维数据的处理十分常见,所以支持向量机在生物信息学的领域被广泛使用。因此本篇文章中,包作为支持向量机的实现。由于在非线性分类过程的有效性和速度,因为径向基核函数(RBF)利用网格搜索法优化了正则化参数和核参数,所以我们使用这个函数对样本进行预测。从支持向量机获得的概率得分被用来预测本次实验的最终结果。
评价标准
为了对我们的预测方法进行合理的评价,我们在考虑结果的准确性上,加入了相关系数,用这些数据对预测结果进行一系列评价。本文使用下列度量模型的性能进行了评价:准确度(Acc),它可以表示为
(1)
其中,TP 表示被正确判断为正样本的正样本数;FP 表示被错误判断为正样本的负样本数;TN 表示被正确判断为负样本的负样本数;FN 表示被错误判断为负样本的正样本数。
将公式(1)化简,并定义新的字符表示,化为如下形式:
(2)
用N ++代替TP ,N +-代替FN ,N --代替TN ,N -
+代替FP ,显然N N N ++++-=+,N +表示所有的正样本数。同理N N N ---
-
+=+,N -表示所有的负样本数。根据此式,我们可以很容易的得出以下的结构。
当N +-=N -
+=0时,即所有的样本都被正确判断时,Acc 1=;
当N N ++-
=且N N -
-+=时,即所有的样本都被错误判断时,Acc 0=;Acc 是对整个数据集的评价指标。所以我们在比较预测器性能的时候,主要对比Acc 的值。
基于属性重要度的选择算法设计
1. 属性重要度
问题1中通过十进制编码方法,对样本中9445个位点进行特征表示,得到9445个特征属性,且通过实验发现,多个属性的组合来进行该模型的预测可能比单个属性预测的结果要更高,但是并不是所有的属性都与该疾病有必然的联系,可能存在冗余的属性,即可能存在冗余的位点,本文设计一种基于属性重要的选择算法,通过属性选择的方式可以有效的去除冗余属性,提高判断的准确性,从而保障了预测的可靠性。
2. 属性选择算法
假设第n 列的属性记为PC n ,则全部9445个位点的属性集合为{PC 1,PC 2...PC n …PC 9445},选取位点属性子集为S ,通过问题1中的编码方式编码样本序列
特征记为)(S f 。
))S ((Acc }))PC {S ((Acc )PC ,S (Sig n n f f -+= (3)
公式(3)中的))((Acc S f 和}))PC {((Acc n S +f 分别表示,采用位点属性子集S 和性选择算法得到的子集}PC {n S +,利用SVM 构建的预测器的预测精度。
判断标准:(1)当Sig(S,PC n )>0,表明增加PC n 这列属性对模型预测性能的提高有积极的作用,其可以融合为多重属性并利用预测器进行下一步判断。且Sig(S,PC n )越大表明效果越好,属性重要度越高。
(2)当Sig(S,PC n )<0,表明增加的PC n 这列属性对模型的预测是不利的,影响模型的预测精度的提高,说明该属性为冗余属性。并且剔除该属性有利于模型预测精度的提高。
3. 基于选择算法的属性选择过程
取每列属性作为构建的预测器的输入,从而得到9445个位点中,每个位点利用该模型预测该疾病的预测精度Acc ,每个位点的预测精度如图4所示:
图4 每个位点的预测精度
过程(1):将预测器对n (n=9445)个位点属性中单个属性预测的精度降序排列,选取前k (k≤n)个Acc 结果,即为(“
”;“”;
“”;...“”;...;“”)。
过程(2):假设第i 个属性的测试结果为 “
”,第1次融合,将其
与剩下的 “9445-1”个属性进行融合成为二重属性,进行分类测试排序,得到
最大Acc 即为Acc (f (S+{PC i }))。Liyong 公式(3)对Sig(S,PC i )进行判断。若有利于模型预测精度的提高则进行过程(3);否则进行过程(5)。 过程(3):第2次融合,此时S 表示,过程(2)中S+{PC i },将新的属性集合S 余下的“9445-2”个属性进行融合成为三重属性,进行分类排序,得到最大Acc 即为Acc (f (S+{PC j }))。 利用公式(3)对Sig(S,PC j )进行判断。若对提高分类器性能有益则进行过程(4);否则进行过程(5)。
过程(4):第k (k≥3)次融合将Acc (f (S+{PC j }))与余下的“9445-k ”个属性进行融合成为“k ”重属性,进行分类排序,得到最大Acc 即为Acc (f (S+{PC k }))。 带入公式(3)对Sig(S,PC k )进行判断。若对提高分类器性能有益则k=k+1重复过程(4);否则进行过程(5)。
过程(5):通过增加该列属性时,模型的预测精度反而下降,说明该列属性为冗余属性,循环结束。如图5所示。
..第一次融合
第二次融合
第n 次融合
图5 属性选择流程
如图4-2-1,将每列属性单独作为样本属性,利用SVM 构建的预测器得到预测精度,并将每列属性预测得到的Acc 值降序排列,取前k 个Acc 的值,即为
(“”;“”;“”;...“”;...;“”)。分别以这k个值为第一个属性,与剩余的位点属性,通过基于属性重要度的选择算法进行特征融合,并利用SVM构建的预测模型求得准确率,若预测精度提高,则表明该列属性相对于所提出的模型是重要的,否则选择过程终止。
致病位点[13,14,15]的选择结果
通过属性重要度选择算法,分别以最大的k个预测精度所在的k个列作为第一个属性,分别与剩下的位点属性融合,得到k组预测与疾病相关的致病位点的集合,本文为了k的取值为10,预测的结果如表2所示:
表2 致病位点的选择结果
k值识别位点数位点名称Acc(%) 12rs,rs4391657
23rs271316,rs6702929,rs7534552
32rs717538,rs7530595
42rs369427,rs9426750
53rs,rs760941,rs620547
65rs,rs,rs2486182,
rs2274119,rs2235537
72rs2010397,rs2743979
83rs,rs1212652,rs
94rs2301488,rs,rs,rs191942
103rs,rs6690827,rs2789334
从表2的数据发现,不同的属性组合,模型的预测精度不同,通过该模型及属性选择算法得出与该疾病最相关的致病基因有5个,它们分别为rs,
rs,rs2486182,rs2274119,rs2235537。
问题3:找出与疾病最有可能相关的一个或几个基因
基因属性表示方式
由于可以把基因理解为若干个位点组成的集合,使用此位点集合构成的属性利用该预测器上进行测试所得到的结果必然与基因有关,遗传疾病与基因的关联性可以由基因中包含的位点的全集或其子集合表现出来。
致病基因选择过程
每个基因是由多个位点组成的集合,则每个基因的特征属性即对应集合中位点属性组合,材料中共给出300个基因,要求识别某疾病的致病基因,首先
对每个基因利用问题2中提出的预测器模型,求出每个单独的基因预测该疾病的预测精度,同样,将所有的预测精度Acc的值降序排列,选取前k个最大的精度值Acc,即(“”;“”;“”;...“”;...;“”)。
通过问题2的基于属性重要度的选择算法来选择不同的基因集合,同样,问题3中的k值也取10,分别以最大的Acc值所对应的基因,在剩下的基因里进行选择,若选择的基因构成的基因集合,能提高模型的预测精度,则说明该基因是有利于该模型对此疾病的预测,否则说明,该基因不利于该模型对此疾病的预测,此基因为冗余基因。
以这k个基因为首,利用公式(3)即基于属性重要度的选择算法来选择不同的基因集合,选择过程步骤和问题2中位点属性选择的过程相似,当选择新的基因组成的基因集合对模型的预测精度有提高,则说明该基因是与该疾病相关,属于致病基因。若新选择的基因组成的集合对模型的预测精度起副作用,则说明该基因与该类疾病无相关性,属于冗余基因,可约简该属性。
和问题2类似,问题3中的k值也取10,分别以最大的Acc值所对应的基因,在剩下的基因里进行选择,若选择的基因构成的基因集合,能提高模型的预测精度,则说明该基因是有利于该模型对此疾病的预测,最后得到10组与该疾病相关的致病基因组合,通过模型的预测精度判断,该疾病最有可能和哪个或者哪些致病基因相关。
致病基因选择结果
通过问题2中提出的属性重要度选择算法的衍生,问题3则利用相同的思路,设计基于基因重要度的选择,判别方法同样利用公式(3),又因为本文分别k(k=10)个最大Acc基因为首,利用选择算法来基因集合,从而得到10组基因集合,每组基因集合利用问题2提出的模型预测该疾病的准确率如表3所示:
表3 致病基因的选择结果
K值识别基因数基因名称Acc(%)
11gene_171
21gene_16
表3表明,不同基因组合对预测该疾病的精度是不同的,前10组集合中,该疾病最有可能与gene_171致病基因相关。
问题4:找出与10个性状相关的一个或几个位点
材料中给出1000个样本相关的10个性状,本文分别对这10个性状进行分析,同样利用属性重要度选择算法及SVM构建的预测模型,判断出每个与每个性状最为相关的位点,最后得到10个与这10个性状相关的位点,他们分别为rs, rs935075, rs2840758, rs1855786, rs2647168, rs, rs744834, rs4920522, rs, rs。这10个位点对于预测精度如图6所示:
图6 10个性状相关的位点
这10个性状,对应相关的位点和预测精度,如表4所示:
从表4发现,这10个性状与这10和位点最为相关。每个相关的位点是通过提出的属性选择算法和SVM构建的预测模型预测得到的,最后发现这十个性状与rs, rs935075, rs2840758, rs1855786, rs2647168, rs, rs744834, rs4920522, rs, rs这些位点相关。
本文在进行问题分析时,设计了基于属性重要度特征选择算法,利用SVM 构建预测器,利用十进制编码位点和基因信息,利用构建的模型进行疾病的预测,抽取能提高模型预测精度的位点属性集合和基因集合,从而得到与该疾病相关的致病位点或者致病基因。问题4中的性状分析,通过提出的算法及模型,对每个性状进行分析,识别出每个性状最为相关的致病位点,最后得到这10种性状最为相关的所有位点。
五模型的优缺点
模型的优点:
1.采用十进制编码方式,对每个位点的碱基对进行编码,通过0-9当中的一个属性值来对每个位点进行特征表示。
2.设计基于属性重要度的特征属性选择算法和通过SVM分类器构建了预测器
3.通过预测精度accuracy指标来衡量每个位点属性或者每个基因属性对预测
某种疾病的重要度。
模型的缺点:
1.本文设计的属性重要度选择算法和设计的模型来选择位点属性或者基因属性时是按照自己规则,由于从9445个位点中选择n个位点属于NP问题,模型没有很好地考虑这9445个位点整体之间的关联性。
2.同样设计的算法及SVM构建的模型对基因的选择,也全部基因之间的关联性考虑有所欠缺。
3.本文通过SVM构建的分类器在进行网格搜索寻优时,参数的选择可能可能导致寻优范围不够大,没有寻得最优的结果。
六参考文献
[1] Antonio . Marcolino, William F. Porto. Structural impact analysis of missense SNPs present in the uroguanylin gene by long-term molecular dynamics simulations. Journal of Theoretical Biology:Volume 410, 7 December 2016, Pages 9–17.
[2] Peisan Leea, Ju-Chi Liuc, Ming-Hsiung Hsiehd. Cloud-based BP system integrated with CPOE improves self-management of the hypertensive patients: A randomized controlled https://www.360docs.net/doc/0714895162.html,puter Methods and Programs in Biomedicine:Volume 132, August 2016, Pages 105–113.
[3] Tzu-Tsung Wong, , Chao-Rui efficient parameter estimation method f or generalized Dirichlet priors in na?ve Bayesian classifiers with multinomial models:Pattern Recognition.Volume 60, December 2016, Pages 62–71.
[4] Vapnik VN. The nature of statistical learning theory[M].2nd edition. New York: Springer, 1995.
[5] Cristinaini N, Shawe-Taylor J. An introduction to Support Vector Machines and other Kernel-based learning methods[M].Beijing: Electronic Industry Press, 2004:82-108.
[6] Zhang Yanping, Zhang Ling. Machine learning theory and algorithms [M].Beijing: Science Press,201
[7] Jian-wei Liu, Li-peng Cui , Xiong-lin Luo .MCR SVM classifier with group sparsity:Volume 127, Issue 17, September 2016, Pages 6915–6926
[8]Piero Baraldi, Francesco Cannarile,Hierarchical k-nearest neighbours classification and binary differential evolution for fault diagnostics of automotive bearings operating under variable conditions.Engineering Applications of Artificial Intelligence:Volume
56, November 2016, Pages 1–13.
[9] Jesus Maillo,, Sergio Ramírez. kNN-IS: An Iterative Spark-based design of the k-Nearest Neighbors classifier for big data.Knowledge-Based Systems:
Available online 14 June 2016.
[10] Joe L. Villa Medina, Ricard Boqué. Bagged k-nearest neighbours classification with uncertainty in the variables. Analytica Chimica Acta:
Volume 646, Issues 1–2, 30 July 2009, Pages 62–68
[11] Arash combined deep-learning and deformable-model approach to fully automatic segmentation of the left ventricle in cardiac MRI.Medical Image Analysis:Volume 30, May 2016, Pages 108–119.
[12] Breiman L. Random forests[J].Machine Learning. 2001,45:5-32.
[13] Van Steen the world of gene-gene interactions[J]. Briefings in bioinformatics, 2011:bbro12.
[14] Kai Shi,Lin Gao. Systematic tracking of coordinated differential network motifs identifies novel disease-related genes by integrating multiple data.Neurocomputing:Volume 206, 19 September 2016, Pages 3–12.
[15] Panagiota I. Kontou, Athanasia Pavlopoulou. Network analysis of genes and their association with diseases.Gene:Volume 590, Issue 1, 15 September 2016, Pages 68–78.
下面是三个附件,分别展示问题2,问题3,和问题4的代码
附件1:问题2的代码
1.问题2中主函数的MATLAB代码
close all;
clear;
clc;
%% 加载十进制编码9445个位点的所有属性
load nowenary_encoding_feature
train_attr=all_feature;
Pdata=zeros(500,1);Pnum=size(Pdata,1);
Ndata=ones(500,1);Nnum=size(Ndata,1);
%%数据属性归一化处理
[dataset_scale,ps] = mapminmax(train_attr',0,1);
data_attr = dataset_scale';
W=size(data_attr,2);
train_label = vertcat( zeros(Pnum,1),ones(Nnum,1) );
%% 循环每个位点,利用每列属性进行该疾病的预测,得到预测精度
for w=1:W
K=3;
org_accuracy=zeros(K,1);
for i=1:K
data_attr1=horzcat(data_attr(:,1),data_attr(:,w)); Acc = random_5fold( Pdata, Ndata,data_attr1);
org_accuracy(i,1)=mean(Acc);
end
accuracy=mean(org_accuracy);
max_ACC(w).acc=accuracy;
save liblinear_result_1shu max_ACC
end
order_result=[];
%% 对预测结果降序排列,即预测精度 accuracy 从高到低排列
[x1,x2]=sort(result,'descend');
for i=1:W
order_result=[order_result,result(x2(i))];
end
save order_result order_result x2
%% 选出最大的预测精度,及该最大预测精度所在的位点
ACC=-1;
L=size(max_ACC,2);
for i=1:L
if max_ACC(i).acc>ACC
ACC=max_ACC(i).acc;
row=i;
end
end
save select_result2_3ACC row
2. 功能函数代码:
function [ Acc ] = random_5fold( Pdata, Ndata, data_atrr) Pnum=size(Pdata,1);
Nnum=size(Ndata,1);
indices1 =crossvalind('Kfold',Pnum,5);
indices2 =crossvalind('Kfold',Nnum,5);
Acc=[];
for i=1:5
Ptest = (indices1 == i);
Ptrain = ~Ptest;
Ntest = (indices2 == i);
Ntrain = ~Ntest;
Ztrain=[Ptrain;Ntrain];
Ztest=[Ptest;Ntest];
%% 选出数据集训练属性和测试属性
test_attr=[];
train_attr =[train_attr;data_atrr(find(Ztrain==1),:)];
test_attr =[test_attr;data_atrr(find(Ztrain==0),:)];
%% 训练集和测试集中的正样本
Ptrain_data=[];
Ptest_data=[];
Ptrain_data=[Ptrain_data; Pdata(find(Ptrain==1))];
Ptest_data=[Ptest_data; Pdata(find(Ptrain==0))];
%% 训练集和测试集中的负样本
Ntrain_data=[];
Ntest_data=[];
Ntrain_data =[Ntrain_data; Ndata(find(Ntrain==1))];
Ntest_data =[Ntest_data; Ndata(find(Ntrain==0))];
%% 训练集的标签
train_label = vertcat( Ptrain_data, Ntrain_data);
%% 测试集的标签
test_label = vertcat( Ptest_data, Ntest_data);
%% 通过SVM构建的预测器,训练集训练模型
model = train(train_label,sparse(train_attr));
%% 通过SVM构建的预测器,测试集预测精度
[predict_label,accuracy,values]=predict(test_label,sparse(test_attr), model);
Acc=[Acc,accuracy(2,1)];
end
end
附件2:问题3的代码
1.问题3中主函数的MATLAB代码:
close all;
clear;
clc;
%% 加载十进制编码9445个位点的所有属性
load nowenary_encoding_feature
%% 读取对应文件下的300个基因
path=dir('F:\数模比赛\B\problem3\gene_info\*.dat');
[paths, ind] = sort([path(:).datenum], 'ascend');
path = path(ind);
Pdata=zeros(500,1);Pnum=size(Pdata,1);
Ndata=ones(500,1);Nnum=size(Ndata,1);
L=size(path,1);
count=1;
%% 循环每个基因,利用每列属性进行该疾病的预测,得到预测精度
for i=1:L
filename = path(i).name;
name = importdata(filename);
num=size(name,1);
data_attr1=all_feature(:,count:count+num-1);
data_attr2=horzcat(data_attr,data_attr1);
%%通过计算每个基因预测该疾病的准确率accuracy,取3次,取平均值 K=3;
org_accuracy=zeros(K,1);
for j=1:K
Acc = random_5fold( Pdata, Ndata,data_attr2);
org_accuracy(j,1)=mean(Acc);
end
accuracy=mean(org_accuracy);
class(i).acc=accuracy;
class(i).name=filename;
count=count+num;
end
save liblinear_result_gene1_2class
%% 选出最大的预测精度,及该最大预测精度所对应的基因
ACC=-1;
L=size(class,2);
for i=1:L
if class(i).acc>ACC
ACC=class(i).acc;
row=i;
end
end
save select_result_gene1_2ACC row
2. 功能函数代码:
function [ Acc ] = random_5fold( Pdata, Ndata, data_atrr)
Pnum=size(Pdata,1);
Nnum=size(Ndata,1);
indices1 =crossvalind('Kfold',Pnum,5);
indices2 =crossvalind('Kfold',Nnum,5);
Acc=[];
for i=1:5
Ptest = (indices1 == i);
Ptrain = ~Ptest;
Ntest = (indices2 == i);
Ntrain = ~Ntest;