简介:这是一份面向水文预测与人工智能交叉领域研究者的专题文档,系统梳理物理约束机器学习将水文学物理机制与数据驱动能力相结合的技术路线,直击传统水文模型依赖先验假设、纯机器学习模型缺乏物理一致性的痛点,并覆盖降雨径流预测、水量平衡模拟、水质评估与洪水灾害预警等典型应用场景。资源为单个docx文档,压缩包仅137KB,目录按文档概要、物理约束机器学习基础、水文数据预处理方法、模型构建与应用、模型优化等模块组织,适合快速定位所需章节。其中重点介绍了物理信息神经网络、物理约束优化算法、代理模型等方法,以及数据清洗、插补、降维等预处理技术,并具体讨论了径流预报、降雨量预测、蒸散发模拟、污染物扩散等案例,可帮助读者建立从原理到应用的整体认知。目前已有119人学习,适合相关专业研究生、科研人员及工程师作为综述资料或选题参考。
1. 物理约束机器学习与水文预测:为什么纯数据模型会在洪水预报上翻车
做水文预报这些年,我见过不少团队把LSTM、Transformer跑得风生水起,训练集上的NSE能到0.95,可真到汛期极端洪水来了,预测值直接偏离实测一个量级。问题不在模型复杂度,而在纯数据驱动模型没见过这种水位组合,它只能按训练样本的统计规律外推,物理上一旦失衡,预测就变成玄学。物理约束机器学习(Physics-Informed Machine Learning, PIML)就是冲着这个痛点来的——把水量平衡、能量守恒这些水文过程的基本定律直接嵌进模型训练目标里,让模型既学数据特征,又不敢违背物理规律。这篇文档把PIML在水文预测中的方法框架、应用场景和优化手段梳理得很全,适合正在做径流预报、洪水预警或水质模拟的工程师和研究者,也适合想从纯数据驱动转向物理可解释建模的入门者。
2. 建模基础:物理约束的三种嵌入方式与水文数据预处理三件套
2.1 物理约束的内涵:守恒方程、物理区间与过程关系
物理约束机器学习的第一步,是把水文领域里那些“铁律”转成机器能读的数学表达。文档里把常见约束归纳为三类,我按实际建模时的使用频率重新排一下:第一类是守恒方程,比如水量平衡dS/dt = P - E - Q,这是水文预测里最常用的硬约束,流域蓄量变化必须等于降水减去蒸散发再减去径流,任何违背这个等式的预测结果在物理上都是错的;第二类是物理区间约束,比如土壤含水量只能在0到饱和含水量之间、径流量不能为负,这类约束通常以惩罚项或输出层激活函数的形式存在;第三类是过程关系约束,比如蒸散发与气温、辐射的关联,下渗能力与土壤湿度的非线性关系,这类约束往往以辅助方程形式加入loss。
三类约束在模型里的嵌入层次也不同。守恒类约束一般加在损失函数里作为正则项,约束模型在整个样本上的宏观趋势;区间类约束可以直接改输出层结构,比如用sigmoid或softplus保证输出非负;过程关系约束则适合作为中间监督信号,在网络的某个隐层后加一个辅助输出头,强制中间特征符合物理过程。下表是这三类约束在水文场景中的典型表达,我在做模型选型时基本按这个对照表走:
| 约束类型 | 数学表达示例 | 水文场景 | 嵌入方式 |
|---|---|---|---|
| 守恒方程 | dS/dt = P - E - Q | 流域水量平衡、水库蓄量 | 损失函数正则项 |
| 物理区间 | 0 ≤ θ ≤ θ_sat | 土壤含水量、地下水位 | 输出层激活函数 |
| 过程关系 | ET = f(T, Rn, θ) | 蒸散发模拟、下渗计算 | 中间监督信号 |
2.2 水文数据预处理三件套:清洗、插补、降维
物理约束再强,数据质量不行模型照样翻车。文档里专门列了一节讲水文数据预处理,我拆成三个固定动作。第一步是数据清洗,水文观测里最常见的异常是负径流、水位突变跳变、传感器故障导致的连续零值,我用的是分位数法加物理阈值双重判定——先按3σ原则筛统计异常,再按物理合理性筛,比如径流出现负值直接剔除。第二步是数据插补,水文序列缺失是常态,降雨缺测、水位计故障都会造成断点,常见的做法是线性插值处理短缺口,用邻近站点回归处理长缺口,如果缺测超过序列长度的20%,我通常直接放弃该时段,强行插补会制造虚假规律。第三步是数据降维,水文变量动辄几十个特征,但很多特征高度相关,比如气温与蒸散发、前期降水与土壤湿度,保留全部特征只会让模型过拟合噪声。
以下是我在预处理阶段经常用的一个Python示意流程,逻辑上覆盖了这三步:
import pandas as pd import numpy as np from sklearn.decomposition import PCA def preprocess_hydro(df, target_col='q', drop_threshold=0.2): # 1. 物理阈值清洗:径流为负、水位超物理上限的直接置NaN df.loc[df['q'] < 0, 'q'] = np.nan df.loc[df['h'] > 50, 'h'] = np.nan # 假设水位物理上限50m # 2. 短缺口线性插补,长缺口舍弃 df = df.interpolate(method='linear', limit=24) # 最多连续插补24小时 missing_ratio = df.isna().mean() for col in df.columns: if missing_ratio[col] > drop_threshold: df = df.drop(columns=[col]) # 3. 相关性高的特征用PCA压缩,保留95%方差 feature_cols = [c for c in df.columns if c != target_col] pca = PCA(n_components=0.95) reduced = pca.fit_transform(df[feature_cols]) df_pca = pd.DataFrame(reduced, columns=[f'pc{i}' for i in range(reduced.shape[1])]) df_pca[target_col] = df[target_col].values return df_pca逻辑上分三步走:先清洗,把物理上不可能的值剔掉;再插补,limit=24的意思是连续缺失超过24个小时就不硬补了,避免把一场洪水的退水段抹平;最后降维,PCA保留95%方差意味着去掉了近一半的冗余特征维度,模型训练速度能快不少。参数上要注意drop_threshold,水文站数据质量差的流域我建议放宽到0.3,数据质量好的可以收紧到0.1,这个阈值直接决定后续训练样本量。
2.3 三种物理约束机器学习框架:PINN、物理约束优化与代理模型
文档把物理约束机器学习算法分成三类:基于物理信息神经网络(PINN)、基于物理约束的优化算法、基于代理模型的算法。PINN目前是研究最热的方向,它的思路是把物理方程的残差直接加到损失函数里,让神经网络在拟合数据的同时最小化物理残差。以水量平衡为例,PINN的损失函数写成:
import torch import torch.nn as nn class PhysicsInformedNN(nn.Module): def __init__(self, input_dim, hidden_dim=64): super().__init__() self.net = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, 1) ) self.lambda_phys = 0.1 # 物理约束权重 def forward(self, x): return self.net(x) def loss(self, x, y_true, p, et): q_pred = self.net(x) loss_data = nn.MSELoss()(q_pred, y_true) # 水量平衡残差:dS/dt = P - ET - Q dS_dt = torch.gradient(q_pred, dim=0)[0] # 简化:以q近似蓄量变化 phys_residual = dS_dt - (p - et - q_pred) loss_phys = torch.mean(phys_residual ** 2) return loss_data + self.lambda_phys * loss_phys这个代码的关键在loss_phys这一项,它不直接约束径流的数值,而是约束径流的变化趋势必须满足水量平衡方程。lambda_phys是物理约束的权重,取值很讲究,太大模型会忽略数据拟合,太小物理约束形同虚设,我一般从0.01开始调,以1e-1为步长做网格搜索。另外还要说明,代码里的torch.gradient是对批量数据做的数值近似,严格的PINN要用自动微分对时间求导,这里为了示意做了简化,实际工程中建议把时间作为显式输入,这样才能正确计算物理残差。
物理约束优化算法和代理模型这两类更适合工程落地。物理约束优化是在传统水文模型的参数率定阶段引入机器学习替代成本函数计算,速度快但物理机制仍需人工指定。代理模型则用机器学习逼近传统水文模型的输入输出映射,训练时用物理模型的模拟结果作标签,本质上是在物理模型和纯数据驱动之间做折中。三类框架的选型我看重三个维度:数据量、物理机制清晰度、计算预算。PINN适合小数据但物理机制明确的场景,代理模型适合有成熟物理模型但计算太慢的场景,物理约束优化则适合参数率定这类传统问题。
3. 四大应用场景拆解:降雨径流、水量平衡、水质与洪水预警的建模重点
3.1 降雨径流预测:物理约束径流预报模型的输入输出设计
降雨径流预测是PIML在水文领域最成熟的应用方向。文档里提到基于物理约束的径流预报模型和降雨量预测模型,我把这两者的建模要点分开说。径流预报模型的输入一般取前T个时刻的降水、蒸散发、前期径流和土壤含水量,输出未来1到N小时的径流。加物理约束最直接的方式是在loss里加水量平衡残差项,保证模型预测的径流过程不会出现蓄量凭空增减的情况。降雨量预测模型则更难,因为降雨的物理过程涉及大气动力学,纯物理方程做数值预报成本太高,PIML的做法是把雷达回波、云顶温度这类遥感变量和地面雨量计数据一起喂进模型,再用降水物理过程的简化方程做正则项。
我实际做过的项目里,径流预报加水量平衡约束后,NSE提升了0.03到0.05,看起来不大,但峰值流量误差降低了约15%,这就是物理约束的价值——它不优化整体拟合度,而是优化物理过程转折点的准确性。参数上要注意输入窗口长度,湿润地区流域响应快,窗口设6到12小时就够了;干旱半干旱地区产流机制复杂,建议设24到48小时,给模型足够的上下文来理解前期土壤湿度的累积效应。
3.2 水量平衡模拟:守恒律约束下的蒸散发与地下水位
水量平衡模拟是PIML最能发挥优势的场景,因为水量平衡本身就是一条强守恒定律,纯数据模型经常模拟出蓄量偏离实际的情况,而物理约束可以把这个偏差硬拉回来。文档里的水面蒸散发模拟和地下水位预测是两个典型子任务。蒸散发模拟的物理约束主要在过程关系上,比如彭曼公式给出的蒸散发与气温、辐射、风速的关系,这个关系可以作为辅助监督信号约束中间层特征。地下水位预测则适合用物理区间约束,含水层水位不能超过地表高程,也不能低于含水层底板,这类约束用输出层的裁剪函数就能实现。
建模时我常用的做法是把水量平衡方程拆成两部分:蓄量变化由神经网络拟合,通量项(降水、蒸散发、径流)作为已知输入或者由另一个子网络拟合。这样网络结构上就保证了守恒律——蓄量更新的每一步都显式扣除了通量项,物理约束从损失函数的软约束变成了网络结构的硬约束。这么做的好处是外推能力显著增强,即使测试期的降水模式跟训练期差异很大,模型也不会违背水量平衡。
3.3 水质预测与污染物扩散:对流扩散方程怎么嵌入
水质预测里物理约束的作用更明显,因为污染物扩散遵循对流-扩散方程,这是比水量平衡更精细的物理过程。文档里的水质模型和水污染物扩散模拟都以这个方程为核心。对流-扩散方程的基本形式是浓度的时间变化等于对流项加扩散项再加源汇项:
dc/dt = -u * dc/dx + D * d²c/dx² + S在PINN框架下,把方程残差加入模型的总损失中,可以同时拟合浓度观测数据和满足物理扩散过程。这里有个关键问题,污染物扩散的时间尺度从小时到天不等,方程中扩散系数D的量级决定了模型对浓度梯度变化的敏感度,D取太小模型学不到扩散过程,D取太大浓度分布会被抹平。文档里提到的水体富营养化预测则更适合用过程关系约束,因为藻类生长的物理机理涉及光照、温度、营养盐的交互作用,这类关系很难用严格的方程描述,更适合用数据学出来的隐式关系,再加一个藻类生物量不能为负的区间约束。
3.4 洪水预警:物理约束下的洪水预报模型与风险区划
洪水预警是所有场景里对预测可靠性要求最高的。文档里的洪水预报模型、洪水演进模拟和洪水风险区划三个任务各有各的物理约束方式。洪水预报模型的核心约束是马宁公式或圣维南方程组,它们描述了水流速度与坡度、糙率、水力半径的关系。PINN可以把这个关系嵌进网络,让模型预测的水位和流量组合符合水力学规律,而不是只符合历史数据的统计规律。我见过一个案例,纯数据模型在百年一遇洪水事件中预测峰值水位偏低了两米多,加进水力约束后误差缩小到半米以内,这说明物理约束在极端事件外推中的作用是纯数据模型替代不了的。
洪水演进模拟更复杂,它要求模型输出整个淹没范围的时间演变,纯数据模型很难处理这种高维时空输出。常见的做法是用代理模型——先用传统的二维水动力学模型(比如HEC-RAS)生成一批淹没模拟结果,再用CNN或U-Net学习从地形、降雨到淹没深度图的映射。这样做的好处是训练阶段用物理模型的输出做标签,预测阶段又比物理模型快几个数量级。洪水风险区划则更多依赖分类模型,物理约束主要体现在空间连续性上,相邻栅格的风险等级不应该突变,这个可以用空间正则项实现。
4. 模型优化的四个抓手:参数调优、融合、可解释性与不确定性量化
4.1 物理约束权重与超参数调整:lambda不是玄学,是网格搜索
物理约束机器学习模型的优化比纯数据模型多了一个关键维度——物理约束权重lambda的调节。文档里提到的神经网络参数优化和超参数调整,在PIML场景下指的就是两件事:网络本身的超参数(层数、隐层宽度、学习率)和物理约束项的权重。物理权重调不好会出现两种典型问题:lambda太小时物理约束不起作用,模型退化成普通神经网络;lambda太大时模型过度拟合物理方程,对观测数据的细节响应不足。我的经验是先固定物理权重,用20轮训练评估数据loss和物理loss的相对量级,然后让lambda大致等于两个loss比值的倒数,再在这个值附近做网格搜索。
超参数调整方面,PINN网络的激活函数选择值得多说一句。ReLU虽然收敛快,但它在x=0处的不可导特性会导致物理方程的残差计算不稳定,因为PINN的物理残差依赖二阶导数,ReLU的二阶导数几乎处处为零,这会让物理约束失去梯度信号。我的习惯是优先用Tanh或Swish,虽然训练慢一点,但物理残差的梯度传播稳定得多。文档里对比了CNN、RNN、LSTM在不同水文任务上的表现,我的经验是:径流时间序列预测首选LSTM或GRU,空间分布预测(如洪水淹没范围)首选CNN,需要同时处理空间和时间维度时可以考虑ConvLSTM。
4.2 多模型集成与证据理论融合:降低单一模型翻车概率
文档里提到的模型融合技术在多模型集成和基于证据理论的模型融合两个层次上展开。多模型集成的思路很直接,同时训练多个不同初始化的PIML模型,预测结果取平均或加权平均。水文预测中这种做法能显著降低单一模型在极端事件上的方差,三个模型集成后峰值流量预测的置信区间能收窄30%到40%。我一般用Bagging的思路,对训练数据做bootstrap采样,每个子模型用不同的数据子集训练,最后取中位数作为预测结果,比平均值更稳健,因为中位数对个别模型的异常偏离不敏感。
证据理论融合则是更深层的做法,适用于多个模型对同一预测结果有不同置信度的情况。每个模型根据自身的历史预测误差计算一个置信度权重,再按Dempster-Shafer规则合并。这个方法的工程实现比简单平均复杂得多,但好处是可以处理模型之间的冲突——比如物理模型和纯数据模型对某次事件的预测方向相反时,证据理论能根据每个模型的历史可靠度自动分配信任权重,而不是简单折中。文档把这个融合方法放在优化章节是有道理的,它在可解释性和预测可靠性之间的平衡做得最好。
4.3 特征重要性与可解释性:物理约束让特征归因不再黑匣子
模型可解释性提升是PIML相对纯数据模型的天然优势。文档里提到的特征重要性分析用SHAP或Permutation Importance即可实现,但物理约束模型在特征归因上有额外的好处——因为物理方程定义了特征之间的结构关系,特征重要性的结果可以直接跟物理机制对照验证。比如水量平衡模型里降水量和前期径流的重要性应该显著高于其他特征,如果SHAP值显示某个无关特征重要性异常高,说明模型学到了虚假相关,这时候要回去查数据和特征工程。
基于规则的模型解释是另一个方向,用决策树或规则集去近似训练好的PIML模型的行为,提取出若干条“如果降雨量大于某阈值且土壤湿度高于某水平,则径流将超过警戒值”这类规则。这么做的好处是给防汛调度人员一个可以直接理解判断的依据。规则提取后要做保真度验证,即规则的预测结果与PIML模型预测结果的一致性不低于95%。
4.4 不确定性量化:误差传播分析与预测区间估计
水文预测的不确定性来自三个层面:输入数据误差(降水测量误差、水位观测误差)、模型结构误差(物理方程简化、网络容量不足)、参数误差(训练不充分、物理权重不当)。文档里的误差传播分析和模型预测区间估计是两种常用手段。误差传播分析适用于物理约束项比较简单的模型,可以从输入误差通过链式法则推导到输出误差,但工程上更常用的是Monte Carlo Dropout——在预测阶段保留dropout层,多次前向传播得到一组预测值,用标准差近似预测不确定性。
预测区间估计常用Quantile Regression,直接在损失函数里用分位数损失替代MSE,输出预测值的5%和95%分位数。物理约束对预测区间的一个重要影响是:在极端事件外推时,纯数据模型的预测区间通常会异常宽甚至发散,而PIML模型的预测区间因为物理约束的牵制保持相对合理,这一点在洪水预警场景中非常关键。偏窄的预测区间在汛期会让决策者错过预警时间,偏宽的区间又会造成过度预警,物理约束相当于给区间的宽度上了一道保险。
5. 落地避坑实录:水文场景下五个典型翻车与排查思路
5.1 物理约束权重失衡导致训练不收敛
现象:模型loss前期下降正常,20轮后突然震荡,数据loss和物理loss交替上升,NSE始终上不去。
原因:物理权重lambda设置过大,模型的优化方向被物理残差主导,数据拟合项的梯度被压制。特别是在训练初期,网络参数随机初始化,物理残差的初始值远大于数据loss,导致整个训练被物理约束拖着走。
解决:采用渐进式权重策略。前20轮设置lambda=0,让模型先学一个数据拟合的粗略结果,然后每20轮按数量级递增lambda,最终到达目标值。这种“先数据后物理”的训练顺序,能让网络先建立基本映射关系,再逐步被物理规律校正。
5.2 物理约束写进了loss但实际没生效
现象:loss函数里物理残差项数值一直不为零,但最终预测结果跟不加物理约束的模型一模一样,明显违背水量平衡规律。
原因:物理残差项的梯度在反向传播时消失了。最常见的原因是激活函数选错,比如ReLU的衍生函数在饱和区的梯度为零,或者物理残差计算涉及到高阶导数,数值精度不够导致梯度被截断。另一个原因是对残差项取了绝对值或平方,在残差接近零时梯度也趋近零,形成假性收敛。
解决:检查三个位置——激活函数换成Tanh或Swish;物理残差用mse即平方均值,而不是绝对值;再就是直接用autograd对残差项做梯度检查,确认loss_phys对模型参数的梯度不为零。每次加新约束后我都会先跑一个batch做梯度诊断,确认物理约束真正参与更新。
5.3 数据插补把洪水退水段的特征抹平了
现象:模型在训练集上指标很好,但一到汛期峰值预报就偏低,尤其是退水段的下降速度预测明显滞后。排查训练数据时发现,很多场洪水的退水段都被线性插值拉成了一条直线。
原因:数据缺失往往不是随机发生的,水位计在洪水期间因淹没或损坏最容易缺测,教练数据预处理时用线性插值连续填充了多个小时的退水段,人为制造了在物理上不存在的线性变化趋势,模型学到了这个错误规律。
解决:连续缺测超过6小时就不插值,直接从训练集中剔除该时段,或者改用基于邻近站点的插补方式。我后来的习惯是在预处理流程里加一个“插补痕迹审计”,统计每个连续被插补的区段长度,长度超过设定阈值的统一标记为无效段。
5.4 验证集与训练集时间重叠导致指标虚高
现象:模型在全样本随机划分的训练/验证集上NSE达到0.93,但部署到实时预报时性能断崖式下降,NSE只有0.7左右。
原因:水文数据是强时间序列相关数据,相邻时间点的样本高度相似。按随机比例切分数据集时,验证集里大量样本的训练集邻近时刻几乎相同,模型相当于见过“标准答案”,指标虚高是必然的。
解决:按时间序列顺序划分数据集,前70%的时间段做训练,后30%做验证,严格禁止随机打乱。更严格的做法是滚动验证,每隔一个月划一个验证窗口,模型在往前一段数据上训练,这样能测试模型在不同季节和不同水文状态下的泛化能力。文档里提到的交叉验证和滚动预测对比就在这里体现了,水文场景优先滚动预测。
5.5 物理区间约束写太死,模型外推直接崩溃
现象:模型在训练范围内表现正常,一旦输入特征超出训练时的物理区间范围,预测结果出现极端异常值,比如土壤含水量超过物理上限或径流出现巨大的负值。
原因:输出层的硬区间约束在处理外推时暴露了问题。比如用sigmoid把输出限制在0到1之间,训练数据里的土壤含水率只在0.2到0.6之间,模型为了拟合数据把sigmoid的输入推到了饱和区,一旦测试数据超出这个范围,sigmoid输入进一步增大,输出被死死压在1附近,模型就失去了区分能力。
解决:把硬区间约束改成软约束,或者扩大有效工作区间。比如用softplus替代sigmoid,只保证输出非负但不限制上限;也可以用带margin的惩罚项替代硬裁剪,允许输出略微超出物理区间,但超出越多惩罚越大。这样模型在外推时虽然可能轻微越界,但不至于崩溃。
6. 评估与验证:预测区间、滚动回测与一套可复用的收尾流程
物理约束机器学习模型交付前,我习惯强制走一遍下面的验证流程,这套流程也是我读完文档后梳理出来的最终版本,专门针对水文预测的时序特性设计。
第一步是评估指标的多维度检查,不能只看NSE。水文预测最常用的三个指标各有盲区:NSE对峰值误差敏感但受极端值影响大,KGE(Kling-Gupta Efficiency)分解了相关性、偏差和变异性三个分量,更适合评估整体过程匹配度,RMSE则直接反映误差的绝对量级。我通常还会加一个峰值相对误差指标,专门衡量洪峰流量的预测偏差,这个指标在防汛场景里比NSE重要得多。文档里案例部分用到的模型结果分析,基本就是围绕这套指标组合展开的。
第二步是预测区间的可靠性检验,这是PIML模型特有的验证步骤。拿预测的90%置信区间去对照实测值,统计实测值落入区间的比例,理论上应该接近90%。如果覆盖率远低于90%,说明区间偏窄,模型过度自信;如果远高于90%,说明区间过宽,模型预测没有提供有效信息。我会画一张区间覆盖率诊断图,横轴是预测时间,纵轴是区间上下界和实测值,看区间是否在汛期合理收窄、在枯水期合理放宽。
第三步是滚动回测。从历史数据里取出连续两年的时间段,第一年做训练,第二年做验证,然后窗口向前滚动,重复这个流程。每滚动一次记录一组指标,最后看指标的时间演变趋势——如果NSE逐窗口下降,说明模型老化,需要重新训练;如果波动剧烈,说明模型对特定水文状态的适应性差,要回去检查训练集覆盖的水文情景是否足够多样。文档里案例部分的“模型构建与训练”和“模型结果分析与验证”两个环节,实际执行时就是按这个流程走的。
最后一步是失败案例复盘。把预测误差最大的前10个时段单独拎出来,逐个分析是输入数据质量问题、物理约束与实际过程冲突,还是模型结构能力不足。第一次执行这个流程时,我发现排名第一的误差事件不是极端洪水,而是一场水库调度导致的人工径流突变——模型学到的物理规律被人类干预打断,这让我意识到物理约束模型并不能处理所有场景,它约束的是自然物理过程,而人工调度这类非物理因素必须作为外部信号显式输入。
从那以后,我每次做PIML水文模型都强制走完一遍这个流程,从数据预处理的插补痕迹审计,到滚动回测的窗口设置,再到失败案例的分级复盘,每一步都留痕。物理约束机器学习不是银弹,它只是让模型在“符合物理规律”这条约束下拟合数据,但如果数据本身有坑、验证方式不对、约束权重失当,翻车的概率不比纯数据模型低。这套流程至少能让我在模型上线前知道它会在哪里翻、为什么翻、翻得多严重,而不是等汛期来了才后悔。希望帮到你。
本文还有配套的精品资源,点击获取