- NumPy 教程
- NumPy - 首页
- NumPy - 简介
- NumPy - 环境配置
- NumPy 数组
- NumPy - Ndarray 对象
- NumPy - 数据类型
- NumPy 数组的创建和操作
- NumPy - 数组创建函数
- NumPy - 数组操作
- NumPy - 从现有数据创建数组
- NumPy - 从数值范围创建数组
- NumPy - 数组迭代
- NumPy - 数组重塑
- NumPy - 数组拼接
- NumPy - 数组堆叠
- NumPy - 数组分割
- NumPy - 数组扁平化
- NumPy - 数组转置
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高级索引
- NumPy 数组属性和运算
- NumPy - 数组属性
- NumPy - 数组形状
- NumPy - 数组大小
- NumPy - 数组步长
- NumPy - 数组元素大小
- NumPy - 广播
- NumPy - 算术运算
- NumPy - 数组加法
- NumPy - 数组减法
- NumPy - 数组乘法
- NumPy - 数组除法
- NumPy 高级数组运算
- NumPy - 交换数组轴
- NumPy - 字节交换
- NumPy - 拷贝和视图
- NumPy - 元素级数组比较
- NumPy - 数组过滤
- NumPy - 数组连接
- NumPy - 排序、搜索和计数函数
- NumPy - 数组搜索
- NumPy - 数组的并集
- NumPy - 查找唯一行
- NumPy - 创建日期时间数组
- NumPy - 二元运算符
- NumPy - 字符串函数
- NumPy - 数学函数
- NumPy - 统计函数
- NumPy - 矩阵库
- NumPy - 线性代数
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 绘制直方图
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高级操作
- NumPy - 数组排序
- NumPy - 沿轴排序
- NumPy - 使用花式索引排序
- NumPy - 结构化数组
- NumPy - 创建结构化数组
- NumPy - 操作结构化数组
- NumPy - 字段访问
- NumPy - 记录数组
- Numpy - 加载数组
- Numpy - 保存数组
- NumPy - 向数组追加值
- NumPy - 交换数组列
- NumPy - 向数组插入轴
- NumPy 处理缺失数据
- NumPy - 处理缺失数据
- NumPy - 识别缺失值
- NumPy - 删除缺失数据
- NumPy - 缺失数据插补
- NumPy 性能优化
- NumPy - 使用数组进行性能优化
- NumPy - 使用数组进行向量化
- NumPy - 数组的内存布局
- Numpy 线性代数
- NumPy - 线性代数
- NumPy - 矩阵库
- NumPy - 矩阵加法
- NumPy - 矩阵减法
- NumPy - 矩阵乘法
- NumPy - 元素级矩阵运算
- NumPy - 点积
- NumPy - 矩阵求逆
- NumPy - 行列式计算
- NumPy - 特征值
- NumPy - 特征向量
- NumPy - 奇异值分解
- NumPy - 求解线性方程组
- NumPy - 矩阵范数
- NumPy 元素级矩阵运算
- NumPy - 求和
- NumPy - 求平均值
- NumPy - 求中位数
- NumPy - 求最小值
- NumPy - 求最大值
- NumPy 集合运算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 并集
- NumPy - 差集
- NumPy 有用资源
- NumPy 编译器
- NumPy - 快速指南
- NumPy - 有用资源
- NumPy - 讨论
NumPy - 奇异值分解
什么是奇异值分解 (SVD)?
奇异值分解,通常缩写为 SVD,是线性代数中的一种矩阵分解技术。SVD 将一个矩阵分解成三个其他矩阵,捕捉原始矩阵的重要属性。
例如,如果你有一个矩阵 A,则 SVD 表示为:
A = UΣVT
这里,U 和 V 是正交矩阵,Σ 是对角矩阵。
U 的列称为左奇异向量,V 的列(或 VT 的行)称为右奇异向量,Σ 的元素为奇异值。
NumPy 中的 SVD
NumPy 提供了 `numpy.linalg.svd()` 函数来计算矩阵的奇异值分解。让我们来看一个例子。
示例
在这个例子中,矩阵 A 被分解成三个矩阵:U、Σ(表示为奇异值数组 S)和 VT:
import numpy as np # Define a 3x3 matrix A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Compute the Singular Value Decomposition U, S, VT = np.linalg.svd(A) print("Matrix U:\n", U) print("Singular values:", S) print("Matrix V^T:\n", VT)
以下是获得的输出:
Matrix U: [[-0.21483724 0.88723069 0.40824829] [-0.52058739 0.24964395 -0.81649658] [-0.82633754 -0.38794278 0.40824829]] Singular values: [1.68481034e+01 1.06836951e+00 4.41842475e-16] Matrix 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 的行空间的正交基。
重建原始矩阵
你可以从它的 SVD 组成部分重建原始矩阵 A。在 NumPy 中,你可以使用 `numpy.dot()` 函数进行矩阵乘法来实现这一点。
示例
在下面的例子中,我们正在重建原始矩阵 "A":
import numpy as np # Define a 3x3 matrix A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Compute the Singular Value Decomposition U, S, VT = np.linalg.svd(A) # Create the diagonal matrix Σ from the singular values Sigma = np.zeros((3, 3)) np.fill_diagonal(Sigma, S) # Reconstruct the original matrix A_reconstructed = np.dot(U, np.dot(Sigma, VT)) print("Original matrix:\n", A) print("Reconstructed matrix:\n", A_reconstructed)
使用其 SVD 组成部分成功地重建了原始矩阵 A,证明了分解的准确性。
Original matrix: [[1 2 3] [4 5 6] [7 8 9]] Reconstructed matrix: [[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 # Load a sample image and convert it to grayscale image = color.rgb2gray(data.astronaut()) # Compute the Singular Value Decomposition U, S, VT = np.linalg.svd(image, full_matrices=False) # Retain only the first k singular values k = 50 U_k = U[:, :k] S_k = np.diag(S[:k]) VT_k = VT[:k, :] # Reconstruct the compressed image image_compressed = np.dot(U_k, np.dot(S_k, VT_k)) # Plot the original and compressed images plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.title("Original Image") plt.imshow(image, cmap='gray') plt.axis('off') plt.subplot(1, 2, 2) plt.title(f"Compressed Image with k={k}") plt.imshow(image_compressed, cmap='gray') plt.axis('off') plt.show()
原始图像和压缩后的图像并排显示,展示了 SVD 如何在保留其基本特征的同时减小图像大小。
SVD 的优点
SVD 提供了一些优点,例如:
- 数值稳定性:SVD 数值稳定,可以处理病态矩阵。
- 最佳低秩逼近:SVD 提供矩阵的最佳低秩逼近,使其成为降维的理想选择。
- 鲁棒性:SVD 对数据中的微小扰动具有鲁棒性。
- 通用性:SVD 可以应用于任何矩阵,无论其属性如何。
广告