用scipy反转大的稀疏矩阵

时间:2013-02-27 17:17:11

标签: python numpy scipy

我必须反转一个大的稀疏矩阵。我无法摆脱矩阵求逆,唯一的捷径就是只能了解主对角线元素,忽略非对角线元素(我宁愿不这样做,但作为一种解决方案,它是可以接受的)。 / p>

我需要反转的矩阵通常很大(40000 * 40000),并且只有少数非非零对角线。我目前的做法是建立一切稀疏,然后

posterior_covar = np.linalg.inv ( hessian.todense() )

这显然需要很长时间和充足的记忆。

任何提示,或者只是耐心或使问题变小?

1 个答案:

答案 0 :(得分:6)

我不认为稀疏模块有一个显式的反向方法,但它确实有稀疏求解器。像这个玩具示例的东西有效:

>>> a = np.random.rand(3, 3)
>>> a
array([[ 0.31837307,  0.11282832,  0.70878689],
       [ 0.32481098,  0.94713997,  0.5034967 ],
       [ 0.391264  ,  0.58149983,  0.34353628]])
>>> np.linalg.inv(a)
array([[-0.29964242, -3.43275347,  5.64936743],
       [-0.78524966,  1.54400931, -0.64281108],
       [ 1.67045482,  1.29614174, -2.43525829]])

>>> a_sps = scipy.sparse.csc_matrix(a)
>>> lu_obj = scipy.sparse.linalg.splu(a_sps)
>>> lu_obj.solve(np.eye(3))
array([[-0.29964242, -0.78524966,  1.67045482],
       [-3.43275347,  1.54400931,  1.29614174],
       [ 5.64936743, -0.64281108, -2.43525829]])

请注意,结果是转置的!

如果您希望您的逆也是稀疏的,并且上一次求解的密集返回将不适合内存,您也可以一次生成一行(列),提取非零值,并且从那些构建稀疏逆矩阵:

>>> for k in xrange(3) :
...     b = np.zeros((3,))
...     b[k] = 1
...     print lu_obj.solve(b)
... 
[-0.29964242 -0.78524966  1.67045482]
[-3.43275347  1.54400931  1.29614174]
[ 5.64936743 -0.64281108 -2.43525829]