[英]GSVD for python Generalized Singular Value Decomposition
MATLAB具有执行通用SVD的gsvd函数。 自2013年以来,我认为在github页面上已经有很多关于将其放入scipy的讨论,并且有些页面包含我可以使用的代码,例如在这里 ,对于像我这样的新手来说(使其运行)超级复杂。
我还找到了带有实现的 LJWilliams github页面。 这没有什么好处,因为当转移到python 3时,会有很多错误。尝试纠正诸如assert和print之类的简单错误。 它很快变得复杂。
有人可以为我提供有关python的gsvd代码或向我展示如何使用在线代码吗?
而且,一旦更正了print和assert语句,这就是我通过LJWilliams实现所获得的。 代码看起来很复杂,我不确定花时间在上面是最好的办法! 也有人在同一个github页面上报告了我不确定是否已修复或连接的问题。
n = 10
m = 6
p = 6
A = np.random.rand(m,n)
B = np.random.rand(p,n)
gsvd(A,B)
文件“ /home/eghx/agent18/master_thesis/AMfe/amfe/gsvd.py”,行260,以gsvd格式显示U,V,Z,C,S = csd(Q [0:m,:],Q [m: M + N,:])
在csd Q,R = scipy.linalg.qr(S [q:n,m:p])中的文件“ /home/eghx/agent18/master_thesis/AMfe/amfe/gsvd.py”第107行
在qr中的文件“ /home/eghx/anaconda3/lib/python3.5/site-packages/scipy/linalg/decomp_qr.py”第141行overwrite_a = overwrite_a)
在安全调用ret = f(* args,** kwargs)的第19行中,文件“ /home/eghx/anaconda3/lib/python3.5/site-packages/scipy/linalg/decomp_qr.py”
ValueError:无法创建intent(cache | hide)| Optional数组-必须具有定义的尺寸,但得到(0,)
如果要使用github上的LJWillams实现工作,则存在两个错误。 但是,要完全理解该技术,我可能建议您亲自尝试实施。 我查看了Octave(等效于MATLAB的免费软件)做什么,它们的“代码是对应的Lapack dggsvd和zggsvd例程的包装”。 ,这是scipy应该做的恕我直言。
我将发布发现的错误,但是我不会以完整的工作顺序发布代码,因为鉴于翻译自其中的版权是MATLAB实施,因此我不确定版权方面的表现。
警告 :我不是通用SVD的专家,仅从调试的角度来解决这个问题,而不是底层算法是否正确。 我已经对您的原始随机数组和Python文件中已经存在的测试用例进行了处理。
设定k
在第63行附近,设置k
的条件和对numpy.argparse
的误解(尤其是与MATLAB的find
)在某些情况下似乎将k
设置为错误。 将该代码更改为
if q == 1:
k = 0
elif m < p:
k = n;
else:
k = max([0,sum((np.diag(C) <= 1/np.sqrt(2)))])
我认为S [1,1]应该是S [0,0](Python 0索引数组)
围绕在这里的numpy矩阵切片似乎是错误的。 我通过将第83-95行更改为以下内容来使代码正常工作:
UT, ST, VT = scipy.linalg.svd(slice_matrix(S,i,j))
ST = add_zeros(ST,np.zeros([n-k,r-k]))
if k > 0:
print('Zeroing elements of S in row indices > r, to be replaced by ST')
S[0:k,k:r] = 0
S[k:n,k:r] = ST
C[:,j] = np.dot(C[:,j],VT)
V[:,i] = np.dot(V[:,i],UT)
Z[:,j] = np.dot(Z[:,j],VT)
i = np.arange(k,q)
Q,R = scipy.linalg.qr(C[k:q,k:r])
C[i,j] = np.diag(diagf(R))
U[:,k:q] = np.dot(U[:,k:q],Q)
diagp()
有两个使用X*Y
矩阵乘法应该np.dot(X,Y)
(注意*
是numpy
元素 np.dot(X,Y)
乘法 ,而不是矩阵乘法。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.