时间序列中的动态模态分解

动态模态分解 (dynamic mode decomposition) 最早是被用来分析流体(例如水流)的动态过程,它可以把复杂的流动过程分解为低秩的时空特征 (low-rank spatiotemporal features),这种方法的强大之处在于它不依赖于动态系统中的任何主方程。作为衍生,动态模态分解可以被用来分析多元时间序列 (multivariate time series),进行短期未来状态预测。

动态模态分解是一种数据驱动的方法,其在描述一些动态过程时具有很多优势,包括:

  • 动态模态分解不依赖于任何给定的动态系统表达式;

  • 不同于奇异值分解,动态模态分解可以做短期状态预测,即模型本身具备预测能力。

本期文章为大家简要介绍该模型的原理。

测试源码:https://github.com/ekmmrs/DMD_sector_rotation

9e78e070da71e7e4959a4518b0c4521d.gif

模型表达式

实际上,动态模态分解和我们比较熟悉的向量自回归一样,他们拥有完全一样的数学表达式。具体而言,若多元时间序列是由 M 条时间长度为 T 的时间序列组成,则对于时刻 t , 动态模态分解的表达式为:

ee638d50fb505cfed69b6da637f452c0.png

其中,A 表示 Koopman 矩阵,大小为 M x M,当然,在向量自回归里面,我们会称矩阵 A 为系数矩阵 (coefficient matrix)。

在这里,如果令

92bd1a3f1f4c98260d822e6a482a4684.png

则动态模态分解的表达式可以写成:

09953f7083cdfedb27ea2c8850885223.png

不过与向量自回归不同的是,A 作为动态模态分解中的 Koopman 矩阵时,它可以用一个低秩结构进行逼近。在向量自回归中,如果求解系数矩阵 A ,我们需要对向量自回归的残差平方和做最小化处理,即

aad1d86dead00ac240352cfa94145a56.png

模型求解

在动态模态分解中,如果求解 Koopman 矩阵,我们可以采用如下两步:

  • 对矩阵 X1 进行奇异值分解,即 9badfffd3ae1be9f433c75f1e0bbdc04.png

  • 取矩阵 X1 的截断奇异值分解,截断的秩为 r,则可用如下矩阵:

cd70bd484008a5a1e70cd61f4809c3f7.png

对 Koopman 矩阵 A 进行近似,其中,矩阵 f9d146e1b64a22c3c54bb01a8684e833.png87c7960371d217cba7052455bcc04f3d.png1c8b3ef4e2d601dfe39e19e890b4d6fd.png分别为 U, V, ∑ 的截断矩阵。

到这里,我们实际上已经完成了对 Koopman 矩阵 A 的近似求解。如果想借助动态模态分解进行时空特征分析,我们可以对矩阵 3265bb315337c9062a7361d8cd480581.png 进行特征值分解,即 48dd6104a276fcc83e5a22d617c2adef.png,其中,42040dc508613bf6efae67f4b04a6a58.jpeg 是一个对角矩阵,对角线上面的元素为特征值,而矩阵 6a80027ebb9ceb1bcfc3f9971d2a0467.jpeg 则由特征向量构成。通常来说,我们可以用特征值和特征向量来分析复杂流动过程的时空特征。

实际上,不管是向量自回归还是动态模态分解,它们都具备一定的预测能力。在动态模态分解中,定义

3e09504d10f72bbe1a39133b0e2c7c0c.png

便可以根据 02cdc7d7932566d9d4d7048410645b86.png进行短期预测。

实验

01

案例代码

import numpy as np


def dmd(X1, X2, rank):
    """Dynamic Mode Decomposition, DMD."""
    
    u, s, v = np.linalg.svd(X1, full_matrices = 0)
    A_tilde = u[:, : rank].conj().T @ X2 @ v[: rank, :].conj().T @ np.linalg.inv(np.diag(s[: rank]))
    eigval, eigvec = np.linalg.eig(A_tilde)
    Phi = X2 @ v[: rank, :].conj().T @ np.linalg.inv(np.diag(s[: rank])) @ eigvec
    temp = Phi @ np.diag(eigval) @ (np.linalg.pinv(Phi) @ X1)
    
    return temp.real, eigval, Phi

02

实例分析

预测如下矩阵的最后一行,其他5行数据作为训练样本:

c621db1f9f4de0cc0bc0fdbd1f1fba95.png

X = np.array([[-2,6,1,1,-1],
               [-1,5,1,2,-1],
               [0,4,2,1,-1],
               [1,3,2,2,-1],
               [2,2,3,1,-1],
               [3,1,3,2,-1]])
X1 = X[: 4, :].T
X2 = X[1 : 5, :].T
rank = 3
temp, eigval, Phi = dmd(X1, X2, rank)
print("矩阵X最后一行的预测值为:")
print((Phi @ np.diag(eigval) @ (np.linalg.pinv(Phi) @ X[4, :])).real)

输出结果为:

矩阵X最后一行的预测值为:
[ 3.          1.          3.00000002  1.99999999 -1.        ]

对比结果:

01c94b7d027daeec1de22593867c531d.png

推荐阅读:

我的2022届互联网校招分享

我的2021总结

浅谈算法岗和开发岗的区别

互联网校招研发薪资汇总
2022届互联网求职现状,金9银10快变成铜9铁10!!

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记

发送【AI四大名著】获取四本经典AI电子书

猜你喜欢

转载自blog.csdn.net/qq_33431368/article/details/127312314
今日推荐