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= 54530−53540001 -
矩阵 Σ \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.]]
备注
个人水平有限,有问题随时交流~