基于Koopman的大气污染浓度预测

大气污染物的运动本质上是非线性的,大量研究表明大气污染物浓度变化具有混沌特性。污染物浓度的变化并不是完全杂乱无章的,而是存在隐含的运动规律。污染物整体的变化过程可以看作周期与非周期变化的空间模式叠加作用的结果。

对于较大的时间尺度,污染物受到周期变化的影响较大,这种周期性是由气象、环境因素的变化(如年、季和日周期)以及人类活动(如人类活动星期效应)共同作用的。

对于一天以内的浓度变化,则存在一些小尺度时空模式。例如大气污染物在传输的过程中受到湍流等气象条件的影响,呈现特殊的运动形态并伴随着一定的间歇性,这种运动形态也被称为相干结构。

上述不同时空尺度的运动规律都可以看作时空动力系统的关键时空演化模式。关键的动力学模式可以精确反映该系统短期和长期行为特征,加深人们对复杂时空动力系统的认识。

Koopman 算符为我们提供了一个有效的数学工具,其主要思想是将一个非线性的时空动力系统映射到一个无限维的线性空间下,并通过线性算符实现系统状态预测。

该方法不依赖于明确的动力学方程,直接从观测数据中挖掘动力系统隐含的时空演化模式。通过 Koopman 算符,能够在得到原时空动力系统非线性特性的同时,保证系统不会丢失任何信息。

本文基于 Koopman 算符,挖掘PM2.5污染过程中的内在动力学模式,识别其增长、衰减或周期震荡等特征,并充分利用深度学习的非线性拟合能力与图神经网络的空间信息嵌入能力。

研究时空动力系统从非线性到线性空间的映射方法,构建融合地理空间信息的深度 Koopman 预测方法(Spatial Physics Constrained Learning framework based on Koopman theory, SPCL)。

Koopman 算符于 1931 年提出,该算符作用在动力系统任意标量函数上,描述了函数沿着任意相空间轨道的演化。时空动力系统的复杂性导致难以用较为准确的动力学方程来近似描述,只能获取通过实验或观测得到的系统状态数据。

Koopman 算符能够利用系统状态数据得到系统的动力学演化特征,从而实现系统状态的预测。

考虑一个在N维相空间M上的一个连续动力系统,给定一个初始条件 x0,该点在t时的时空状态可以表示为:

这里Ft表示在相空间 M 下系统状态的演化函数。

定义 Koopman 算符为 Kt,对于希尔伯特空间中的任意一个可观测函数 g, Koopman 算符对于 g 的作用可以表示为:

由于 Koopman 算符是无限维的线性算符,可以对其进行谱分解,假设Koopman 算符只存在离散谱,对于 Koopman 算符 Kt 的任意一个本征函数 ϕ ,在本征值 eλt 处,系统状态随时间演化可以写作:

因此,Koopman 的本征函数可以作为一组基底张成一个新的空间。在新空间下,非线性时空动力系统转化为线性系统,可以使用线性系统的预测方法解决非线性时空动力系统的预测问题,如下图所示。

动态模式分解(Dynamic Mode Decomposition, DMD)是求解 Koopman 算符最常用的方法之一。在 EDMD 计算过程中,基函数的选取至关重要,一组较完备的基函数可以较好地表示 Koopman 算符的本征函数。基函数的选取往往依赖于动力系统的先验知识,具有较大的主观性。

深度学习为 Koopman 本征函数的发现和表示提供了另一种思路,使得模型能够通过数据驱动的方式为强非线性系统提供内在的线性表示。近年来,随着机器学习的飞速发展,不少研究开始尝试使用机器学习方法获得 Koopman算符的精确估计。

其中Brunton[1]等提出的深度神经网络(Deep Neural Networks,DNN)被证明能比其他方法更灵活准确地表征Koopman本征函数。

在动力系统中,变量之间往往存在一定相关关系,尤其在时空动力系统中,不同位置的系统状态相互影响。在 DMD 算法的构建过程中,所有的系统状态在算法输入时统一被组织成快照矩阵,丢失了系统的空间信息。

而在上述深度 Koopman 算符中,自动编码器在进行空间映射时同样忽略了不同位置上系统状态之间的关系。事实上,深度学习与 Koopman 算符的结合使得模型的输入变得更加灵活,也为模型考虑系统空间信息提供了可能性。

本文基于 Azencot等人[2]提出的基于物理约束的深度 Koopman 算符,在状态空间转换过程中加入了地理空间信息表征。

模型主要包括空间信息嵌入、编码-解码、线性动力学预测与逆向动力学逆推步骤。模型将系统状态在t时刻下的观测值xt作为模型输入,结合空间信息将数据组织成图结构gt,利用图表示方法将空间信息嵌入得到ft, ft经过自动编码器实现状态空间的映射,并在线性矩阵的作用下实现新坐标系下状态的演化。最后网络通过一个解码器得到每个图节点上的预测值。

模型中重要的超参数为相空间维度,也就是线性矩阵 C、 D 的维度。在时空动力系统中, Koopman 算符Kt作用在相空间函数上,该空间包含了目标动力系统的所有状态变量。Koopman 模式则描述了观测量在相空间时空演化过程中的动力特征,一个合适的相空间维度能够更好地表达时空动力系统的演化特征。

相空间维度不宜太小或太大。当维数过小时,难以充分分析动力系统的动态特性。当维数过大时,相空间中相点的形成过于稀疏,同时可能会造成噪音干扰。下表展示了不同相空间维度下的平均误差结果,实验表明当维度为 32 时模型取得最高的预测精度。

基于上述超参数的选择,我们对比了 LSTM、 PCL 与 SPCL 模型连续预测 12 步的预测精度,评估指标结果如下表所示。总体来看,基于 Koopman 理论的预测模型与 LSTM 相比,在预测精度上存在明显提升。

以第一步预测为例, PCL 与 SPCL的四项指标较 LSTM 分别提升 18%、 26%(MAE), 15%、 24%(RMSE),相关系数从 0.73 分别提升至 0.83、 0.86, IA 从 0.79 分别提升至 0.89、 0.92。

可以看出,相较于传统的深度学习时序预测模型,基于 Koopman 理论的模型具有更简单的模型结构,但通过状态空间的变换,依然能够通过提取关键信息实现更高精度的预测结果。

[1] LUSCH B, KUTZ J N, BRUNTON S L. Deep learning for universal linear embeddings of nonlinear dynamics[J]. Nature communications, 2018, 9(1): 1-10.

[2] AZENCOT O, ERICHSON N B, LIN V, et al. Forecasting sequential data using consistent koopman autoencoders[C]//International Conference on Machine Learning. PMLR, 2020: 475-485.

MindSpore官方资料

官方QQ群 : 486831414

官网:https://www.mindspore.cn/

Gitee : https : //gitee.com/mindspore/mindspore

GitHub : https://github.com/mindspore-ai/mindspore

论坛:https://bbs.huaweicloud.com/forum/forum-1076-1.html 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Koopman算子的控制与预测通常需要使用非线性系统的Koopman算子,因为非线性系统的演化很难用线性算子表示。下面是一个基于Koopman算子的非线性系统控制与预测的示例代码: ```python import numpy as np from sklearn.kernel_approximation import RBFSampler from scipy.linalg import pinv # 定义非线性系统的动力学方程 def f(x): return np.array([x[0] + 0.1 * x[0] * x[1], x[1] - 0.1 * x[0] * x[1]]) # 定义Koopman算子的RBF核参数 rbf_sigma = 0.2 rbf_n_components = 100 # 生成训练数据 train_x = np.random.uniform(low=-1, high=1, size=(500, 2)) # 计算Koopman算子的RBF特征 rbf_features = RBFSampler(gamma=1.0 / (2 * rbf_sigma ** 2), n_components=rbf_n_components) train_features = rbf_features.fit_transform(train_x) # 计算Koopman算子的近似矩阵 K = np.dot(train_features.T, train_features) / train_features.shape[0] # 计算Koopman算子的逆矩阵 K_inv = pinv(K) # 定义控制变量 u = np.array([0.5, 0.5]) # 定义初始状态 x = np.array([0.1, 0.1]) # 执行控制循环 for i in range(10): # 计算状态演化 x_feature = rbf_features.transform(x.reshape(1, -1)) x_koopman = np.dot(K_inv, np.dot(train_features.T, x_feature.T)).reshape(-1) x = f(x) + np.dot(u, i) - x_koopman # 输出当前状态 print("x_{} = {}".format(i, x)) # 执行预测循环 x_predict = np.array([0.1, 0.1]) for i in range(10): # 计算状态演化 x_feature = rbf_features.transform(x_predict.reshape(1, -1)) x_koopman = np.dot(K_inv, np.dot(train_features.T, x_feature.T)).reshape(-1) x_predict = f(x_predict) + np.dot(u, i) - x_koopman # 输出预测状态 print("x_predict_{} = {}".format(i, x_predict)) ``` 在这个示例代码中,我们首先定义了一个非线性系统的动力学方程f(x),表示状态向量x的演化。然后定义了Koopman算子的RBF核参数,生成了训练数据train_x,计算了Koopman算子的近似矩阵K和逆矩阵K_inv。接下来,我们执行了一个控制循环,每次循环中计算状态向量x的演化,并输出当前状态。在控制循环后,我们执行了一个预测循环,每次循环中计算状态向量x_predict的演化,并输出预测状态。在控制和预测循环中,我们使用了Koopman算子的逆矩阵K_inv来将状态向量转化为Koopman空间中的向量,然后再进行计算和控制/预测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值