奇异值分解(Singular Value Decomposition,简称 SVD)是矩阵分解的一种方法,它将任意矩阵 A A A 分解为三个矩阵的乘积:
A = U Σ V T A = U \Sigma V^T A=UΣVT
其中:
奇异值分解不仅适用于方阵,也适用于任意矩阵。它在信号处理、图像压缩、降维和推荐系统等应用中有着广泛的应用。
首先,我们计算矩阵 A A T A A^T AAT 和 A T A A^T A ATA:
对 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 的奇异值。
最后,我们可以通过公式
A = U Σ V T A = U \Sigma V^T A=UΣVT
重构原矩阵 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):
首先计算矩阵 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]
对 A A T A A^T AAT 求特征值和特征向量:
对 A T A A^T A ATA 求特征值和特征向量:
矩阵 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]
我们可以通过公式 A = U Σ V T A = U \Sigma V^T A=UΣVT 来重构矩阵 A A A,并验证其正确性。
下面是一个 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.]]
个人水平有限,有问题随时交流~