首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非平方矩阵上的SVD

非平方矩阵上的SVD
EN

Stack Overflow用户
提问于 2022-01-11 13:56:09
回答 1查看 573关注 0票数 0

我使用numpy.linalg.svd()得到矩阵的奇异值分解。但是对于一个非平方矩阵,我不能从分解返回到原始矩阵。

例如,对于方阵:

代码语言:javascript
运行
复制
import numpy as np
n=5
# make a random (n,n) matrix
A= np.reshape( np.random.random_integers(0, 9, size= n**2), (n, n))
#SVD 
U,S,Vh = np.linalg.svd(A) 
# to get A from the SVD back
A_svd = U@np.diag(S)@Vh
#check if its the same 
print(np.allclose(A,A_svd))

我明白了:>>> True

对于一个非平方矩阵,例如形状A (m,n),则U形为(m,m),V形为(n,n),S为长度为k的对角线矩阵,k= min(m,n)。例如:

代码语言:javascript
运行
复制
import numpy as np
n=5
m= 8
# make a random (m,n) matrix
A= np.reshape( np.random.random_integers(0, 9, size= m*n), (m, n))
#SVD 
U,S,Vh = np.linalg.svd(A) 

具有下列形状:

代码语言:javascript
运行
复制
>>> U.shape
(8, 8)
>>> S.shape
(5,)
>>> Vh.shape
(5, 5)

我不知道如何得到矩阵A,但如果我有svd分解。由于形状的不同,我不能做简单的乘法。U@np.diag(S)@Vhnp.matmul(U,S,Vh)或与np.dot。所以我试着重塑S并用零填充它。

代码语言:javascript
运行
复制
S_m = np.diag(S) 
S_m.resize((U.shape[1], Vh.shape[0]))
#check if its the same 
print(np.allclose(A,U @S_m@ Vh))
代码语言:javascript
运行
复制
>>> False
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-11 14:06:47

我使用来自这里对角线找到了一个答案: scipy.linalg。

代码语言:javascript
运行
复制
import scipy.linalg as la    
A_svd = U@la.diagsvd(S,*A.shape)@Vh
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70668014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档