寿光做网站的淘宝网页制作代码

张小明 2025/12/30 12:23:55
寿光做网站的,淘宝网页制作代码,太原网站建设随州,中国做视频网站有哪些内容深度生存网络入门教程#xff1a;从生存分析到端到端建模 引言 在医疗、金融、工业等领域#xff0c;我们常关注**“事件发生时间”**问题#xff1a; 医疗#xff1a;癌症患者的生存期#xff08;“多久会去世”#xff09;#xff1b;金融#xff1a;客户的违约时间从生存分析到端到端建模引言在医疗、金融、工业等领域我们常关注**“事件发生时间”**问题医疗癌症患者的生存期“多久会去世”金融客户的违约时间“多久会拖欠贷款”工业设备的故障时间“多久会损坏”。这类问题的核心挑战是**“删失数据”**——部分样本的事件未发生比如研究结束时患者还活着传统统计模型如Cox比例风险模型难以处理高维、非线性数据。**深度生存网络Deep Survival Network, DSN**应运而生它结合深度学习的自动特征提取能力与生存分析的风险建模解决了传统模型的痛点。一、背景溯源生存分析与传统模型的局限要理解深度生存网络先从生存分析的基础问题讲起。1.1 生存分析的核心概念生存分析研究**“事件发生时间”记为随机变量TTT与协变量**如患者年龄、肿瘤大小记为XXX的关系核心概念包括生存函数S(t)P(Tt)S(t) P(T t)S(t)P(Tt)表示个体在时间ttt后仍存活的概率风险函数h(t)lim⁡Δt→0P(t≤TtΔt∣T≥t)Δth(t) \lim_{\Delta t \to 0} \frac{P(t \leq T t\Delta t \mid T \geq t)}{\Delta t}h(t)limΔt→0​ΔtP(t≤TtΔt∣T≥t)​表示个体在时间ttt时的瞬时风险率已存活到ttt接下来瞬间发生事件的概率删失数据最常见的是右删失TCT CTCCCC为观察结束时间如“患者研究结束时仍存活”需特殊处理。生存函数与风险函数的关系$ h(t) -\frac{d}{dt} \ln S(t) \quad \Rightarrow \quad S(t) \exp\left(-\int_0^t h(\tau) d\tau\right) $1.2 传统生存模型的局限传统生存模型无法应对高维、非线性、复杂数据Kaplan-Meier法非参数模型仅能描述整体生存曲线无法结合协变量Cox比例风险模型半参数模型假设风险函数为$ h(t \mid X) h_0(t) \cdot \exp(X\beta)其中其中其中h_0(t)是∗∗基准风险∗∗无协变量时的风险是**基准风险**无协变量时的风险是∗∗基准风险∗∗无协变量时的风险\beta$是协变量系数。但它有两个致命缺陷线性假设协变量对风险的影响是线性的如“年龄每增1岁风险增加exp⁡(β年龄)\exp(\beta_{\text{年龄}})exp(β年龄​)倍”但现实中多为非线性如年龄对生存期的影响是U型手动特征工程需人工从原始数据如基因序列、CT图像中提取特征无法处理高维数据如10000维的基因表达谱。1.3 深度生存网络的诞生深度学习如MLP、CNN、LSTM的自动特征提取能力解决了传统模型的痛点无需手动设计特征直接从原始数据图像、序列、表格中学习高维非线性特征端到端训练从“原始数据”到“风险预测”一气呵成。深度生存网络的本质是用深度学习做特征提取用生存分析的损失函数处理删失结合两者实现精准的事件时间预测。二、深度生存网络的核心思想深度生存网络的框架可简化为“特征提取模块 风险预测模块 生存损失函数”流程如下$\text{原始数据} \xrightarrow{\text{特征提取深度学习}} \text{隐含特征} \xrightarrow{\text{风险预测生存模型}} \text{风险评分} \xrightarrow{\text{生存损失处理删失}} \text{模型训练}$2.1 核心目标解决两个问题特征学习从原始数据中提取与事件时间相关的有用特征如CT图像中肿瘤的形状、基因序列中的突变位点风险建模结合删失数据预测个体的风险评分风险越高事件发生越早。三、深度生存网络的算法原理我们从模块拆解和数学推导两部分讲解确保小白能理解每一步的逻辑。3.1 模块1特征提取深度学习特征提取模块的作用是将原始数据转化为低维、有意义的隐含特征常用模型如下数据类型推荐模型例子结构化数据表格数据如年龄、性别MLP多层感知机输入层100维→隐藏层164维ReLU→隐藏层232维ReLU→输出层16维图像数据如CT扫描CNN卷积神经网络卷积层→池化层→全连接层序列数据如电子病历LSTM/TransformerLSTM层学习时序依赖→全连接层记原始数据为XXX特征提取模块的参数为θ\thetaθ输出隐含特征zfθ(X)z f_\theta(X)zfθ​(X)如16维向量。3.2 模块2风险预测生存模型风险预测模块将隐含特征zzz映射为风险评分rrr核心是延续生存分析的“风险函数”逻辑。1比例风险假设最常用若假设风险比不随时间变化即“年轻患者的风险始终是老年患者的2倍”风险函数可写为$ h(t \mid X) h_0(t) \cdot \exp®其中其中其中r g_\phi(z)是风险评分是风险评分是风险评分\phi为风险模块的参数通常用∗∗线性层∗∗实现为风险模块的参数通常用**线性层**实现为风险模块的参数通常用∗∗线性层∗∗实现r w^T z b $www是权重向量与zzz同维度bbb是偏置项。2非比例风险假设进阶若风险比随时间变化如“化疗患者的风险在治疗后6个月内高之后降低”需将时间ttt引入风险评分$ r(t) g_\phi(z, t) $例如拼接zzz与时间ttt如[z;ln⁡t][z; \ln t][z;lnt]再用线性层用MLP输入zzz和ttt输出r(t)r(t)r(t)。此时风险函数为$ h(t \mid X) h_0(t) \cdot \exp(r(t)) $3.3 模块3损失函数处理删失的关键传统损失函数如MSE无法处理删失数据深度生存网络的核心是生存分析的“部分似然损失”Partial Likelihood Loss它能自动忽略删失样本的干扰。1部分似然函数的推导假设我们有nnn个样本其中事件发生样本非删失mmm个事件时间为t1t2...tmt_1 t_2 ... t_mt1​t2​...tm​按升序排列删失样本n−mn-mn−m个观察时间为CitiC_i t_iCi​ti​事件未发生。对于每个事件样本iii定义风险集R(ti)R(t_i)R(ti​)所有在tit_iti​时刻仍“存活”未发生事件、未删失的样本即tj≥tit_j \geq t_itj​≥ti​的样本jjj。部分似然函数的核心逻辑是事件样本iii在tit_iti​时刻发生事件的概率等于其风险评分的指数除以风险集中所有样本的指数和。数学表达式为$ PL(\theta, \phi) \prod_{i1}^m \frac{\exp(r_i)}{\sum_{j \in R(t_i)} \exp(r_j)}其中其中其中r_i g_\phi(f_\theta(X_i))是样本是样本是样本i$的风险评分。2损失函数负对数部分似然为了用优化器如Adam最小化损失我们将似然函数取负对数因为似然函数要最大化负对数后变成最小化$ L(\theta, \phi) -\sum_{i: \delta_i1} \left[ r_i - \ln\left( \sum_{j \in R(t_i)} \exp(r_j) \right) \right]其中其中其中\delta_i1表示样本表示样本表示样本i$是事件样本非删失。3.4 总结端到端模型的数学表达深度生存网络的完整流程可写为$X \xrightarrow{f_\theta} z \xrightarrow{g_\phi} r \xrightarrow{L} \text{损失}模型的目标是最小化损失模型的目标是最小化损失模型的目标是最小化损失L(\theta, \phi)同时学习特征提取参数同时学习特征提取参数同时学习特征提取参数\theta和风险预测参数和风险预测参数和风险预测参数\phi$。四、深度生存网络的完整求解步骤我们以**“医疗场景用基因数据预测癌症患者生存期”**为例一步步讲解如何实现深度生存网络。步骤1数据准备最基础也最关键数据是建模的基石需处理3个核心问题1数据收集需收集三类信息协变量XXX患者的基因表达谱10000维、年龄、性别事件时间TTT患者的生存期如“确诊后12个月去世”删失指示δ\deltaδδ1\delta1δ1事件发生如去世δ0\delta0δ0删失如研究结束时仍存活。2数据预处理标准化将数值特征如基因表达量缩放到均值0、方差1避免大值特征主导模型缺失值处理用均值/中位数填充或用模型插补数据划分按7:2:1划分为训练集、验证集、测试集确保各集删失比例一致。3风险集计算将训练集样本按事件时间升序排列为每个事件样本iii计算风险集R(ti)R(t_i)R(ti​)所有tj≥tit_j \geq t_itj​≥ti​的样本。例如样本1t16t_16t1​6个月δ1\delta1δ1风险集是所有生存期≥6个月的样本样本2t212t_212t2​12个月δ1\delta1δ1风险集是所有生存期≥12个月的样本。步骤2模型设计从简到繁我们选择结构化数据MLP比例风险模型小白最易上手的组合1特征提取模块MLP输入10002维10000维基因2维性别/年龄结构输入层→隐藏层1512维ReLU→Dropout0.5防过拟合→隐藏层2256维ReLU→输出层64维输出隐含特征zzz64维2风险预测模块线性层输入64维隐含特征zzz结构线性层rwTzbr w^T z brwTzb输出风险评分rrr1维步骤3损失函数定义使用比例风险的负对数部分似然损失$ L -\sum_{i: \delta_i1} \left[ r_i - \ln\left( \sum_{j \in R(t_i)} \exp(r_j) \right) \right] $步骤4模型训练优化参数训练的核心是用优化器更新参数流程如下1参数初始化特征提取模块θ\thetaθ用He初始化适合ReLU激活风险预测模块ϕ\phiϕ用Xavier初始化适合线性层。2选择优化器与超参数优化器Adam最常用自适应学习率学习率1e-4可调整若损失不下降则调小正则化Dropout0.5、L2正则权重衰减1e-5早停法若验证集损失连续5个epoch不下降停止训练防过拟合。3迭代训练对于每个epoch遍历训练集一次前向传播输入训练数据XXX计算隐含特征zzz、风险评分rrr计算损失用步骤3的损失函数计算当前batch的损失反向传播用自动微分如PyTorch的backward()计算损失对θ\thetaθ和ϕ\phiϕ的梯度参数更新用Adam优化器更新θ\thetaθ和ϕ\phiϕ如θθ−学习率×梯度\theta \theta - \text{学习率} \times \text{梯度}θθ−学习率×梯度。步骤5模型评估验证效果训练完成后需用测试集评估模型性能常用指标如下1一致性指数C-index衡量模型对事件时间的排序能力核心指标定义对于所有事件样本对(i,j)(i,j)(i,j)iii是事件样本jjj是删失样本且tjtit_j t_itj​ti​若模型预测rirjr_i r_jri​rj​事件样本的风险更高则为“一致对”。范围0.5随机猜测~1完美预测≥0.7视为有效模型。2积分Brier评分IBS衡量生存概率预测的准确性定义对每个时间点ttt计算Brier评分预测生存概率与实际状态的平方差再对时间积分。范围0~0.25越小表示预测越准。3时间依赖AUC衡量模型在特定时间点的区分能力如“确诊后1年的死亡预测 accuracy”定义在时间ttt时计算ROC曲线下面积AUCAUC≥0.7视为良好。步骤6模型解释让结果更可信深度模型的“黑盒”属性是其短板需用以下方法解释1特征重要性用SHAP值或LIME计算每个输入特征对风险评分的贡献例如“基因A的表达量越高风险评分越高生存期越短”“年龄每增1岁风险评分增加0.05生存期缩短3个月”。2生存曲线可视化生存函数S(t∣X)S(t \mid X)S(t∣X)表示“患者在时间ttt后仍存活的概率”对于比例风险模型可通过基准生存函数S0(t)S_0(t)S0​(t)用Kaplan-Meier估计计算$ S(t \mid X) \left[ S_0(t) \right]^{\exp®} $可视化不同患者的生存曲线如高风险患者的曲线下降更快直观展示模型预测结果。五、深度生存网络的适用边界与注意事项深度生存网络不是“万能模型”需明确其适用场景和局限性。5.1 适用场景高维数据如基因表达谱10000维、CT图像百万像素传统模型无法处理非线性关系协变量对风险的影响是非线性的如年龄的U型影响大样本数据深度学习需要足够数据训练≥1000样本效果更佳端到端需求无需手动提取特征如直接用CT图像预测生存期。5.2 不适用场景小样本数据500样本时深度学习易过拟合传统Cox模型更稳定强线性关系协变量对风险的影响是线性的如“收入每增1万违约风险降低20%”传统Cox模型更简单强解释性要求医疗场景需向患者解释“为什么预测你生存期短”传统Cox模型的系数可直接解释深度模型的解释性较差比例风险假设不成立且无法建模风险比随时间变化极大且无法用时间依赖的风险评分捕捉如“术后1个月风险高之后骤降”。5.3 注意事项删失数据处理必须正确识别删失类型90%是右删失计算风险集时按事件时间升序排列比例风险检验用Schoenfeld残差检验比例风险假设若不成立需用非比例风险模型过拟合预防用Dropout、早停法、数据增强如基因数据的随机扰动指标全面性不能仅看C-index需结合IBS、时间依赖AUC等指标。六、总结小白入门的建议深度生存网络的学习路径可总结为“从简单到复杂”入门用表格数据如年龄、性别 MLP 比例风险模型熟悉“特征提取→风险预测→损失计算”的流程进阶尝试非比例风险模型加入时间ttt、处理图像/序列数据如用CNN预测CT图像的生存期优化用SHAP解释模型、用早停法防过拟合、调整超参数如学习率、隐藏层维度。记住数据质量模型复杂度先把数据处理好再尝试复杂模型附录关键公式汇总生存函数与风险函数的关系h(t)−ddtln⁡S(t)h(t) -\frac{d}{dt} \ln S(t)h(t)−dtd​lnS(t)比例风险模型的风险函数h(t∣X)h0(t)exp⁡(r)h(t \mid X) h_0(t) \exp(r)h(t∣X)h0​(t)exp(r)部分似然函数PL(θ,ϕ)∏i1mexp⁡(ri)∑j∈R(ti)exp⁡(rj)PL(\theta, \phi) \prod_{i1}^m \frac{\exp(r_i)}{\sum_{j \in R(t_i)} \exp(r_j)}PL(θ,ϕ)∏i1m​∑j∈R(ti​)​exp(rj​)exp(ri​)​损失函数L(θ,ϕ)−∑i:δi1[ri−ln⁡(∑j∈R(ti)exp⁡(rj))]L(\theta, \phi) -\sum_{i: \delta_i1} \left[ r_i - \ln\left( \sum_{j \in R(t_i)} \exp(r_j) \right) \right]L(θ,ϕ)−∑i:δi​1​[ri​−ln(∑j∈R(ti​)​exp(rj​))]。通过以上教程相信你已掌握深度生存网络的核心逻辑和实现步骤。接下来不妨用公开数据集如SEER癌症数据集、TCGA基因数据集动手实践从“理论”走向“应用”案例介绍使用模拟的癌症患者基因表达数据集1000个样本100维基因特征2维临床特征年龄、性别构建深度生存网络预测患者生存期。完整Python代码importnumpyasnpimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromlifelines.utilsimportconcordance_index# 模拟生存分析数据集defsimulate_survival_data(n_samples1000,n_features102,n_events700): 模拟生存分析数据 :param n_samples: 样本数量 :param n_features: 特征维度(100维基因2维临床) :param n_events: 事件发生样本数 :return: X(特征), T(事件时间), delta(删失指示:1事件发生,0删失) # 生成随机特征:正态分布Xnp.random.randn(n_samples,n_features)# 生成事件时间:指数分布,风险评分由前5个特征线性组合得到risk_scoresX[:,:5].sum(axis1)Tnp.random.exponential(scalenp.exp(-risk_scores),sizen_samples)# 生成删失时间:均匀分布Cnp.random.uniform(0,10,sizen_samples)# 观察时间是事件时间和删失时间的最小值observed_Tnp.minimum(T,C)# 删失指示:事件发生(observed_TT)则为1,否则为0deltanp.where(observed_TT,1,0)# 确保事件发生样本数符合设定delta[np.argsort(observed_T)[-n_events:]]1returnX,observed_T,delta# 数据预处理defpreprocess_data(X,T,delta): 数据预处理:标准化划分训练/验证/测试集 :param X: 原始特征 :param T: 事件时间 :param delta: 删失指示 :return: X_train, X_val, X_test, T_train, T_val, T_test, delta_train, delta_val, delta_test, scaler # 标准化特征scalerStandardScaler()X_scaledscaler.fit_transform(X)# 划分训练/验证/测试集(7:2:1)X_train,X_temp,T_train,T_temp,delta_train,delta_temptrain_test_split(X_scaled,T,delta,test_size0.3,random_state42)X_val,X_test,T_val,T_test,delta_val,delta_testtrain_test_split(X_temp,T_temp,delta_temp,test_size1/3,random_state42)returnX_train,X_val,X_test,T_train,T_val,T_test,delta_train,delta_val,delta_test,scaler# 定义深度生存网络模型classDeepSurvivalNetwork(nn.Module):深度生存网络:MLP特征提取 线性风险预测def__init__(self,input_dim102,hidden_dim1512,hidden_dim2256,output_dim64): 模型初始化 :param input_dim: 输入特征维度 :param hidden_dim1: 第一个隐藏层维度 :param hidden_dim2: 第二个隐藏层维度 :param output_dim: 隐含特征维度 super().__init__()# 特征提取模块(MLP)self.feature_extractornn.Sequential(nn.Linear(input_dim,hidden_dim1),# 输入层到隐藏层1nn.ReLU(),# 激活函数nn.Dropout(0.5),# Dropout防止过拟合nn.Linear(hidden_dim1,hidden_dim2),# 隐藏层1到隐藏层2nn.ReLU(),# 激活函数nn.Dropout(0.5),# Dropout防止过拟合nn.Linear(hidden_dim2,output_dim)# 隐藏层2到隐含特征)# 风险预测模块(线性层)self.risk_predictornn.Linear(output_dim,1)# 隐含特征到风险评分defforward(self,x): 前向传播 :param x: 输入特征(batch_size, input_dim) :return: 风险评分(batch_size, 1) zself.feature_extractor(x)# 提取隐含特征rself.risk_predictor(z)# 预测风险评分returnr.squeeze()# 降维为(batch_size,)# 定义负对数部分似然损失defnegative_log_partial_likelihood(risk_scores,T,delta): 计算负对数部分似然损失(处理删失数据) :param risk_scores: 模型输出的风险评分(batch_size,) :param T: 事件时间(batch_size,) :param delta: 删失指示(batch_size,) :return: 负对数部分似然损失(标量) # 按事件时间降序排序索引ordertorch.argsort(T,descendingTrue)sorted_riskrisk_scores[order]sorted_TT[order]sorted_deltadelta[order]# 计算累积风险和(即风险集中所有样本的exp(risk)之和)exp_risktorch.exp(sorted_risk)cumulative_exp_risktorch.cumsum(exp_risk,dim0)# 计算对数累积风险和(注意累积风险和是降序的,需要反转)log_cumulative_exp_risktorch.log(cumulative_exp_risk)# 计算每个事件样本的风险评分与对应对数累积风险和的差events_risksorted_risk[sorted_delta1]events_log_cumulativelog_cumulative_exp_risk[sorted_delta1]partial_likelihoodtorch.sum(events_risk-events_log_cumulative)# 返回负对数部分似然return-partial_likelihood# 模型训练函数deftrain_model(model,train_loader,val_X,val_T,val_delta,optimizer,epochs100,patience5): 训练深度生存网络 :param model: 深度生存网络模型 :param train_loader: 训练数据加载器 :param val_X: 验证集特征 :param val_T: 验证集事件时间 :param val_delta: 验证集删失指示 :param optimizer: 优化器 :param epochs: 最大训练轮次 :param patience: 早停 patience :return: 训练好的模型 best_cindex0.0patience_counter0forepochinrange(epochs):model.train()# 设置模型为训练模式epoch_loss0.0forX_batch,T_batch,delta_batchintrain_loader:# 将数据转换为TensorX_batchX_batch.float()T_batchT_batch.float()delta_batchdelta_batch.float()# 前向传播risk_scoresmodel(X_batch)# 计算损失lossnegative_log_partial_likelihood(risk_scores,T_batch,delta_batch)# 反向传播与参数更新optimizer.zero_grad()# 清空梯度loss.backward()# 反向传播计算梯度optimizer.step()# 更新参数epoch_lossloss.item()# 验证模型model.eval()# 设置模型为评估模式withtorch.no_grad():val_risk_scoresmodel(torch.FloatTensor(val_X))val_cindexconcordance_index(val_T,-val_risk_scores.numpy(),val_delta)# 打印训练信息print(fEpoch{epoch1}/{epochs}, Loss:{epoch_loss:.4f}, Val C-index:{val_cindex:.4f})# 早停机制ifval_cindexbest_cindex:best_cindexval_cindex patience_counter0# 保存最佳模型torch.save(model.state_dict(),best_deep_survival_net.pt)else:patience_counter1ifpatience_counterpatience:print(fEarly stopping at epoch{epoch1})break# 加载最佳模型model.load_state_dict(torch.load(best_deep_survival_net.pt))returnmodel# 模型评估函数defevaluate_model(model,test_X,test_T,test_delta): 评估模型性能 :param model: 训练好的模型 :param test_X: 测试集特征 :param test_T: 测试集事件时间 :param test_delta: 测试集删失指示 :return: 测试集C-index model.eval()# 设置模型为评估模式withtorch.no_grad():test_risk_scoresmodel(torch.FloatTensor(test_X))test_cindexconcordance_index(test_T,-test_risk_scores.numpy(),test_delta)returntest_cindex# 主程序defmain():# 模拟数据X,T,deltasimulate_survival_data(n_samples1000,n_features102,n_events700)# 数据预处理X_train,X_val,X_test,T_train,T_val,T_test,delta_train,delta_val,delta_test,scalerpreprocess_data(X,T,delta)# 创建数据加载器(批量处理)batch_size32train_datalist(zip(X_train,T_train,delta_train))train_loadertorch.utils.data.DataLoader(train_data,batch_sizebatch_size,shuffleTrue)# 初始化模型modelDeepSurvivalNetwork(input_dim102)# 初始化优化器optimizeroptim.Adam(model.parameters(),lr1e-4,weight_decay1e-5)# 训练模型trained_modeltrain_model(model,train_loader,X_val,T_val,delta_val,optimizer,epochs100,patience5)# 评估模型test_cindexevaluate_model(trained_model,X_test,T_test,delta_test)print(fTest C-index:{test_cindex:.4f})if__name____main__:main()代码深度解析深度生存网络预测癌症患者生存期前置知识生存分析基础生存分析核心目标是预测事件发生时间如癌症复发、患者死亡但数据存在删失问题部分样本未观察到事件仅知道事件时间观察时间。代码采用深度Cox比例风险模型其核心假设风险率h(t∣x)h0(t)⋅exp⁡(risk(x))h(t|x) h_0(t) \cdot \exp(risk(x))h(t∣x)h0​(t)⋅exp(risk(x))h0(t)h_0(t)h0​(t)为基线风险risk(x)risk(x)risk(x)为模型学习的样本风险评分部分似然函数忽略h0(t)h_0(t)h0​(t)的非参数估计仅优化风险评分L∏i:δi1exp⁡(risk(xi))∑j:Tj≥Tiexp⁡(risk(xj)) L \prod_{i: \delta_i1} \frac{\exp(risk(x_i))}{\sum_{j: T_j \geq T_i} \exp(risk(x_j))}Li:δi​1∏​∑j:Tj​≥Ti​​exp(risk(xj​))exp(risk(xi​))​评估指标C-index一致性指数衡量「风险评分高的样本事件时间短」的概率取值∈[0.5,1]\in [0.5,1]∈[0.5,1]越接近1越好代码模块逐块解析1. 模拟生存分析数据集simulate_survival_data功能生成符合Cox模型假设的模拟数据1000样本100基因特征2临床特征defsimulate_survival_data(n_samples1000,n_features102,n_events700):Xnp.random.randn(n_samples,n_features)# 102维正态分布特征risk_scoresX[:,:5].sum(axis1)# 风险评分由前5个特征线性生成Tnp.random.exponential(scalenp.exp(-risk_scores),sizen_samples)# 事件时间指数分布风险越高scale越小事件时间越短Cnp.random.uniform(0,10,sizen_samples)# 删失时间均匀分布U(0,10)observed_Tnp.minimum(T,C)# 观察时间min(事件时间, 删失时间)deltanp.where(observed_TT,1,0)# 删失指示1事件发生0删失# 强制事件数设定值将观察时间最长的n_events个样本设为事件确保事件数稳定delta[np.argsort(observed_T)[-n_events:]]1returnX,observed_T,delta数学逻辑事件时间T∼Exp(scaleexp⁡(−risk))T \sim Exp(scale\exp(-risk))T∼Exp(scaleexp(−risk))指数分布的风险率h(t)1/scaleexp⁡(risk)h(t)1/scale\exp(risk)h(t)1/scaleexp(risk)严格符合Cox模型假设删失调整技巧np.argsort(observed_T)[-n_events:]取观察时间最长的n_events个样本强制设为事件发生避免模拟事件数波动2. 数据预处理preprocess_data功能标准化特征划分训练/验证/测试集defpreprocess_data(X,T,delta):scalerStandardScaler()X_scaledscaler.fit_transform(X)# 特征标准化z-score均值0标准差1# 划分比例70%训练 / 20%验证 / 10%测试X_train,X_temp,T_train,T_temp,delta_train,delta_temptrain_test_split(X_scaled,T,delta,test_size0.3,random_state42)X_val,X_test,T_val,T_test,delta_val,delta_testtrain_test_split(X_temp,T_temp,delta_temp,test_size1/3,random_state42)returnX_train,X_val,X_test,T_train,T_val,T_test,delta_train,delta_val,delta_test,scaler关键说明标准化原因神经网络对输入尺度敏感标准化可加速收敛并避免特征尺度偏差划分逻辑先拆分70%训练集剩余30%再拆分为2/3验证集、1/3测试集确保比例稳定3. 深度生存网络模型DeepSurvivalNetwork功能构建「MLP特征提取线性风险预测」的深度Cox模型classDeepSurvivalNetwork(nn.Module):def__init__(self,input_dim102,hidden_dim1512,hidden_dim2256,output_dim64):super().__init__()# 特征提取模块MLP非线性特征交互self.feature_extractornn.Sequential(nn.Linear(input_dim,hidden_dim1),nn.ReLU(),nn.Dropout(0.5),# 102→512ReLU激活Dropout防止过拟合nn.Linear(hidden_dim1,hidden_dim2),nn.ReLU(),nn.Dropout(0.5),# 512→256nn.Linear(hidden_dim2,output_dim)# 256→64隐含特征)# 风险预测模块线性层Cox模型的风险评分要求线性输出self.risk_predictornn.Linear(output_dim,1)defforward(self,x):zself.feature_extractor(x)# 提取非线性隐含特征rself.risk_predictor(z)# 映射为风险评分returnr.squeeze()# 降维为(batch_size,)结构设计逻辑特征提取用MLP捕捉高维基因特征的非线性交互解决传统Cox模型的线性假设局限性风险预测用线性层严格遵循Cox模型的风险评分形式exp⁡(risk)\exp(risk)exp(risk)为风险率的比例因子Dropout0.5在高维特征小样本场景下防止过拟合4. 负对数部分似然损失negative_log_partial_likelihood核心中的核心生存分析删失数据的专用损失函数对应Cox模型的负对数部分似然defnegative_log_partial_likelihood(risk_scores,T,delta):# 步骤1按事件时间降序排序样本索引ordertorch.argsort(T,descendingTrue)sorted_riskrisk_scores[order]sorted_TT[order]sorted_deltadelta[order]# 步骤2计算风险集中的累积exp(risk)exp_risktorch.exp(sorted_risk)cumulative_exp_risktorch.cumsum(exp_risk,dim0)# 按排序顺序累积和# 步骤3计算部分似然的对数log_cumulative_exp_risktorch.log(cumulative_exp_risk)# 仅保留事件发生的样本events_risksorted_risk[sorted_delta1]events_log_cumulativelog_cumulative_exp_risk[sorted_delta1]partial_likelihoodtorch.sum(events_risk-events_log_cumulative)# 步骤4返回负对数部分似然作为损失函数return-partial_likelihood代码实现的核心技巧必须理解为什么按T降序排序Cox模型的风险集是「所有事件时间≥当前事件样本时间的样本」。按T降序后第i个样本的风险集恰好是排序后的前i个样本因为后面的样本T更小不满足≥条件为什么用cumsum按降序排序后cumulative_exp_risk[i] sum_{j0}^i exp(sorted_risk[j])恰好是第i个样本若为事件的风险集总和避免了对每个事件样本遍历所有样本的低效操作数学对应部分似然的对数log⁡L∑i:δi1[risk(xi)−log⁡(∑j:Tj≥Tiexp⁡(risk(xj)))]\log L \sum_{i: \delta_i1} [risk(x_i) - \log(\sum_{j: T_j \geq T_i} \exp(risk(x_j)))]logL∑i:δi​1​[risk(xi​)−log(∑j:Tj​≥Ti​​exp(risk(xj​)))]取负即损失函数5. 模型训练函数train_model功能实现深度生存网络的训练、验证、早停机制deftrain_model(model,train_loader,val_X,val_T,val_delta,optimizer,epochs100,patience5):best_cindex0.0patience_counter0# 早停计数器forepochinrange(epochs):model.train()# 训练模式启用Dropoutepoch_loss0.0# 批量训练forX_batch,T_batch,delta_batchintrain_loader:X_batchX_batch.float()T_batchT_batch.float()delta_batchdelta_batch.float()risk_scoresmodel(X_batch)# 前向传播lossnegative_log_partial_likelihood(risk_scores,T_batch,delta_batch)# 计算损失# 反向传播更新参数optimizer.zero_grad()# 清空梯度loss.backward()# 计算梯度optimizer.step()# 更新参数epoch_lossloss.item()# 验证模型model.eval()# 评估模式禁用Dropoutwithtorch.no_grad():# 禁止梯度计算val_risk_scoresmodel(torch.FloatTensor(val_X))# 注意lifelines的C-index要求「得分越高事件时间越长」故将风险评分取负val_cindexconcordance_index(val_T,-val_risk_scores.numpy(),val_delta)print(fEpoch{epoch1}/{epochs}, Loss:{epoch_loss:.4f}, Val C-index:{val_cindex:.4f})# 早停机制若连续patience轮C-index未提升则停止训练ifval_cindexbest_cindex:best_cindexval_cindex patience_counter0torch.save(model.state_dict(),best_deep_survival_net.pt)# 保存最佳模型else:patience_counter1ifpatience_counterpatience:print(fEarly stopping at epoch{epoch1})breakmodel.load_state_dict(torch.load(best_deep_survival_net.pt))# 加载最佳模型returnmodel关键细节C-index的负号处理lifelines.utils.concordance_index默认要求「预测得分越高事件时间越长」。但模型输出的risk_scores越高事件时间越短故需取负早停机制连续5轮验证C-index未提升则停止防止过拟合批量训练用torch.utils.data.DataLoader将训练数据按batch32划分提高训练效率6. 模型评估函数evaluate_model功能在测试集上计算C-index评估模型性能defevaluate_model(model,test_X,test_T,test_delta):model.eval()withtorch.no_grad():test_risk_scoresmodel(torch.FloatTensor(test_X))test_cindexconcordance_index(test_T,-test_risk_scores.numpy(),test_delta)returntest_cindex说明与验证步骤逻辑完全一致仅针对测试集7. 主程序入口main功能串联所有模块完成「数据模拟→预处理→训练→评估」的完整流程defmain():X,T,deltasimulate_survival_data(n_samples1000,n_features102,n_events700)# 模拟数据X_train,X_val,X_test,T_train,T_val,T_test,delta_train,delta_val,delta_test,scalerpreprocess_data(X,T,delta)# 预处理batch_size32train_datalist(zip(X_train,T_train,delta_train))train_loadertorch.utils.data.DataLoader(train_data,batch_sizebatch_size,shuffleTrue)# 批量加载器modelDeepSurvivalNetwork(input_dim102)# 初始化模型optimizeroptim.Adam(model.parameters(),lr1e-4,weight_decay1e-5)# Adam优化器L2正则化防止过拟合trained_modeltrain_model(model,train_loader,X_val,X_val,delta_val,optimizer,epochs100,patience5)# 训练test_cindexevaluate_model(trained_model,X_test,T_test,delta_test)# 评估print(fTest C-index:{test_cindex:.4f})if__name____main__:main()参数说明优化器Adam是深度学习常用优化器lr1e-4为学习率weight_decay1e-5为L2正则化系数shuffleTrue训练集打乱避免批量样本相关性代码优缺点与改进方向优点严格遵循Cox比例风险模型的数学框架损失函数实现高效排序Cumsum技巧包含完整的训练-验证-测试流程和早停机制用lifelines的C-index确保评估准确性改进方向数学建模比赛优化模型结构改进加入BatchNorm加速收敛尝试Transformer/CNN等特征提取结构针对高维基因数据损失函数扩展加入正则化项如风险评分的L1/L2正则考虑时间依赖的风险率模型如DeepHit数据处理改进特征选择如方差分析筛选与生存期相关的基因特征分层抽样确保训练/验证/测试集的删失比例一致评估扩展绘制Kaplan-Meier曲线验证模型分组效果计算Brier分数衡量生存概率预测的准确性总结该代码实现了一个标准的深度Cox比例风险模型完整覆盖了生存分析的核心环节删失处理、部分似然损失、C-index评估。代码结构清晰数学逻辑严谨是数学建模比赛中生存分析任务的高质量参考实现。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做资源下载网站条件如何建设小说网站并且盈利

研发(R&D)绩效评估是企业管理中的一个复杂难题,它试图量化一个本质上充满创造性、探索性和不确定性的过程。要准确评估研发绩效,关键指标应超越传统的“代码行数”或“工时”,转向一个多维度的框架,核心…

张小明 2025/12/29 6:57:09 网站建设

字体多的网站台州网络营销公司

Cloudpods 终极指南:轻松实现多云和混合云统一管理 【免费下载链接】cloudpods 开源、云原生的多云管理及混合云融合平台 项目地址: https://gitcode.com/yunionio/cloudpods 想要在复杂的云环境中游刃有余?Cloudpods作为开源、云原生的多云管理及…

张小明 2025/12/28 11:23:04 网站建设

上住房和城乡建设部网站品牌推广与传播方案

IBM正式发布新一代大语言模型Granite-4.0系列,其中granite-4.0-h-micro-base作为基础型号,凭借18万亿 tokens 的训练规模和创新架构设计,在多语言处理与长文本生成领域展现出突破性能力。 【免费下载链接】granite-4.0-h-micro-base 项目地…

张小明 2025/12/29 4:31:59 网站建设

网站图片等比缩小凡科的模板做网站

Applite:重新定义macOS软件管理的智能助手 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 在macOS生态中,软件安装与维护往往需要用户在命令行与图形界…

张小明 2025/12/28 17:11:27 网站建设

做物流网站的多少钱如何用腾讯云做网站

用CAPL玩转CAN总线“故障艺术”:错误帧注入实战全解析 你有没有遇到过这样的场景? 某次实车测试中,整车通信突然出现短暂中断,几个关键报文连续丢包,但复现极其困难。拆解排查后发现是某个ECU在强电磁干扰下未能正确处…

张小明 2025/12/28 12:50:33 网站建设

音乐网站建设教程视频免费的黄冈网站有哪些平台软件

vLLM-Omni发布:全模态模型高效服务新框架 在生成式 AI 从“能说会写”迈向“能看会听、能创作会决策”的今天,多模态智能体正以前所未有的速度渗透进内容创作、智能客服、机器人交互等核心场景。然而,支撑这些复杂应用的底层推理系统却频频遭…

张小明 2025/12/28 10:29:56 网站建设