假设我有一个稀疏矩阵A
,我想计算一个矩阵B
,以便
B.T.dot(B) = A
scipy
模块上是否有任何可以执行此操作的功能?
如果没有,是否可以在numpy
?
答案 0 :(得分:1)
此功能适用于密集矩阵的numpy
和scipy
以及稀疏矩阵的scikits.sparse
,具体取决于您的矩阵。您的矩阵肯定?它是对称吗?如果是这样,那么你基本上是在寻找Cholesky分解。
>>> A = np.random.rand(100,100) # Construct a dense matrix
>>> np.fill_diagonal(A,10) # Ensure the matrix is positive definite
>>> A = 0.5*(A+A.T) # Symmetrize the matrix
>>> B = np.linalg.cholesky(A) # Perform Cholesky decomposition
>>> np.allclose(B.dot(B.T),A) # Verify
True
通常B
是numpy
中的下三角矩阵,但确保这一点是一个好习惯,对于上三角矩阵,您需要更改{{1的乘法顺序到B.dot(B.T)
。对于B.T.dot(B)
版本,有关键字参数scipy
(默认情况下为lower
),您可以指定它以始终获得所需的正确顺序。
False
虽然这不应该是一个大问题。对于稀疏矩阵,您可以使用>>> B = sp.linalg.cholesky(A,lower=False)
>>> np.allclose(B.T.dot(B),A)
True
或todense()
(不推荐)将稀疏矩阵转换为密集矩阵,或使用toarray()
模块
scikits.sparse
对于半明确矩阵,论文中还提供了Cholesky类型分解:Analysis of the Cholesky Decomposition of a Semi-definite Matrix,但未在>>> from scikits.sparse.cholmod import cholesky
>>> spA = csc_matrix(A)
>>> factor = cholesky(spA)
>>> spB = factor.L()
>>> np.allclose(spA.todense(),spB.dot(spB.T).todense()) # Just for verification
True
或scipy
中实现,我所知道的。