使用 numpy linalg svd 时遇到问题
Having problems using numpy linalg svd
我正在用简单矩阵测试 svd 分解
A=np.array([[1,2,3],[4,5,6]])
但是当我使用 :
U,D,V=np.linalg.svd(A)
输出为 U 形状 (2,2),D 形状 (2,) 和 V 形状 (3,3)
问题是 V 的形状,svd 算法应该 return 一个 2x3 矩阵,因为我的原始矩阵是一个 2x3 矩阵并且我得到 2 个奇异值,但它 return 一个 3x3 矩阵,当我取 V[:2,:] 并使产品:
U.dot(np.diag(D).dot(V[:2,:]))
它return是原始矩阵A,这里发生了什么?
感谢您的阅读和回答,抱歉语法问题,我是从英语开始的
这在 docstring 中有解释,但可能需要多读几遍才能理解。布尔参数 full_matrices
确定返回数组的形状。在您的情况下,您需要 full_matrices=False
,例如:
In [42]: A = np.array([[1, 2, 3], [4, 5, 6]])
In [43]: U, D, V = np.linalg.svd(A, full_matrices=False)
In [44]: U @ np.diag(D) @ V
Out[44]:
array([[1., 2., 3.],
[4., 5., 6.]])
我正在用简单矩阵测试 svd 分解
A=np.array([[1,2,3],[4,5,6]])
但是当我使用 :
U,D,V=np.linalg.svd(A)
输出为 U 形状 (2,2),D 形状 (2,) 和 V 形状 (3,3) 问题是 V 的形状,svd 算法应该 return 一个 2x3 矩阵,因为我的原始矩阵是一个 2x3 矩阵并且我得到 2 个奇异值,但它 return 一个 3x3 矩阵,当我取 V[:2,:] 并使产品:
U.dot(np.diag(D).dot(V[:2,:]))
它return是原始矩阵A,这里发生了什么? 感谢您的阅读和回答,抱歉语法问题,我是从英语开始的
这在 docstring 中有解释,但可能需要多读几遍才能理解。布尔参数 full_matrices
确定返回数组的形状。在您的情况下,您需要 full_matrices=False
,例如:
In [42]: A = np.array([[1, 2, 3], [4, 5, 6]])
In [43]: U, D, V = np.linalg.svd(A, full_matrices=False)
In [44]: U @ np.diag(D) @ V
Out[44]:
array([[1., 2., 3.],
[4., 5., 6.]])