奇异值分解 SVD 的数学解释

奇异值分解 SVD 的数学解释奇异值分解 SingularValu SVD 是一种矩阵分解 MatrixDecomp 的方法 除此之外 矩阵分解还有很多方法 例如特征分解 Eigendecompo LU 分解 LUdecomposit QR 分解 QRdecomposit 和极分解 Polardecompo 等 这篇文章主要说下奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解(Matrix Decomposition)的方法。除此之外,矩阵分解还有很多方法,例如特征分解(Eigendecomposition)、LU分解(LU decomposition)、QR分解(QR decomposition)和极分解(Polar decomposition)等。这篇文章主要说下奇异值分解,这个方法在机器学习的一些算法里占有重要地位。


相关概念

参考自维基百科。

  • 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等。两个向量正交的意思是两个向量的内积为 0
  • 正定矩阵:如果对于所有的非零实系数向量 z z z,都有 z T A z > 0 z^TAz>0 zTAz>0,则称矩阵 A A A 是正定的。正定矩阵的行列式必然大于 0, 所有特征值也必然 > 0。相对应的,半正定矩阵的行列式必然 ≥ 0。

定义

下面引用 SVD 在维基百科中的定义。

In linear algebra, the singular value decomposition (SVD) is a factorization of a real or complex matrix. It is the generalization of the eigendecomposition of a positive semidefinite normal matrix (for example, a symmetric matrix with positive eigenvalues) to any $ m\times n $ matrix via an extension of polar decomposition.

也就是说 SVD 是线代中对于实数矩阵和复数矩阵的分解,将特征分解从 半正定矩阵 推广到任意 m × n m \times n m×n 矩阵。

注意:本篇文章内如未作说明矩阵均指实数矩阵。

假设有 m × n m \times n m×n 的矩阵 A A A ,那么 SVD 就是要找到如下式的这么一个分解,将 A A A 分解为 3 个矩阵的乘积:

A m × n = U m × m Σ m × n V n × n T A_{m \times n} = U_{m \times m}\Sigma_{m \times n} V^T_{n \times n} Am×n=Um×mΣm×nVn×nT

其中, U U U V V V 都是正交矩阵 (Orthogonal Matrix),在复数域内的话就是酉矩阵(Unitary Matrix),即

U T U = E m × m U^TU = E_{m \times m} UTU=Em×m

V T V = E n × n V^TV=E_{n \times n} VTV=En×n

换句话说,就是说 U U U 的转置等于 U U U 的逆, V V V 的转置等于 V V V 的逆:

U T = U − 1 U^T = U^{-1} UT=U1

V T = V − 1 V^T = V^{-1} VT=V1

Σ \Sigma Σ 就是一个非负实对角矩阵。

那么 U U U V V V 以及 Σ \Sigma Σ 是如何构成的呢?


求解

U U U V V V 的列分别叫做 A A A左奇异向量(left-singular vectors)和 右奇异向量(right-singular vectors), Σ \Sigma Σ 的对角线上的值叫做 A A A 的奇异值(singular values)。

其实整个求解 SVD 的过程就是求解这 3 个矩阵的过程,而求解这 3 个矩阵的过程就是求解特征值和特征向量的过程,问题就在于 求谁的特征值和特征向量

  • U U U 的列由 A A T AA^T AAT 的单位化过的特征向量构成
  • V V V 的列由 A T A A^TA ATA 的单位化过的特征向量构成
  • Σ \Sigma Σ 的对角元素来源于 A A T AA^T AAT A T A A^TA ATA 的特征值的平方根,并且是按从大到小的顺序排列的

知道了这些,那么求解 SVD 的步骤就显而易见了:

  1. A A T AA^T AAT 的特征值和特征向量,用单位化的特征向量构成 U U U
  2. A T A A^TA ATA 的特征值和特征向量,用单位化的特征向量构成 V V V
  3. A A T AA^T AAT 或者 A T A A^TA ATA 的特征值求平方根,然后构成 Σ \Sigma Σ

举例

假设

A = ( 2 4 1 3 0 0 0 0 ) A = \begin{pmatrix} 2 & 4 \\ 1 & 3 \\ 0 & 0 \\ 0 & 0 \\ \end{pmatrix} A=21004300

那么可以计算得到

A A T = ( 20 14 0 0 14 10 0 0 0 0 0 0 0 0 0 0 ) AA^T = \begin{pmatrix} 20 & 14 & 0 & 0 \\ 14 & 10 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ \end{pmatrix} AAT=20140014100000000000

接下来就是求这个矩阵的特征值和特征向量了

A A T x = λ x AA^T x = \lambda x AATx=λx

( A A T − λ E ) x = 0 (AA^T – \lambda E)x = 0 (AATλE)x=0

要想该方程组有非零解(即非零特征值),那么系数矩阵 A A T − λ E AA^T – \lambda E AATλE 的行列式必须为 0

∣ 20 − λ 14 0 0 14 10 − λ 0 0 0 0 − λ 0 0 0 0 − λ ∣ = 0 \begin{vmatrix} 20-\lambda & 14 & 0 & 0 \\ 14 & 10-\lambda & 0 & 0 \\ 0 & 0 & -\lambda & 0 \\ 0 & 0 & 0 & -\lambda \\ \end{vmatrix} = 0 20λ14001410λ0000λ0000λ=0

求解这个行列式我就不再赘述了,这个直接使用行列式展开定理就可以了,可以得到 λ 1 ≈ 29. , λ 2 ≈ 0. , λ 3 = λ 4 = 0 \lambda_1 \approx 29.,\lambda_2 \approx 0.,\lambda_3 = \lambda_4 = 0 λ129.86606875λ20.13393125λ3=λ4=0,有 4 个特征值,因为特征多项式 ∣ A A T − λ E ∣ \vert AA^T – \lambda E \vert AATλE 是一个 4 次多项式。对应的单位化过的特征向量为

( 0. − 0. 0 0 0. 0. 0 0 0 0 1 0 0 0 0 1 ) \begin{pmatrix} 0. & -0. & 0 & 0 \\ 0. & 0. & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} 0.817415560.57604844000.576048440.817415560000100001

这就是矩阵 U U U 了。

同样的过程求解 A T A A^TA ATA 的特征值和特征向量,求得 λ 1 ≈ 0. , λ 2 ≈ 29. \lambda_1 \approx 0.,\lambda_2 \approx 29. λ10.13393125λ229.86606875,将特征值降序排列后对应的单位化过的特征向量为

( 0. − 0. 0. 0. ) \begin{pmatrix} 0. & -0. \\ 0. & 0. \\ \end{pmatrix} (0.404553580.91451430.91451430.40455358)

这就是矩阵 V V V 了。

而矩阵 Σ \Sigma Σ 根据上面说的为特征值的平方根构成的对角矩阵

( 5. 0 0 0. 0 0 0 0 ) \begin{pmatrix} 5. & 0 \\ 0 & 0. \\ 0 & 0 \\ 0 & 0 \\ \end{pmatrix} 5.464985700000.3659661900

到此,SVD 分解就结束了,原来的矩阵 A A A 就被分解成了 3 个矩阵的乘积。

A 4 × 2 = U 4 × 4 Σ 4 × 2 V 2 × 2 T A_{4 \times 2} = U_{4 \times 4}\Sigma_{4 \times 2} V^T_{2 \times 2} A4×2=U4×4Σ4×2V2×2T

( 2 4 1 3 0 0 0 0 ) = ( 0. − 0. 0 0 0. 0. 0 0 0 0 1 0 0 0 0 1 ) ( 5. 0 0 0. 0 0 0 0 ) ( 0. − 0. 0. 0. ) T \begin{pmatrix} 2 & 4 \\ 1 & 3 \\ 0 & 0 \\ 0 & 0 \\ \end{pmatrix} = \begin{pmatrix} 0. & -0. & 0 & 0 \\ 0. & 0. & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} 5. & 0 \\ 0 & 0. \\ 0 & 0 \\ 0 & 0 \\ \end{pmatrix} \begin{pmatrix} 0. & -0. \\ 0. & 0. \\ \end{pmatrix} ^ T 21004300=0.817415560.57604844000.576048440.8174155600001000015.464985700000.3659661900(0.404553580.91451430.91451430.40455358)T


Numpy 实现

Python 中可以使用 numpy 包的 linalg.svd() 来求解 SVD。

import numpy as np A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]]) print(np.linalg.svd(A)) 

输出

(array([[-0., -0., 0. , 0. ], [-0., 0., 0. , 0. ], [ 0. , 0. , 1. , 0. ], [ 0. , 0. , 0. , 1. ]]), array([ 5. , 0.]), array([[-0., -0. ], [-0. , 0.]])) 

END

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211200.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:58
下一篇 2026年3月18日 下午10:58


相关推荐

  • javaweb酒店管理系统源代码_java简单酒店管理系统代码

    javaweb酒店管理系统源代码_java简单酒店管理系统代码大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT)、PYTHON、PHP、C#、安卓等多项技术。今天将为大家分析一个小型酒店管理系统(当前酒店管理系统已经得到了充足的发展和完善,一些大的酒店购买了功能强大、数据量处理快速、客户行为研究的软件,借此来提升酒店的核心竞争力。但是对于一些中小规模的酒店而言,昂贵的系统花费、专人的维护是不现实的,也是非常不灵活的。…

    2026年3月10日
    5
  • java rpc motan_RPC框架motan使用

    java rpc motan_RPC框架motan使用简介 motan 是新浪微博开源的一套轻量级 方便使用的 RPC 框架 HelloWorld 使用的过程分为 Server 端和 Client 端 Server 提供 RCP 的服务接口 Client 端发起调用获取结果 maven 的 pom 文件配置 0 2 1com weibomotan core motan version com weibomotan transport netty motan version com

    2026年3月19日
    1
  • JAVA学习Swing章节流布局管理器简单学习

    JAVA学习Swing章节流布局管理器简单学习

    2021年9月16日
    57
  • 读《Redis入门指南》2

    读《Redis入门指南》2上一篇主要写了一些数据结构的应用场景 这一篇开始着重介绍其他的问题小白在进行添加关注 被关注数据时 异常导致只有关注信息被插入第一个问题是事务 原子性 第二个错误处理 watch 函数的用法 类似于 oracle 中 noCommit 当数据处于 watch 状态时 multi 事务并不能执行 只有当 Exec 之后 用户才能执行事务

    2026年3月19日
    2
  • web.xml 配置 contextConfigLocation

    web.xml 配置 contextConfigLocationweb xml 中 classpath 和 classpath nbsp nbsp 有什么区别 nbsp classpath 只会到你的 class 路径中查找找文件 nbsp classpath 不仅包含 class 路径 还包括 jar 文件中 class 路径 进行查找 nbsp 有时候会用模糊匹配的方式配置多配置文件 但是如果配置文件是在 jar 包里 模糊匹配就找不到了 可以用逗号隔开的方式配置多个配置文件

    2026年3月16日
    2
  • python字符串处理方法

    python字符串处理方法一、combine&duplicate字符串结合和复制字符和字符串可以用来相加来组合成一个字符串输出;字符或字符串复制输出。二、Extract&Slice字符串提取和切

    2022年7月6日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号