scipy.linalg.svd:VT和U的形状:full_matrices是什么,为什么需要它?

2024-05-29 02:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

scipy.linalg.svd将“任意”数组A分解为U,s,VT 例如:

from numpy import array
from scipy.linalg import svd
import numpy as np

# define a matrix
A = np.arange(200).reshape((100,2))
print ('A.shape',A.shape)
U, s, VT = svd(A)
print ('U.shape',U.shape)
print ('s.shape',s.shape)
print ('VT.shape',VT.shape)
s_diag = np.zeros((100,2))
np.fill_diagonal(s_diag, s) 
print(np.allclose(A,np.dot(np.dot(U,s_diag),VT)))

enter image description here.png格式

A.shape == (m,n)时,数组U和VT的默认形状是and(m,m)和(n,n)。我注意到有一个选项(full_matrices)可以满足我的期望,例如: enter image description here 我不明白的是为什么U和VT需要是(m,m)和(n,n)?由于SU diag是一个“对角线”,所以在乘法时,U和VT表中只使用较小的部分。。。(例如,在本例中,U的大小可能只有100,2…)


Tags: fromimportnumpyasnpscipy数组array
1条回答
网友
1楼 · 发布于 2024-05-29 02:32:38

经过一些wikipedia reading和一些数学回忆,结果证明,这是一个有效的理由,所以。。。你知道吗

所以,第一个明显的原因是,取决于哪个表更小,m还是n,其中一个表无论如何都需要是满的。你知道吗

在数学理论中,U和VT都是orthonormal,意思是np.dot(U,U.T)等于np.dot(U.T,U)等于单位矩阵。同样适用于VT。因此它们的形状是(m,m)和(n,n)

这似乎对我的例子没用,我想做维数缩减,但是SVD还有很多其他用途,比如寻找伪逆表。你知道吗

相关问题 更多 >

    热门问题