Python中的矩阵和逆矩阵

问题描述:

对于我正在做的项目,我使用NetworkX的adj_matrix()函数将使用NetworkX创建的图分解成邻接矩阵。但是,我遇到的一个问题是,当我尝试查找矩阵的逆矩阵时,我分解的每个图都给出了以下错误。Python中的矩阵和逆矩阵

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图表转换为矩阵。我从这里最好的行动是什么?我意识到还有其他与矩阵求逆有关的问题,但是由于我需要图邻接矩阵这一事实而受到某种程度的限制。

邻接矩阵是not always invertible。关于这个问题有papers;我不确定相应图表是否有任何简单的表征。一个实用的方法是捕获代码中的LinAlgError异常(try ... except ...),并在邻接矩阵不可逆时警告(否则继续执行计算)。

+0

我正在做的事情需要邻接列表的反转。我试图通过利用图的邻接矩阵找到一个图中的路径集合(Katz度量)。公式如下。 Katz =((I-xA)^ - 1)-I – GobiasKoffi 2009-12-04 15:26:16

+0

有意思。如果两点之间存在无限数量的路径(发生在图形中出现循环时),那么我猜测你不能执行反转(结果是无限的)。也许这是你遇到的问题?例如,你可以用非循环图来尝试你的例程。 – EOL 2009-12-05 11:54:52

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

+0

我使用Networkx标准Graph()对象,然后我慢慢开始向它添加节点使用add_edges()和add_node()。顺便说一句,真棒头像。 – GobiasKoffi 2009-12-04 15:46:25

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

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

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

这是可逆的一些x值(事实上,只要| X | < MAX(| 1/Y |为A的特征值Y),我认为)...这是因为你考虑图中的路径数量,但在它的一些衰减,所以它是可以总结的(Pagerank任何人?)

+0

顺便提一下,您提供的公式实际上与我正在尝试做的非常相似。我试图通过利用图的邻接矩阵找到一个图中的路径集合(Katz度量)。公式如下。 Katz =((I-xA)^ - 1)-I(其中I是逆矩阵,'x'是小常数)。 – GobiasKoffi 2009-12-04 15:26:58

+0

正如我所说,如果你的x足够低,它(I-xA)是不可逆的。为了确保它,您可以对A的特征值进行分类,并相应地选择x。请注意,这与尝试反转A本身并不相同。 – LeMiz 2009-12-05 00:02:14