6.4 奇异值分解 (SVD)


文档摘要

6.4 奇异值分解 (SVD) 6.4 奇异值分解 (SVD) 奇异值分解 (Singular Value Decomposition, SVD) 是一种重要的矩阵分解技术,在数据降维、图像压缩、推荐系统等领域有着广泛的应用。SVD将一个矩阵分解为三个矩阵的乘积,揭示了矩阵的内在结构和性质。 6.4.1 SVD的定义 对于一个 m × n 的矩阵 A,其 SVD 定义为: A = U Σ Vᵀ 其中: U 是一个 m × m 的酉矩阵(在实数域中是正交矩阵),称为左奇异向量矩阵。U 的列向量是 AAT 的特征向量,且彼此正交。 Σ 是一个 m × n 的对角矩阵,对角线上的元素称为奇异值,通常按照从大到小的顺序排列。奇异值是非负实数,反映了矩阵 A 在对应方向上的能量或重要性。

6.4 奇异值分解 (SVD)

6.4 奇异值分解 (SVD)

奇异值分解 (Singular Value Decomposition, SVD) 是一种重要的矩阵分解技术,在数据降维、图像压缩、推荐系统等领域有着广泛的应用。SVD将一个矩阵分解为三个矩阵的乘积,揭示了矩阵的内在结构和性质。

6.4.1 SVD的定义

对于一个 m × n 的矩阵 A,其 SVD 定义为:

A = U Σ Vᵀ

其中:

  • U 是一个 m × m 的酉矩阵(在实数域中是正交矩阵),称为左奇异向量矩阵。U 的列向量是 AAT 的特征向量,且彼此正交。

  • Σ 是一个 m × n 的对角矩阵,对角线上的元素称为奇异值,通常按照从大到小的顺序排列。奇异值是非负实数,反映了矩阵 A 在对应方向上的能量或重要性。

  • V 是一个 n × n 的酉矩阵(在实数域中是正交矩阵),称为右奇异向量矩阵。V 的列向量是 ATA 的特征向量,且彼此正交。

  • Vᵀ 是 V 的转置矩阵。

6.4.2 SVD的几何意义

SVD 可以理解为将原始矩阵 A 所代表的线性变换分解为三个步骤:

  1. 旋转 Vᵀ: 将原始坐标系旋转到与 AᵀA 的特征向量对齐。

  2. 缩放 Σ: 在新的坐标系中,沿着各个奇异值对应的方向进行缩放。

  3. 旋转 U: 将坐标系旋转回原始坐标系。

graph TD

A[原始数据矩阵 A] -->|Vᵀ (旋转)| B(旋转后的数据) B -->|Σ (缩放)| C(缩放后的数据) C -->|U (旋转)| D[最终结果矩阵 (近似 A)]

6.4.3 SVD的计算

NumPy 提供了 numpy.linalg.svd() 函数来计算矩阵的 SVD。

import numpy as np A = np.array([[1, 2], [3, 4], [5, 6]]) U, s, V = np.linalg.svd(A) print("U:\n", U) print("s:\n", s) # 奇异值 print("V:\n", V)

输出结果:

U: [[-0.22984771 -0.88346102 0.39300597] [-0.52474482 -0.24078249 -0.81649658] [-0.81964193 0.39889604 0.41765002]] s: [9.52551809 0.77286964] V: [[-0.61962948 -0.78489445] [-0.78489445 0.61962948]]

注意:numpy.linalg.svd() 返回的 s 是一个包含奇异值的一维数组,而不是完整的对角矩阵 Σ。如果需要完整的 Σ 矩阵,需要手动构建。

6.4.4 SVD的应用

6.4.4.1 数据降维

SVD 可以用于数据降维,通过保留较大的奇异值对应的奇异向量,舍弃较小的奇异值对应的奇异向量,从而降低数据的维度,同时保留数据的主要特征。

import numpy as np A = np.random.rand(100, 20) # 100个样本,20个特征 U, s, V = np.linalg.svd(A) k = 5 # 保留前 5 个奇异值 U_reduced = U[:, :k] S_reduced = np.diag(s[:k]) # 构建降维后的奇异值矩阵 V_reduced = V[:k, :] A_reconstructed = U_reduced @ S_reduced @ V_reduced print("原始矩阵形状:", A.shape) print("降维后的矩阵形状:", A_reconstructed.shape) # 近似等于原始矩阵

在这个例子中,我们将 20 维的数据降到了 5 维,A_reconstructed 是使用降维后的数据重构的原始矩阵的近似。

6.4.4.2 图像压缩

图像可以看作是一个矩阵,SVD 可以用于图像压缩。通过保留较大的奇异值,舍弃较小的奇异值,可以减少存储空间,同时保持图像的主要内容。

import numpy as np import matplotlib.pyplot as plt from PIL import Image # 读取图像 image = Image.open("image.jpg").convert('L') # 灰度图 A = np.array(image) U, s, V = np.linalg.svd(A) # 选择保留的奇异值的数量 k = 50 # 重构图像 A_reconstructed = U[:, :k] @ np.diag(s[:k]) @ V[:k, :] # 显示原始图像和重构图像 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.imshow(A, cmap='gray') plt.title("Original Image") plt.subplot(1, 2, 2) plt.imshow(A_reconstructed, cmap='gray') plt.title(f"Reconstructed Image (k={k})") plt.show()

在这个例子中,我们读取了一张图像,并使用 SVD 对其进行压缩。通过调整 k 的值,可以控制压缩的程度。

6.4.4.3 推荐系统

SVD 可以用于推荐系统,通过对用户-物品评分矩阵进行分解,可以预测用户对未评分物品的评分,从而进行推荐。

假设我们有一个用户-物品评分矩阵 R,其中 R[i, j] 表示用户 i 对物品 j 的评分。我们可以使用 SVD 对 R 进行分解:

R = U Σ Vᵀ

其中:

  • U 是用户特征矩阵。

  • Σ 是奇异值矩阵。

  • V 是物品特征矩阵。

我们可以使用 U 和 V 来预测用户对未评分物品的评分:

R_predicted = U @ Σ @ Vᵀ

import numpy as np # 用户-物品评分矩阵 R = np.array([ [5, 3, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [1, 0, 0, 4], [0, 1, 5, 4], ]) U, s, V = np.linalg.svd(R) k = 2 # 选择保留的奇异值的数量 U_reduced = U[:, :k] S_reduced = np.diag(s[:k]) V_reduced = V[:k, :] R_predicted = U_reduced @ S_reduced @ V_reduced print("原始评分矩阵:\n", R) print("预测评分矩阵:\n", R_predicted)

在这个例子中,我们使用 SVD 对用户-物品评分矩阵进行分解,并使用分解后的矩阵预测用户对未评分物品的评分。

6.4.5 SVD的优点和缺点

优点:

  • SVD 是一种通用的矩阵分解技术,适用于各种类型的矩阵。

  • SVD 可以用于数据降维、图像压缩、推荐系统等多种应用。

  • SVD 可以揭示矩阵的内在结构和性质。

缺点:

  • SVD 的计算复杂度较高,对于大型矩阵,计算时间可能较长。

  • SVD 的结果可能难以解释,特别是当奇异值的数量较多时。

6.4.6 总结

奇异值分解 (SVD) 是一种重要的矩阵分解技术,在数据降维、图像压缩、推荐系统等领域有着广泛的应用。NumPy 提供了 numpy.linalg.svd() 函数来计算矩阵的 SVD。理解 SVD 的原理和应用,可以帮助我们更好地处理和分析数据。

希望这篇文章能够帮助你理解 NumPy 中的奇异值分解 (SVD)。


发布者: 作者: 转发
评论区 (0)
U