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 可以应用于任何矩阵,无论其性质如何。

