2023年 华为杯数学建模 E题

本科大三的时候,打过一次美赛,当时租了一个民宿,和队友一起度过了专注的四天。当时比赛结束之后,拿着手机,看到四天没回的消息,四天没刷过的朋友圈,有种很新奇的感觉,谢谢美赛给了我消失的自由。

入学后,九月的时候,师姐邀请室友和我打华为杯。美赛的时候,我是论文手,感觉收获不大,不止一次后悔过为什么不平时多敲点代码,争取当编程手,或者辅助编程手。一年半中,我确实看了或敲了不少代码,这次比赛我主动请缨想写代码。嗯,还是建模写代码有意思多了。

由于我和室友周一周二有课,所以我们一开始就确定下来,要早点确定选题,并争取前三天周五到周日的时候,把题目做完。22号早上,我八点就守到电脑前准备接收赛题了,但是网络拥堵,八点二十队长才把赛题下载下来,上午经过简单的讨论,我们和一开始计划的一样,选了确保我们能够做出来的,预测类的数据分析题E题。

我和队长一起负责建模和编程,我们会一起讨论每道题的做题思路,然后每个人依次负责下一道需要做的题。在这里我们分享一下我主要负责的题1b,2b,2d和3b的思路。

1b)请以是否发生血肿扩张事件为目标变量,基于“表1” 前100例患者(sub001至sub100)的个人史,疾病史,发病及治疗相关特征(字段E至W)、“表2”中其影像检查结果(字段C至X)及“表3”其影像检查结果(字段C至AG,注:只可包含对应患者首次影像检查记录)等变量,构建模型预测所有患者(sub001至sub160)发生血肿扩张的概率。

注:该问只可纳入患者首次影像检查信息。

这道题需要用到1a的结果作为label,利用题目中指定的表1,2,3的特征做预测。表1是个人史和疾病史,一共给定的二十列中有17列都是0,1表示的二分类离散变量,表2(血肿的位置分布),表3(血肿的形状、颜色)是高维离散数据。题目一共只给了160个样本,并且只有100个是训练样本。针对本题数据小样本高维度的特点,我选择先对连续变量使用PCA降维。对于离散数据和连续数据使用两个不同的模型训练后集成起来。最后,离散数据选择的是l1正则项的逻辑回归,连续数据选择的是随机森林。

import pandas as pd
from sklearn.decomposition import PCA
#主成分分析降维及数量选择.

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 数据缩放
scaler = StandardScaler()
X_2_scaled = scaler.fit_transform(X_2)

# 使用PCA降维
pca = PCA()
data_pca = pca.fit_transform(X_2_scaled)

# 设定阈值
threshold = 0.98

# 计算主成分数量
explained_variance_ratio = pca.explained_variance_ratio_.cumsum()
n_components = (explained_variance_ratio < threshold).sum() + 1

# 输出信息
print("Variance Threshold: ", threshold)
print("Number of Principal Components: ", n_components)

# 得到降维后的数据
X_2_reduced = data_pca[:, :n_components]


#模型训练及预测

#交叉验证训练单模型
import xgboost as xgb
from sklearn.linear_model import LogisticRegression

scaler = StandardScaler()

model = xgb.XGBClassifier() 
model = LogisticRegression(penalty='l1', solver='liblinear') 
pipeline = Pipeline([
     ('scaler', scaler),
    ('model', model)
])

# 交叉验证
ss = ShuffleSplit(n_splits=5, test_size=0.2, random_state=43)  # 每次交叉验证中随机抽样20%的数据
scores = cross_val_score(pipeline, X_1, y, cv=ss, scoring='accuracy')

# 输出交叉验证准确率
print(f'Cross-Validation Accuracy Scores: {scores}')
print(f'Average Cross-Validation Accuracy: {scores.mean()}')



#集成模型
predictions1 = model1.predict_proba(X_1)  # 模型1的预测概率
predictions2 = model2.predict_proba(X_2)  # 模型2的预测概率

# 集成两个模型的预测概率,这里以平均值为例
#0.8 1.2
ensemble_predictions = (0.5*predictions1 + 1.5*predictions2) / 2

2b)请探索患者水肿体积随时间进展模式的个体差异,构建不同人群(分亚组:3-5个)的水肿体积随时间进展曲线,并计算前100个患者(sub001至sub100)真实值和曲线间的残差。

这道题我的理解是,每个患者的水肿体积随时间的变化可以绘制一条曲线,对这些曲线做聚类,得到几类不同的变化模式。然后分别统计每类变化模式的人群的特点,比如年龄,是否患高血压。

首先是曲线的绘制,横轴是时间,纵轴的水肿的体积。我们需要根据每位患者的几次检查的时间和体积,绘制曲线。由于每个患者的变化情况都不同,所以如果要用时间序列拟合曲线的话,需要分别对100个患者确定做一百次平稳性检验,确定一百个不同的ARIMA参数,所以放弃了这个思路。我选择直接用多项式做拟合。由于从第一问绘制的图可以看出,大多数曲线都呈现上升后下降的变化趋势,加上数据点只有几个,所以选择的多项式的阶数为2。最终用二阶多项式对100个患者绘制的曲线如下:

对曲线聚类是这道题的难点,因为患者做随访检查的次数,时间都不同。我们需要同一时间跨度后在进行聚类。最开始的想法是,对每条曲线都等间隔取若干点,用这些点代表曲线,送入kmeans做聚类。但是效果不怎么好,95个点都被分为了同一类。

第二天早上,我睡醒之后思考,效果不好的原因在于,只用50个点,并不能很好的代表二次曲线。对于每条二次曲线,我最关注的点有两个:一是曲线最后的趋势是上升还是下降,因为这决定了患者最后的情况是恶化还是好转;而是,在患者最后恶化或者好转的趋势前,是否还有其他趋势,比如先好转再恶化,或者先恶化再好转。而这两个点正好分别由二次曲线的a(开口方向和大小)和对称轴-b/2a(单调性变化的位置是大于0还是小于0)决定。所以最后是使用(a,-b/2a)代表每条曲线,聚类的效果优于前一种方式。

2d)请分析血肿体积、水肿体积及治疗方法(“表1”字段Q至W)三者之间的关系。

首先统计发现每次检查的血肿体积和水肿体积都近似正态分布,所以计算了两者的皮尔逊相关系数。其次使用血肿体积和水肿体积预测治疗方法,发现能够较为准确的预测,说明三者具有相关性。

3b)根据前100个患者(sub001至sub100)所有已知临床、治疗(表1字段E到W)、表2及表3的影像(首次+随访)结果,预测所有含随访影像检查的患者(sub001至sub100,sub131至sub160)90天mRS评分。

3b和3a的差别在于,补充了随访数据。虽然只是补充了随访数据,但是每次随访都包含了将近100个特征,所以如何使用正确的方式降维是这个问的重点。由于随访数据是一个时间序列,所以如果直接把所有数据拼接起来的话会损失时间信息。假设每次随访有100个特征,如果直接把所有特征直接拼接起来的话,其实第一列和第一百零一列是同一个特征在不同时间点的取值,而直接拼接会损失这个信息。所以我一开始的想法是,对于每个患者的三次随访数据,竖着拼接起来。每个患者的数据原本是1*300,我把第一列,第一百零一列,第二百零一列的数据竖着拼在一列,把每个患者的数据变成[3*100]的格式。但是由于没有找到适合二维数据的降维方法,所以这个思路失败了。


结果出来了,是二等奖,也算给三天四晚的付出一个不错的回答吧,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Valgrind——程序分析工具

目录 Valgrind一.摘要二.安装Valgrind三,简单上手和分析程序1(C程序):使用未初始化的内存程序2(C程序):在内存被释放后进行读/写程序3(C程序): 内存泄露程序4(C程序): 不匹配使用malloc free 和 new delete程序5(C程序): 两次释放内存 四.Qt中使用Valgrind五.内存泄露分析 Valg…

KTV如何创新?VR全景打造KTV趣味互动新体验

我们都知道传统的平面静态图都是可以进行滤镜美化的&#xff0c;因此大部分用户无法在手机上分辨出商家发布的信息是否真实。由此就造成很多人在网上订购了KTV包间&#xff0c;实地一看却是小破旧&#xff0c;大呼上当了&#xff0c;那么VR全景KTV的应用展示方式&#xff0c;又…

C嘎嘎模板

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是模板&#xff0c;并且能熟练运用函数模…

拦截器与过滤器的区别

优质博文&#xff1a;IT-BLOG-CN 拦截器Interceptor和过滤器Filter都是基于AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;思想实现的&#xff0c;用来解决项目中某一类问题的两种“工具”&#xff0c;两者在使用上有时候可能会分不清&…

【MySQL】表的增删改查(基础)

一、新增&#xff08;Create&#xff09; 先创建一张表&#xff1a; create table student (id int,sn int comment 学号,name varchar(20),email varchar(20));1.1 单行数据 全列插入 插入两条记录&#xff0c;value_list 数量必须和定义表的列的数量及顺序一致 insert i…

4、智能家居框架设计和代码文件工程建立

目录 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 SourceInsight创建新工程步骤 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 创建一个名为si的文件夹用于保存SourceInsight生成的文件信息&#xff0c;然后在SourceInsig…

【软考篇】中级软件设计师 第四部分(一)

中级软件设计师 第四部分&#xff08;一&#xff09; 二十九. 程序设计语言概述29.1 解释、编译29.3 编译程序29.4 后缀式29.5 文法定义29.6 正规式29.7 有限自动机29.8 语法分析方法 三十. 法律法规30.1 作品所属权30.2 商标有效期30.3 职务作品所属权30.4 单位与委托30.5 商标…

Redis:详解5大数据类型及其常用命令

目录 Redis键&#xff08;key&#xff09;字符串&#xff08;String&#xff09;简介常用命令数据结构简介常用命令 列表&#xff08;List&#xff09;简介常用命令数据结构 集合&#xff08;Set&#xff09;简介常用命令数据结构 哈希&#xff08;Hash&#xff09;简介常用命令…

基于安卓android微信小程序的装修家装小程序

项目介绍 巧匠家装小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要实现的功能后进行界面的设计&#xff0c;在这中间还要考虑如何可以更好的将功能及页面进行很好的结合&#xff0c;方便用户可以很容易明了的找到自己所需要的信息&#xff0c;还有系…

SOLIDWORKS Flow Simulation阀门内流体仿真

Flow Simulation 导读 阀门作为输送系统中的控制设备其主要功能是接通管路中的流体介质,又或是调节流体的流量、压力等&#xff0c;在阀门的设计中&#xff0c;流量系数Cv,Kv&#xff0c;以及流阻系数都是基本参数&#xff0c;本节将讲解通过SOLIDWORKS Flow Simulation在三维…

lxml基本使用

lxml是python的一个解析库&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;它最初是用来搜寻XML文…

Netty实战专栏 | NIO详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Netty实战专栏 ✨特色专栏&#xff1a…

C语言之深入指针(二)(详细教程)

C语言之深入指针 文章目录 C语言之深入指针1. 传值调用和传址调用2. 数组名的理解3. 使用指针访问数组3. ⼀维数组传参的本质 1. 传值调用和传址调用 写一个函数用来交换a b的值 传值调用&#xff1a; #include <stdio.h> void Swap1(int x, int y) {int tmp 0;tmp x;…

第十八章 Swing程序设计

Swing用于开发桌面窗体程序&#xff0c;是JDK的第二代GUI框架&#xff0c;其功能比JDK第一代GUI框架AWT更为强大、性能更加优良。但因为Swing技术推出时间太早&#xff0c;其性能、开发效率等不及一些其他流行技术&#xff0c;所以目前市场上大多数桌面窗体程序都不是由Java开发…

rabbitmq 集群搭建

RabbitMQ集群介绍 RabbitMQ集群是一组RabbitMQ节点&#xff08;broker&#xff09;的集合&#xff0c;它们一起工作以提供高可用性和可伸缩性服务。 RabbitMQ集群中的节点可以在同一物理服务器或不同的物理服务器上运行。 RabbitMQ集群的工作原理是&#xff0c;每个节点在一个…

12-使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Python杂谈--关于iter迭代器的一些讨论

首先我们来看下面一段代码&#xff1a; for i in range(5):print(i) 这是一段非常简单的代码&#xff0c;它会打印出“0-5”这五个数字。 此时在range()迭代器中&#xff0c;它的start为空(默认为无穷小)&#xff0c;stop为5&#xff0c;step为空(默认为1)。 此时我们在看下…

hidl hwbinder和binder混合使用相关的joinThreadPool问题解答

背景&#xff1a; 今天一个学员在群里有个提问如下图&#xff0c;怎么有两个joinThread&#xff0c;会执行么&#xff1f;joinThread不是死循环等待数据吗&#xff1f; /frameworks/av/media/mediaserver/main_mediaserver.cpp 当开始看到这个时候确实也觉得最后的hw的join根本…

电脑篇——将串口映射到远程电脑上

通过Windows自带的远程桌面连接功能&#xff0c;可以通过修改本地资源选项&#xff0c;将本机的串口/端口映射到远程电脑上。 即可将端口映射到远程电脑上。 &#xff08;在远程的电脑的设备管理器中可能不会显示&#xff0c;但是用串口调试相关的工具&#xff0c;是可以找到相…