NumPy 通过奇异值分解计算给定数组的因子
奇异值分解(SVD)是一种矩阵分解技术,将矩阵分解为三个部分,即左奇异矩阵、对角线奇异矩阵和右奇异矩阵。
SVD是在线性代数中使用的强大工具,在数据分析、机器学习和信号处理等方面具有许多应用。它主要用于计算矩阵的秩,以及执行线性方程和执行图像压缩等多种操作。
计算奇异值分解
如果我们用大小为m x n的实数或复数矩阵A进行组合,那么奇异值分解计算以下分解。
A = U * S * V ^T
在矩阵A中:
- U 是一个大小为m x m的正交矩阵,包含A的左奇异向量。
-
S 是一个大小为m x n的对角矩阵,包含A的奇异值。
-
V^T 是一个大小为n x n的正交矩阵,包含A的右奇异向量。
奇异向量 U 和 V^T 是正交归一化的,即它们具有单位长度并且彼此垂直。奇异值沿对角线(对角矩阵S)按降序排列。
Numpy中的奇异值分解
Python中的Numpy库提供了linalg模块。该模块提供了许多函数,其中之一是SVD(),用于计算给定矩阵的奇异值分解。
语法
以下是计算给定矩阵的奇异值分解的语法。
import numpy as np
np.linalg.svd(matrix)
其中,
- numpy 是该库的名称。
-
np 是numpy的别名。
-
linalg 是该库的模块。
-
svd 是用于计算奇异值分解的函数。
-
matrix 是输入矩阵。
示例
当我们想要计算奇异值分解(SVD)时,我们必须将矩阵作为输入参数传递给svd()函数。
import numpy as np
matrix = np.arange(4,8).reshape(2,2)
singular_v_d = np.linalg.svd(matrix)
print("The singular value decomposition of the given 2x2 square matrix:",singular_v_d)
输出
当我们运行上面的代码时,将会显示以下输出,我们可以观察到三个数组,第一个数组是左奇异数组,第二个是对角奇异值,最后一个数组是右奇异矩阵。
The singular value decomposition of the given 2x2 square matrix: (array([[-0.57035846, -0.8213959 ],
[-0.8213959 , 0.57035846]]), array([11.22355763, 0.17819662]), array([[-0.64238181, -0.76638477],
[ 0.76638477, -0.64238181]]))
示例
让我们看一个使用linalg模块的svd()函数计算奇异值分解的另一个例子。
import numpy as np
matrix = np.array([[1,23,4],[5,34,56]])
singular_v_d = np.linalg.svd(matrix)
print("The singular value decomposition of the given matrix:",singular_v_d)
输出
The singular value decomposition of the given 2x2 square matrix: (array([[-0.24361576, 0.96987183],
[-0.96987183, -0.24361576]]), array([67.60877519, 17.08957337]), array([[-0.07533009, -0.5706183 , -0.8177531 ],
[-0.01452389, 0.82062411, -0.57128375],
[-0.99705287, 0.0311579 , 0.07010528]]))
示例
让我们再看一个例子,使用svd()函数计算给定矩阵的奇异值分解。
import numpy as np
matrix = np.array([[[12,34,23],[23,54,34]],[[10,23,24],[56,68,34]]])
singular_v_d = np.linalg.svd(matrix)
print("The singular value decomposition of the given matrix:",singular_v_d)
输出
The singular value decomposition of the given matrix: (array([[[-0.53294435, -0.84615029],
[-0.84615029, 0.53294435]],
[[-0.32001136, -0.94741371],
[-0.94741371, 0.32001136]]]), array([[80.14845114, 2.49515114],
[99.54423363, 14.55834985]]), array([[[-0.32261121, -0.79617538, -0.5118855 ],
[ 0.84320202, 0.0039616 , -0.53758224],
[ 0.43003763, -0.60505294, 0.67005863]],
[[-0.56512848, -0.7211306 , -0.40074987],
[ 0.58018245, -0.00204301, -0.81448398],
[ 0.58653059, -0.69279613, 0.41954188]]]))