A =Bᵀ·B的稀疏矩阵分解

时间:2016-01-14 15:17:13

标签: python numpy scipy linear-algebra sparse-matrix

假设我有一个稀疏矩阵A,我想计算一个矩阵B,以便

B.T.dot(B) = A

scipy模块上是否有任何可以执行此操作的功能? 如果没有,是否可以在numpy

1 个答案:

答案 0 :(得分:1)

此功能适用于密集矩阵的numpyscipy以及稀疏矩阵的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

通常Bnumpy中的下三角矩阵,但确保这一点是一个好习惯,对于上三角矩阵,您需要更改{{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中实现,我所知道的。