在Python中生成非奇异稀疏矩阵

时间:2016-09-24 04:37:28

标签: python numpy matrix scipy

scipy.sparse.rand生成稀疏矩阵时,它可以是单数。实际上,以下代码会引发错误"RuntimeError: superlu failure (singular matrix?) at line 100 in file scipy/sparse/linalg/dsolve/SuperLU/SRC/dsnode_bmod.c"

dim = 20000
ratio = 0.000133

A = scipy.sparse.rand(dim,dim,ratio)
inv_sparse = scipy.sparse.linalg.inv(A)

有没有办法生成非奇异稀疏矩阵?

我真正想要做的是比较scipy.sparse.linalg.invnp.linalg.inv的效果(处理时间)。这就是为什么我需要生成非奇异的随机稀疏矩阵。

2 个答案:

答案 0 :(得分:2)

矩阵的密度ratio = 0.000133非常低。这意味着7518中的一个项目是非空的。因此,每个术语为空的概率约为7517/7518。

每行由20000个独立术语组成。因此,行为空的概率为(7517/7518)^ 20000 = 6.99%。因此,行为非空的概率为1-(7517/7518)^ 20000 = 93.0%。

然后,矩阵由20000行组成。行可以被认为是独立的。因此,矩阵不包含空行的概率是(1-(7517/7518)^ 20000)^ 20000 =(93.0%)^ 20000。这个概率非常低。

由于矩阵可能包含空行,因此通常是单数。

此外,由于浮点数的精度有限,程序通常认为病态矩阵是奇异的。实际上,在这种情况下,计算出的反转将是非常不准确和毫无意义的。

最后,为了比较反函数,使用已知可逆的矩阵可能更好......至少,你可以尝试增加密度,使空行的概率变得非常低。

答案 1 :(得分:1)

正如@hpaulj在评论中所建议的那样,您可以向随机矩阵添加一个单位矩阵以使其可逆。

但是,在需要找到线性方程组的近似解的应用中,只需将恒等矩阵乘以一个小因子即可:

dim = 20000
ratio = 0.000133
A = csc_matrix(scipy.sparse.random(dim, dim, density=ratio), dtype=float)
A = A + scipy.sparse.csr_matrix(np.eye(A.shape[0]) * 1e-8)
A = scipy.sparse.csc_matrix(A)
inv_sparse = scipy.sparse.linalg.inv(A)