笔记 | SVD | 奇特值分解

打印 上一主题 下一主题

主题 1600|帖子 1600|积分 4800

SVD原理

SVD分解或者说极大协方差分析方法,重要针对于一般实矩阵的SVD运算。此中,一般实矩阵指行数和列数可以不等的实元素矩阵。
如下所示,假设                                   C                              C                  C 为                                   m                         ×                         n                              m \times n                  m×n阶矩阵,则存在一个                                   m                         ×                         m                              m \times m                  m×m阶的列正交矩阵                                    U                              U                  U 和                                    n                         ×                         n                              n \times n                  n×n阶的列正交矩阵                                    V                              V                  V,使得:
                                         C                            =                            U                                       (                                                                                     Σ                                                                                             0                                                                                                                   0                                                                                             0                                                                                 )                                                 V                               T                                            \mathbf{C}=\mathbf{U} \begin{pmatrix} \mathbf{\Sigma} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} \end{pmatrix}\mathbf{V}^\mathbf{T}                     C=U(Σ0​00​)VT
成立。此中,                                   Σ                              \Sigma                  Σ
是                                    r                              r                  r 阶对角矩阵或者可以写成                                   Σ                         =                         d                         i                         a                         g                         (                                   σ                            1                                  ,                                   σ                            2                                  ,                                   σ                            3                                  ,                         .                         .                         .                         ,                                   σ                            r                                  )                              \Sigma=diag(\sigma_1,\sigma_2,\sigma_3,...,\sigma_r)                  Σ=diag(σ1​,σ2​,σ3​,...,σr​),                                    (                         r                         ⩽                         min                         ⁡                         {                         m                         ,                         n                         }                         )                              (r\leqslant\min\{m,n\})                  (r⩽min{m,n}),且                                             σ                            1                                  ⩾                                   σ                            2                                  ⩾                         ⋯                         ⩾                                   σ                            r                                  >                         0                              \sigma_1\geqslant\sigma_2\geqslant\cdots\geqslant\sigma_r>0                  σ1​⩾σ2​⩾⋯⩾σr​>0。
以上称为实一般矩阵                                   C                              C                  C的奇特值分解,                                             σ                            i                                  (                         i                         =                         1                         ,                         2                         ,                         3                         ,                         .                         .                         .                         ,                         r                         )                              \sigma_i(i=1,2,3,...,r)                  σi​(i=1,2,3,...,r)称为                                   C                              C                  C的奇特值,                                    U                              U                  U的列向量称为左奇特向量,                                   V                              V                  V的列向量称为右奇特向量。
对于正交矩阵,总是使空间旋转或反射,而对角矩阵总是使空间缩放。

本质上,对于一个矩阵                                   C                              C                  C的奇特值分解,实际转换为求取以上两个方阵                                   U                              U                  U和                                   V                              V                  V的特征值和特征向量的问题,特征值的正的平方根就是奇特值(对角矩阵                                        Σ                                  \Sigma                     Σ的对角线元素),特征值对应的特征向量分别是左奇向量和右奇向量,下面会先容干系的盘算。
下面是SVD的一个分解示意图:

盘算步调

以下                                             C                            T                                       C^T                  CT表现                                   C                              C                  C的转置
1、盘算左奇特向量(                                   U                              U                  U)。它等于                                    C                                   C                            T                                       CC^T                  CCT 的特征向量。
2、盘算右奇特向量(                                   V                              V                  V)。它等于 $C^TC $的特征向量。
3、盘算                                    C                                   C                            T                                       CC^T                  CCT 或                                              C                            T                                  C                              C^TC                  CTC 的特征值的平方根。
以上盘算过程可以在numpy函数中封装,可以直接举行调用:numpy.linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)
当 a 是一个 2D 数组时, 且 full_matrices=False,然后将其分解为 u @ np.diag(s) @ vh = (u * s) @ vh ,此中 u 和 vh 的 Hermitian 转置是具有正交列的二维数组,s 是 a 的奇特值的一维数组。
np.diag()表现提取对角线或构建对角数组。此中,返回的                                   U                              U                  U是左奇特向量,                                   V                         h                              Vh                  Vh是右奇特向量,                                   s                              s                  s是奇特值
GitHub上有博主提供了一个盘算演示代码:


  • https://github.com/longhongc/SVD-python-implementation/blob/main/my_SVD.ipynb
SVD与EOF的关系

EOF实际上是SVD的特别环境,对于SVD针对的是两个物理时空场,而EOF是一个物理时空场,如m表现空间点,n表现时间点,那么

利用盘算得到的奇特向量和对应的时间系数可以恢复原来的数据,这里                                   X                              X                  X表现原始数据,即
                                         X                            =                            U                            T                                  X = UT                     X=UT
那么,同样的道理,根据原始数据和奇特向量也可以用来得到对应的时间序列,即
                                    T                         =                                   U                            T                                  X                              T=U^TX                  T=UTX
SVD在情形海洋中的应用

在实际利用SVD分解在情形海洋数据时,步调相对上述的盘算有完善一点,具体为:
1、数据的预处理,必要输入两个距平变量场或者标准化变量场的交叉协方差矩阵A
2、盘算A矩阵的左奇特向量U,即主成分模态,列向量对应EOF空间模态
3、盘算A矩阵的右奇特向量V
4、根据左变量场及左奇特向量盘算时间系数矩阵,即                                   P                         C                         =                                   U                            X                                       PC=U^X                  PC=UX,这里                                   X                              X                  X表现原始场
5、盘算每对奇特向量的方程贡献和累计方差贡献
6、显著性查验
SVD的物理意义

SVD在情形、海洋实际应用中每每是对两个物理量场做分解的。其原理是要求两个场的展开系数的协方差最大。比如对某海域的海表温度(SST)和海表气压(SLP)做SVD分析,是为了提取出这两个变量之间相互耦合(协方差矩阵)的最重要的空间模态和时间演变信息。
此中的空间模态就是SVD得到的奇特向量(左右奇特向量分别对应SST和SLP),它们有各自的时间系数表征了时间演变特征。注意SVD方法输入的两个变量场的空间点数可以不类似(m1, m2),但是两个变量的时间长度必须类似(n)

python中的svd分解

在python中,不仅numpy提供了svd函数,scipy也提供了可调用的函数:scipy.linalg.svd和scipy.sparse.linalg.svds.
以上scipy提高的函数中,当输入矩阵是麋集矩阵且必要所有奇特值时,第一种方法通常更有效。而当输入矩阵 X 是稀疏矩阵或只必要最大奇特值时,第二种方法通常非常有效。

而scipy.linalg.svd快速的原因是以分配大量内存用于临时盘算为代价,随维数的增加而变化。

应用个例

对于热带垂直速度                                   ω                              \omega                  ω,可以通过svd将别的被分解为履历垂直结构函数(EOF)及其干系的主成分(PC),代表空间和时间变率。
此中,第一模态和第二模态分别可以表现第一斜压和第二斜压模,第一斜压模态与深对流云有关,第二斜压模态与层状云有关。

参考



  • https://mp.weixin.qq.com/s/SBwRI1vg3h-wqjphMsHbGA
  • https://numpy.org/doc/2.2/reference/generated/numpy.linalg.svd.html
  • https://fa.bianp.net/blog/2012/singular-value-decomposition-in-scipy/
  • https://github.com/longhongc/SVD-python-implementation
  • https://pyoceans.github.io/sea-py/
  • https://github.com/mathildejutras/mtm-svd-python/tree/master
  • 上课课件

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表