如何用python获得复杂网络拉普拉斯矩阵的第二小特征值?

时间:2017-06-09 03:01:45

标签: python scipy eigenvalue complex-networks

我正在尝试使用shift-invert模式使用python计算复杂网络(具有10000个节点)的拉普拉斯矩阵的第二个最小特征值,这里是代码:

import numpy as np
import networkx as nx
from scipy import sparse
G = nx.watts_strogatz_graph(10000,4,0.1)
degree_dict = nx.degree(G)
degree_list = []
for i in degree_dict:
    degree_list.append(degree_dict[i])
lap_matrix = sparse.diags(degree_list, 0)-nx.adjacency_matrix(G)
eigval, eigvec = sparse.linalg.eigsh(lap_matrix, 2, sigma=0, which='LM')
second_eigval = eigval[1]

在上面的代码上运行时,我得到了:

RuntimeError: Factor is exactly singular

错误是否意味着拉普拉斯矩阵是单数的? 关于我应该如何进行的任何想法? 有没有其他方法来计算这个第二个最小的特征值(使用Matlab或任何其他编程语言)?

1 个答案:

答案 0 :(得分:2)

你的代码对我来说(SciPy 1.0.0)几乎与写的一样,除了我简化了degree_list的形成(在你的版本中引发了KeyError)

import numpy as np
import networkx as nx
from scipy import sparse

G = nx.watts_strogatz_graph(10000,4,0.1)
degree_dict = nx.degree(G)
degree_list = [x[1] for x in degree_dict]
lap_matrix = sparse.diags(degree_list, 0)-nx.adjacency_matrix(G)
eigval, eigvec = sparse.linalg.eigsh(lap_matrix, 2, sigma=0, which='LM')

现在eigval是[1.48814294e-16, 4.88863211e-02];最小特征值在机器精度范围内为零,而第二小特征值不在机器精度范围内。