NumPy - 奇异值分解
什么是奇异值分解 (SVD)?
奇异值分解,通常缩写为 SVD,是线性代数中的一种矩阵分解技术。奇异值分解 (SVD) 将一个矩阵分解为三个矩阵,从而保留原始矩阵的重要属性。
例如,假设有一个矩阵 A,其奇异值分解 (SVD) 公式为 −
A = UVT
其中,U 和 V 是正交矩阵, 是对角矩阵。
U 的列称为左奇异向量,V 的列(或 VT 的行)称为右奇异向量, 的元素称为奇异值。
NumPy 中的 SVD
NumPy 提供了numpy.linalg.svd() 函数用于计算矩阵的奇异值分解。让我们通过一个示例来了解如何使用此函数。
示例
在本例中,矩阵 A 被分解为三个矩阵:U、(表示为奇异值数组 S)和 VT −
import numpy as np # 定义一个 3x3 矩阵 A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 计算奇异值分解 U, S, VT = np.linalg.svd(A) print("矩阵 U: ", U) print("奇异值:", S) print("矩阵 V^T: ", VT)
以下是得到的输出 −
矩阵 U: [[-0.21483724 0.88723069 0.40824829] [-0.52058739 0.24964395 -0.81649658] [-0.82633754 -0.38794278 0.40824829]] 奇异值: [1.68481034e+01 1.06836951e+00 4.41842475e-16] 矩阵 V^T: [[-0.47967118 -0.57236779 -0.66506441] [-0.77669099 -0.07568647 0.62531805] [-0.40824829 0.81649658 -0.40824829]]
理解分量
SVD 分量具有特定的属性和作用,如下所示 -
- 矩阵 U:U 的列是 A 的左奇异向量。这些向量构成了A列空间的正交基。
- 奇异值:的对角线元素是A的奇异值。这些值给出了A沿相应奇异向量作用的大小。
- 矩阵VT:VT的行是A的右奇异向量。这些向量构成了A行空间的正交基。
重建原始矩阵
您可以从原始矩阵A的SVD分量重建其奇异值分解(SVD)分量。在 NumPy 中,你可以使用 numpy.dot() 函数执行矩阵乘法来实现这一点。
示例
在下面的示例中,我们重建原始矩阵"A" -
import numpy as np # 定义一个 3x3 矩阵 A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 计算奇异值分解 U, S, VT = np.linalg.svd(A) # 根据奇异值创建对角矩阵 Sigma = np.zeros((3, 3)) np.fill_diagonal(Sigma, S) # 重建原始矩阵 A_reconstructed = np.dot(U, np.dot(Sigma, VT)) print("原始矩阵: ", A) print("重建矩阵: ", A_reconstructed)
原始矩阵 A 已成功使用其奇异值分解 (SVD) 分量重建,证明了分解的准确性 −/p>
原始矩阵: [[1 2 3] [4 5 6] [7 8 9]] 重构矩阵: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
SVD 的应用
SVD 是一个功能强大的工具,具有多种应用,例如 -
- 降维:在数据分析和机器学习中,奇异值分解 (SVD) 用于在保留重要信息的同时减少维度。
- 图像压缩:SVD 用于压缩图像,从而减少存储图像所需的数据量。
- 降噪:SVD 可以通过识别和丢弃较小的奇异值来消除数据中的噪声。
- 信号处理:在信号处理中,SVD 用于分析和过滤信号。
- 推荐系统:推荐系统中使用 SVD 来预测用户偏好。
示例:使用 SVD 进行图像压缩
让我们看一个如何使用 SVD 进行图像压缩的示例。我们将使用一张灰度图像,并通过仅保留最重要的奇异值来对其进行压缩 -
import numpy as np import matplotlib.pyplot as plt from skimage import data, color # 加载示例图像并将其转换为灰度图像 image = color.rgb2gray(data.astronaut()) # 计算奇异值分解 U, S, VT = np.linalg.svd(image, full_matrices=False) # 仅保留前 k 个奇异值 k = 50 U_k = U[:, :k] S_k = np.diag(S[:k]) VT_k = VT[:k, :] # 重建压缩图像 image_compressed = np.dot(U_k, np.dot(S_k, VT_k)) # 绘制原始图像和压缩图像 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.title("原始图像") plt.imshow(image, cmap='gray') plt.axis('off') plt.subplot(1, 2, 2) plt.title(f"k={k} 的压缩图像") plt.imshow(image_compressed, cmap='gray') plt.axis('off') plt.show()
原始图像和压缩图像并排显示,展示了 SVD 如何在保留图像基本特征的同时减小图像尺寸 -

SVD 的优势
SVD 具有多种优势,例如:-
- 数值稳定性:SVD 具有数值稳定性,可以处理病态矩阵。
- 最佳低秩近似:SVD 提供矩阵的最佳低秩近似,使其成为降维的理想选择。
- 稳健性:SVD 对数据中的微小扰动具有稳健性。
- 多功能性:SVD 可以应用于任何矩阵,无论其性质如何。