大家好呀,从昨天发布赛题一直到现在,总算完成了认证杯二阶段C题完整的成品论文。
本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。
C第二阶段完整论文共64页,一些修改说明7页,正文47页,附录10页。
认证杯C题二阶段与一阶段最大的区别是题目给出了具体的类别,这样就可以机器学习进行分类预测了,首先当然还是合并数据提取特征,之后我先建立了原始的分类模型,也就是对6个分类直接预测,精度较低,但可以给出误判虚警的计算表,也可以为后面做铺垫。之后是最危急情境和其他情境分别做两个分类预测模型,测试集精度提升很多,这里我在论文会有一页的获奖点说明,拿到论文的人好好看。第二问的话要细化分类,还是聚类分析,第二问最难的是聚类分析指标选取后结合题目给出的各种失常细类的医学机理分析,这里我花了3个小时分析各个细类的特征机理,之后就结合着无脑聚类了,至此一个片段第一问能判断分类,第二问能判别细化分类,求解完成。
实在精力有限,没力气打太多字做文字版讲解了,可能讲得不够详细,可以看我的视频讲解:
2023认证杯数学建模第二阶段C题手把手保姆级完整教学!_哔哩哔哩_bilibili
本文很长,大家一口气看不完别忘了点赞收藏一下防止迷路哈。
OK,这里是我的
目录:
摘要:
第二阶段问题: 心电数据经过专家的仔细判读,被分成了几个心律失常的类 别。数据文件根据判读结果进行了重新的命名。并根据其危险程度分为 6 个 级别,危险程度依次递降:
1. 危及生命的心律失常,需要立即抢救:心室扑动(VFL);心室颤动(VF)。
2. 危及生命的心律失常:尖端扭转型室性心动过速(VTTdP)。
3. 威胁生命的室性心律失常:高频室性心动过速(VTHR)。
4. 有潜在危险的室性心律失常:低频室性心动过速(VTLR);室性早搏二 联律(B);高度室性异位搏动(HGEA);室性逸搏心律(VER)。
5. 室上性心律失常:心房颤动(AFIB);室上性心动过速(SVTA);窦性心动 过缓(SBR);一级传导阻滞(BI);结性心律(NOD)。
6. 无显著危险的以及正常的窦性心律:窦性心律伴束支阻滞(BBB);伴单次期外收缩的窦性心律(Ne);正常窦性心律(N)。
问题 1:
我们希望对危险程度构造一个分类算法并部署在心电图机上,当遇 到对生命有威胁的情况时可以发出告警。对危急情境的判断时间不能超过 2 秒,所以只能使用数据集中的数据进行验证(数据集中的每个数据文件都由 时长为 2 秒的心电片段处理而来),而且如需提取数据的时域特征,不允许对 数据在时域上进行周期延拓等操作。当然判断时间可以比 2 秒更短。对威胁 级别的判断降低 1 级(如将 3 级误判为 4 级)称为轻微误判,降低 2 级及以上 (如将 3 级误判为 5 级)称为严重误判,升高 1 级称为轻微虚警,升高 2 级或以上称为严重虚警。我们至少要求,对最危急的情境(第 1,2 级),判断的灵敏度 (sensitivity)和特异度(specifity)均不能低于本数据集能计算的最大值(即使用本数据集无法算出其与 1 的区别)。对其他危险等级的情境,请你和你的团队根据医疗实际(可以使用以上给出的概念),对算法的性能提出合理的要求。并建立有效的数学模型,构造分类算法满足此要求。
首先合并数据:
每一个类别都要合并,例如第一个类别:
提取特征:
提取后先建立6个类别的原始分类模型:
实际分类预测:
预测精度:
预测分类结果:
计算可以得到误判和虚警情况表:
实际上要判别的最危急情境:
预测结果:
训练集达到1,已经是本数据集能计算的最大的灵敏度 (sensitivity)和特异度(specifity)。
测试集相对于原始分类模型有很大提升。
论文里这里我写了个获奖点说明:
看一下分类预测结果表吧:
测试集一共是305条:
针对于其他危险等级的情境:
一样的步骤,先划分类别:
然后机器学习分类即可,看一下预测结果吧:
精度相对于原始分类模型也有很大提升。第一问结束。
问题2:
我们希望在问题 1 的基础上,进一步对不同类型的心律失常进行判 别。最终的判别算法要满足问题 1 中的要求,并在每个危险级别中进行具体的分类。请你和你的团队建立合理的数学模型以构造对不同类别心律失常的分类算法,并对算法的性能作出详细的评述。
这一问最难的是要确定到底用什么特征去划分这些细类:
针对于这些细类,特征又应该怎么排序。
举个例子,如果你用每个片段的均值去进行划分,那你首先要从医学机理的角度分析,这里面每一个细类的均值到底有没有差别,以及如果有,那么每个细类到底谁的片段数据的均值更大?
所以,难点在于,要搜集和阅读大量的关于这里面每一个细类的医学机理分析说明,这里我花了整整3个多小时研究每一个细类的心电图,做了每个类别的医学机理分析:
之后就是聚类分析了:
至此,在导入任意一个片段数据后,我们不但可以通过第一问的机器学习算法得出其最危急情境和其他情境的分类判别,还可以在判别之后,通过我们所建立的聚类分析模型中判别其具体所属的细类划分。
OK结束。
附一些模板代码吧:
注意,不是我实际求解用的哈:
function [tree,discrete_dim] = train_C4_5(S, inc_node, Nu, discrete_dim) % Classify using Quinlan's C4.5 algorithm % Inputs: % training_patterns - Train patterns 训练样本 每一列代表一个样本 每一行代表一个特征% training_targets - Train targets 1×训练样本个数 每个训练样本对应的判别值% test_patterns - Test patterns 测试样本,每一列代表一个样本 % inc_node - Percentage of incorrectly assigned samples at a node 一个节点上未正确分配的样本的百分比% inc_node为防止过拟合,表示样本数小于一定阈值结束递归,可设置为5-10% 注意inc_node设置太大的话会导致分类准确率下降,太小的话可能会导致过拟合 % Nu is to determine whether the variable is discrete or continuous (the value is always set to 10) % Nu用于确定变量是离散还是连续(该值始终设置为10)% 这里用10作为一个阈值,如果某个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的% Outputs % test_targets - Predicted targets 1×测试样本个数 得到每个测试样本对应的判别值% 也就是输出所有测试样本最终的判别情况%NOTE: In this implementation it is assumed that a pattern vector with fewer than 10 unique values (the parameter Nu) %is discrete, and will be treated as such. Other vectors will be treated as continuous % 在该实现中,假设具有少于10个无重复值的特征向量(参数Nu)是离散的。 其他向量将被视为连续的train_patterns = S(:,1:end-1)'; train_targets = S(:,end)'; [Ni, M] = size(train_patterns); %M是训练样本数,Ni是训练样本维数,即是特征数目inc_node = inc_node*M/100; % 5*训练样本数目/100if isempty(discrete_dim) %Find which of the input patterns are discrete, and discretisize the corresponding dimension on the test patterns %查找哪些输入模式(特征)是离散的,并离散测试模式上的相应维discrete_dim = zeros(1,Ni); %用于记录每一个特征是否是离散特征,初始化都记为0,代表都是连续特征,%如果后面更改,则意味着是离散特征,这个值会更改为这个离散特征的无重复特征值的数目 for i = 1:Ni %遍历每个特征Ub = unique(train_patterns(i,:)); %取每个特征的不重复的特征值构成的向量 Nb = length(Ub); %得到无重复的特征值的数目if (Nb <= Nu) %如果这个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的 %This is a discrete pattern discrete_dim(i) = Nb; %得到训练样本中,这个特征的无重复的特征值的数目 存放在discrete_dim(i)中,i表示第i个特征% dist = abs(ones(Nb ,1)*test_patterns(i,:) - Ub'*ones(1, size(test_patterns,2))); % %前面是把测试样本中,这个特征的那一行复制成Nb行,Nb是训练样本的这个特征中,无重复的特征值的数目% %后面是把这几个无重复的特征值构成的向量复制成测试样本个数列% %求这两个矩阵相应位置差的绝对值% [m, in] = min(dist); %找到每一列绝对差的最小值,构成m(1×样本数目) 并找到每一列绝对差最小值所在行的位置,构成in(1×样本数目)% %其实,这个in的中每个值就是代表了每个测试样本的特征值等于无重复的特征值中的哪一个或者更接近于哪一个% %如=3,就是指这个特征值等于无重复的特征值向量中的第3个或者更接近于无重复的特征值向量中的第3个% test_patterns(i,:) = Ub(in); %得到这个离散特征end end end
以上我所有用到的数据表格和求解的结果表格如下:
OK,就讲到这里吧,实在太累了,讲解得可能不够详细,详细的讲解视频,以及以上所有的数据表格和完整成品论文大家点击下方我的个人卡片查看哈↓: