Python中的矩阵和逆矩阵

时间:2009-12-04 06:21:00

标签: python matrix networkx matrix-inverse

对于我正在进行的项目,我使用NetworkX adj_matrix()函数将使用NetworkX创建的图形分解为邻接矩阵。然而,我遇到的一个问题是,当我试图找到矩阵的逆时,我分解的每个图形都会给出以下错误。

str: Traceback (most recent call last):
  File "C:\eclipse\plugins\org.python.pydev.debug_1.4.7.2843\pysrc\pydevd_resolver.py", line 179, in _getPyDictionary
    attr = getattr(var, n)
  File "C:\Python26\lib\site-packages\numpy\core\defmatrix.py", line 519, in getI
    return asmatrix(func(self))
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 355, in inv
    return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 254, in solve
    raise LinAlgError, 'Singular matrix'
LinAlgError: Singular matrix

我尝试从5个不同的图形生成邻接矩阵,当我试图找到邻接矩阵的逆时,它们都产生了相同的误差。我提出的问题是,是否有任何方法可以从NetworkX图表转到矩阵。从这里开始,我最好的行动方式是什么?我意识到还有其他与矩阵求逆有关的问题,但是由于我需要图形邻接矩阵,我的局限性有限。

3 个答案:

答案 0 :(得分:4)

邻接矩阵为not always invertible。这个问题有papers个;我不确定是否对相应的图表有任何简单的描述。一种实用的方法是在代码中捕获LinAlgError异常(尝试...除了......),并在邻接矩阵不可逆时发出警告(并继续执行计算)。

答案 1 :(得分:2)

我不确切知道networkx如何产生邻接矩阵,但绝对没有理由它是不可逆的。例如,考虑完整的图(所有节点彼此连接),其adacency矩阵充满1,矩阵明显为0作为特征值(当节点数> = 2时当然...)。或者具有N个节点且没有边缘的图形,其邻接矩阵是0 ...

你想做什么?我从来不必考虑邻接矩阵的逆,但对于x的某个(小)值,通常是I - x A的倒数。它的反面是

(I - x A) ^(-1) = I + xA + x^2 A2 + ...

对于x的某个值是可逆的(实际上,只要| x |< max(对于A的特征值为y,| 1 / y |)我认为...这是因为你考虑了这个数字你的图表中的路径,但在其中放入一些衰变,所以它是可求的(Pagerank任何人?)

答案 2 :(得分:1)

你是否要求一种方法来生成其邻接矩阵是非奇异的图?您生成的图表具有没有反转的邻接矩阵,这不是networkx或numpy的错误。