【Math】奇异值分解(SVD)详解及 Python 实现

1. 什么是奇异值分解(SVD)

奇异值分解(Singular Value Decomposition,简称 SVD)是矩阵分解的一种方法,它将任意矩阵 A A A 分解为三个矩阵的乘积:

A = U Σ V T A = U \Sigma V^T A=UΣVT

其中:

  • A A A m × n m \times n m×n 的矩阵。
  • U U U m × m m \times m m×m 的酉矩阵,包含 A A T A A^T AAT 的特征向量。
  • Σ \Sigma Σ 是一个 m × n m \times n m×n 的对角矩阵,包含矩阵 A A A 的奇异值。
  • V T V^T VT n × n n \times n n×n 的酉矩阵,包含 A T A A^T A ATA 的特征向量。

奇异值分解不仅适用于方阵,也适用于任意矩阵。它在信号处理、图像压缩、降维和推荐系统等应用中有着广泛的应用。

2. 计算步骤

步骤 1:计算 A A T A A^T AAT A T A A^T A ATA

首先,我们计算矩阵 A A T A A^T AAT A T A A^T A ATA

  • A A T A A^T AAT 是一个 m × m m \times m m×m 的对称矩阵;
  • A T A A^T A ATA 是一个 n × n n \times n n×n 的对称矩阵。

步骤 2:求解特征值和特征向量

  • A A T A A^T AAT 求特征值和特征向量:矩阵 A A T A A^T AAT 的特征向量构成了矩阵 U U U,它的特征值的平方根是矩阵 A A A 的奇异值。

  • A T A A^T A ATA 求特征值和特征向量:矩阵 A T A A^T A ATA 的特征向量构成了矩阵 V V V,它的特征值的平方根同样是矩阵 A A A 的奇异值。

步骤 3:构建矩阵 U U U Σ \Sigma Σ V T V^T VT

  • U U U 是由 A A T A A^T AAT 的特征向量构成的矩阵。
  • Σ \Sigma Σ 是一个对角矩阵,包含矩阵 A A A 的奇异值(特征值的平方根)。
  • V T V^T VT 是由 A T A A^T A ATA 的特征向量构成的矩阵。

步骤 4:重构矩阵 A A A

最后,我们可以通过公式

A = U Σ V T A = U \Sigma V^T A=UΣVT

重构原矩阵 A A A,并验证是否一致。

3. 例子:求解矩阵 A A A 的奇异值分解

假设我们有一个简单的 3 × 2 3 \times 2 3×2 矩阵 A A A

A = [ 4 0 3 0 0 0 ] A = \begin{bmatrix} 4 & 0 \\ 3 & 0 \\ 0 & 0 \end{bmatrix} A= 430000

我们将按照以下步骤来计算它的奇异值分解(SVD):

步骤 1:计算 A A T A A^T AAT A T A A^T A ATA

首先计算矩阵 A A T A A^T AAT A T A A^T A ATA

A A T = [ 4 0 3 0 0 0 ] [ 4 3 0 0 0 0 ] = [ 16 12 0 12 9 0 0 0 0 ] A A^T = \begin{bmatrix} 4 & 0 \\ 3 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 4 & 3 & 0 \\ 0 & 0 & 0 \end{bmatrix} = \begin{bmatrix} 16 & 12 & 0 \\ 12 & 9 & 0 \\ 0 & 0 & 0 \end{bmatrix} AAT= 430000 [403000]= 161201290000

A T A = [ 4 3 0 0 0 0 ] [ 4 0 3 0 0 0 ] = [ 25 0 0 0 ] A^T A = \begin{bmatrix} 4 & 3 & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} 4 & 0 \\ 3 & 0 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} 25 & 0 \\ 0 & 0 \end{bmatrix} ATA=[403000] 430000 =[25000]

步骤 2:求解特征值和特征向量

  • A A T A A^T AAT 求特征值和特征向量:

    • 特征值: 25 25 25 0 0 0
    • 对应的特征向量为:
      u 1 = [ 4 5 3 5 0 ] \mathbf{u}_1 = \begin{bmatrix} \frac{4}{5} \\ \frac{3}{5} \\ 0 \end{bmatrix} u1= 54530 u 2 = [ − 3 5 4 5 0 ] \mathbf{u}_2 = \begin{bmatrix} -\frac{3}{5} \\ \frac{4}{5} \\ 0 \end{bmatrix} u2= 53540
  • A T A A^T A ATA 求特征值和特征向量:

    • 特征值: 25 25 25 0 0 0
    • 对应的特征向量为:
      v 1 = [ 1 0 ] \mathbf{v}_1 = \begin{bmatrix} 1 \\ 0 \end{bmatrix} v1=[10] v 2 = [ 0 1 ] \mathbf{v}_2 = \begin{bmatrix} 0 \\ 1 \end{bmatrix} v2=[01]

步骤 3:构建矩阵 U U U Σ \Sigma Σ V T V^T VT

  • 矩阵 U U U A A T A A^T AAT 的特征向量矩阵:
    U = [ 4 5 − 3 5 0 3 5 4 5 0 0 0 1 ] U = \begin{bmatrix} \frac{4}{5} & -\frac{3}{5} & 0 \\ \frac{3}{5} & \frac{4}{5} & 0 \\ 0 & 0 & 1 \end{bmatrix} U= 5453053540001

  • 矩阵 Σ \Sigma Σ 是对角矩阵,包含奇异值:
    Σ = [ 5 0 0 0 0 0 ] \Sigma = \begin{bmatrix} 5 & 0 \\ 0 & 0 \\ 0 & 0 \end{bmatrix} Σ= 500000

  • 矩阵 V T V^T VT A T A A^T A ATA 的特征向量矩阵:
    V T = [ 1 0 0 1 ] V^T = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} VT=[1001]

步骤 4:重构矩阵 A A A

我们可以通过公式 A = U Σ V T A = U \Sigma V^T A=UΣVT 来重构矩阵 A A A,并验证其正确性。


4. Python 实现

下面是一个 Python 代码实现,使用 numpy 库计算并验证矩阵 A A A 的 SVD。

import numpy as np

# 定义矩阵 A
A = np.array([[4, 0],
              [3, 0],
              [0, 0]])

# 计算 A 的 SVD
U, Sigma, VT = np.linalg.svd(A)

# 输出结果
print("U 矩阵:")
print(U)
print("\nSigma (奇异值):")
print(Sigma)
print("\nV^T 矩阵:")
print(VT)

# 将 Sigma 转换为对角矩阵形式
Sigma_matrix = np.zeros((A.shape[0], A.shape[1]))
Sigma_matrix[:len(Sigma), :len(Sigma)] = np.diag(Sigma)
print("\nSigma 矩阵:")
print(Sigma_matrix)

# 验证 SVD 是否正确,重新构建 A
A_reconstructed = np.dot(U, np.dot(Sigma_matrix, VT))

print("\n重构的矩阵 A (U * Sigma * V^T):")
print(A_reconstructed)

# 检查重构矩阵与原始矩阵是否接近
print("\n重构矩阵与原矩阵的差异:")
print(A - A_reconstructed)

输出结果

运行代码后,可能得到如下输出:

U 矩阵:
[[ 0.8  0.6  0. ]
 [ 0.6 -0.8  0. ]
 [ 0.   0.   1. ]]

Sigma (奇异值):
[5. 0.]

V^T 矩阵:
[[1. 0.]
 [0. 1.]]

Sigma 矩阵:
[[5. 0.]
 [0. 0.]
 [0. 0.]]

重构的矩阵 A (U * Sigma * V^T):
[[4. 0.]
 [3. 0.]
 [0. 0.]]

重构矩阵与原矩阵的差异:
[[0. 0.]
 [0. 0.]
 [0. 0.]]

备注

个人水平有限,有问题随时交流~

你可能感兴趣的:(Math,多模态理解,python,开发语言)