Python中的矩阵与逆矩阵

2 投票
3 回答
4051 浏览
提问于 2025-04-15 16:40

我在做一个项目,使用NetworkX创建了一个图,然后想把这个图转换成邻接矩阵,使用的是NetworkX的adj_matrix()函数。不过,我遇到的一个问题是,每次我尝试求这个矩阵的逆时,都会出现错误。

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 个回答

1

你是在问怎么生成那些邻接矩阵是非奇异的图吗?其实,生成的图的邻接矩阵没有逆并不是networkx或numpy的问题。

2

我不太清楚networkx是怎么生成邻接矩阵的,但它绝对没有理由是可逆的。举个例子,考虑一个完全图(所有节点之间都有连接),它的邻接矩阵里全是1,而这个矩阵显然有0作为特征值(当然,当节点数量大于等于2时就会这样)。再比如,一个有N个节点但没有边的图,它的邻接矩阵就是全0...

你想做什么呢?我从来没有考虑过邻接矩阵的逆,但我经常需要考虑I - x A的逆,其中x是一个(小)值。它的逆是

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

这个在某些x的值下是可逆的(实际上,只要|x|小于A的特征值的最大值的倒数,我觉得就可以了)……这是因为你在考虑图中的路径数量,但加入了一些衰减,这样它就可以求和了(有人听说过Pagerank吗?)

4

邻接矩阵并不是总能被反转。关于这个话题有一些研究论文,但我不太确定是否有简单的方法来描述相关的图形。一个实际的做法是,在你的代码中捕捉LinAlgError这个错误(使用try… except…),当邻接矩阵不能反转时发出警告,其他情况下继续进行你的计算。

撰写回答