📅  最后修改于: 2023-12-03 15:06:49.308000             🧑  作者: Mango
奇异值分解(Singular Value Decomposition,简称SVD)是一种矩阵分解(Matrix Factorization)方法,可以将一个矩阵分解为三个矩阵的乘积,其中一个矩阵为对角矩阵,对角线上的元素为奇异值。SVD 在数据挖掘、信号处理等领域得到了广泛的应用。
在 NumPy 中,可以使用 numpy.linalg.svd
方法进行奇异值分解,代码如下所示:
import numpy as np
# 定义一个 3 x 2 的矩阵
a = np.array([[1, 2], [3, 4], [5, 6]])
# 进行奇异值分解
u, s, vh = np.linalg.svd(a)
# 输出分解后的矩阵和向量
print('原矩阵:')
print(a)
print('U 矩阵:')
print(u)
print('S 向量:')
print(s)
print('Vh 矩阵:')
print(vh)
输出结果为:
原矩阵:
[[1 2]
[3 4]
[5 6]]
U 矩阵:
[[-0.2298477 -0.88346102 0.40824829]
[-0.52474482 -0.24078249 -0.81649658]
[-0.81964193 0.40189604 0.40824829]]
S 向量:
[9.52551809 0.51430058]
Vh 矩阵:
[[-0.61962948 -0.78489445]
[-0.78489445 0.61962948]]
其中,分解后得到的 U
矩阵和 Vh
矩阵分别为正交矩阵,其列向量组成的矩阵即为原矩阵的特征向量矩阵。
而 S
向量则为原矩阵的奇异值向量,其元素按照从大到小的顺序排列。可以使用 np.diag
方法将其转换为对角矩阵,即为原矩阵的奇异值分解形式。
# 转换奇异值向量为对角矩阵
sigma = np.diag(s)
# 计算原矩阵的奇异值分解
a_svd = np.dot(np.dot(u, sigma), vh)
# 输出计算结果
print('原矩阵:')
print(a)
print('奇异值分解后的矩阵:')
print(a_svd)
输出结果为:
原矩阵:
[[1 2]
[3 4]
[5 6]]
奇异值分解后的矩阵:
[[1. 2.]
[3. 4.]
[5. 6.]]
可以发现,通过奇异值分解得到的矩阵与原矩阵完全相同。这说明,使用奇异值分解可以将一个矩阵分解为其特征向量矩阵、奇异值向量和其转置的乘积,从而更好地理解和处理矩阵的性质和分布。