np.linalg.svd函数的奇异值分解详解

np.linalg.svd 是一个在 NumPy 库中的函数,用于执行奇异值分解(Singular Value Decomposition,简称 SVD)。奇异值分解是线性代数中的一种常见技术,用于将一个矩阵分解为三个矩阵的乘积。对于一个 m x n 的矩阵 A,SVD 分解可以表示为:

A = UΣV*

其中,U 是一个 m x m 的正交矩阵,Σ(使用希腊字母 Sigma 表示)是一个 m x n 的对角矩阵,其对角线上的元素是非负的,并按降序排列。这些对角线上的元素被称为奇异值。V* 是 V 的共轭转置,其中 V 是一个 n x n 的正交矩阵。

np.linalg.svd 函数的用法:

1
U, s, Vh = np.linalg.svd(A, full_matrices=True, compute_uv=True, hermitian=False)

参数说明:

  • A: 需要分解的矩阵。
  • full_matrices: 布尔值,如果为 True,则 U 和 V 为正方形矩阵。如果为 False,则输出的 U 和 V 的维数会被缩减。
  • compute_uv: 布尔值,如果为 True,则计算 U 和 V。如果为 False,则只计算奇异值向量 s。
  • hermitian: 布尔值,如果为 True,且输入矩阵是 Hermitian 的,SVD 将使用更加高效的算法。

返回值:

  • U: m x m 的正交矩阵。
  • s: 奇异值向量,长度为 min(m, n)。
  • Vh: n x n 的正交矩阵,是 V 的共轭转置。

现在来举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

# 创建一个 3x2 的矩阵
A = np.array([[1, 2], [3, 4], [5, 6]])

# 进行奇异值分解
U, s, Vh = np.linalg.svd(A, full_matrices=True, compute_uv=True)

# 输出 U, s, Vh
print("U matrix:")
print(U)
print("\nSingular values:")
print(s)
print("\nV* matrix:")
print(Vh)

在这个例子中,我们对一个 3x2 的矩阵 A 进行奇异值分解。由于 full_matrices 参数设置为 True,U 矩阵的大小是 3x3,V* 矩阵的大小是 2x2。奇异值向量 s 的长度是 2。