networkx中不切实际的特征值

时间:2016-02-28 22:18:04

标签: computational-geometry graph-theory networkx spectral

下午好, 图论中一个比较着名的数学定理(参见" Bipartite和邻域图的引入和归一化图拉普拉斯算子的谱"由Bauer和Jost提出)表明归一化拉普拉斯算子的频谱总是从上面以2为界,当且仅当图是二分时,才获得上界。我正在使用Networkx和拉普拉斯频谱(由Networkx实用程序生成的数组)返回远大于2的值。对于下面的示例,我得到的最大特征值是18.137。该图不是二分图,因此最大特征值应严格小于2.以下是代码示例:

import networkx as nx

Graph=nx.karate_club_graph() 

print nx.laplacian_spectrum(Graph)

1.137978592311377107e-15,
4.685252267013915728e-01,
9.092476638033122338e-01,
1.125010718244666030e+00,
1.259404110121709719e+00,
1.599283075429581258e+00,
1.761898621144031507e+00,
1.826055209825464098e+00,
1.955050447337369102e+00,
1.999999999999998446e+00,
1.999999999999999556e+00,
2.000000000000000000e+00,
2.000000000000000444e+00,
2.000000000000001332e+00,
2.487091734464515369e+00,
2.749157175276658815e+00,
3.013962966251617193e+00,
3.242067477421745725e+00,
3.376154092871075374e+00,
3.381966011250106874e+00,
3.472187399726446522e+00,
4.275876820141818691e+00,
4.480007671029976102e+00,
4.580792668029516790e+00,
5.378595077669420910e+00,
5.618033988749897567e+00,
6.331592223669625596e+00,
6.515544628031584296e+00,
6.996197033107128149e+00,
9.777240952801486529e+00,
1.092106753013355558e+01,
1.330612231276679225e+01,
1.705517119099513224e+01,
1.813669597300440017e+01

据我所知,这个Networkx函数最有可能使用拉普拉斯谱,而不是标准化的拉普拉斯谱。但是,因为他们是"类似" (在数学意义上)矩阵它们应该具有相同的特征值。我哪里错了?我可能在做一些愚蠢的事情,我只是没有看到它。

2 个答案:

答案 0 :(得分:2)

在networkx中,您正在寻找的拉普拉斯算子被称为“normalized_laplacian”。 这两个定义给出了不具有相同特征值的矩阵。 维基百科页面https://en.wikipedia.org/wiki/Laplacian_matrix有一个不错的讨论。

In [1]: import networkx as nx

In [2]: G = nx.karate_club_graph()

In [3]: from scipy.linalg import eigvalsh 

In [4]: eigvalsh(nx.laplacian_matrix(G).todense())
Out[4]: 
array([ -5.97438766e-15,   4.68525227e-01,   9.09247664e-01,
         1.12501072e+00,   1.25940411e+00,   1.59928308e+00,
         1.76189862e+00,   1.82605521e+00,   1.95505045e+00,
         2.00000000e+00,   2.00000000e+00,   2.00000000e+00,
         2.00000000e+00,   2.00000000e+00,   2.48709173e+00,
         2.74915718e+00,   3.01396297e+00,   3.24206748e+00,
         3.37615409e+00,   3.38196601e+00,   3.47218740e+00,
         4.27587682e+00,   4.48000767e+00,   4.58079267e+00,
         5.37859508e+00,   5.61803399e+00,   6.33159222e+00,
         6.51554463e+00,   6.99619703e+00,   9.77724095e+00,
         1.09210675e+01,   1.33061223e+01,   1.70551712e+01,
         1.81366960e+01])

In [5]: eigvalsh(nx.normalized_laplacian_matrix(G).todense())
Out[5]: 
array([  6.28463560e-16,   1.32272329e-01,   2.87048985e-01,
         3.87313233e-01,   6.12230540e-01,   6.48992947e-01,
         7.07208202e-01,   7.39957989e-01,   7.70910617e-01,
         8.22942852e-01,   8.64832945e-01,   9.06816002e-01,
         1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         1.00000000e+00,   1.10538084e+00,   1.15929996e+00,
         1.26802355e+00,   1.35177826e+00,   1.39310454e+00,
         1.41691585e+00,   1.44857938e+00,   1.49703011e+00,
         1.56950660e+00,   1.58333333e+00,   1.61190959e+00,
         1.71461135e+00])

答案 1 :(得分:1)

我认为这是拉普拉斯人有不同定义的不同人的问题。

在鲍尔和约斯特:

  

拉普拉斯算子class _MyActualComponent extends React.Component<reduxScafolding.Action & { myReduxState: reduxScafolding.ReduxState; pushPath: ReduxSimpleRouter.pushPath; } & { myActualProp: string; }, {}>{ //my component's implementation goes here. } /** type for casting (so consumers know the props they are required to pass */ class IMyComponentVisibleType extends React.Component<{ myActualProp: string; }, {}> { }; /** instrument my component with redux */ export var MyComponent = ReactRedux.connect( (reduxStoreState) => { //subscripbe to reduxStore updates (Called every change). return { myReduxState: reduxStoreState.myReduxState }; //map myReduxState to props } , _.merge({}, {}, { pushPath: ReduxSimpleRouter.pushPath }, reduxScafolding.action) as any //redux-binds, then includes the pushPath() method for use in our _App Component )(_MyActualComponent) as any as typeof IMyComponentVisibleType; 可以被视为,其中∆ =: I − P表示身份,I是随机游走的转移概率算子(或者有时称为马尔可夫)运营商),分别。我们应该在这里指出,归一化图拉普拉斯算子P并不完全是Fan Chung [10]研究的那个。但是,两个拉普拉斯算子都是等效的,因此具有相同的频谱

在Chung的工作中,

  

L(u,v)= 如果u = v 1 如果你和v有边和{{ 1}} 否则

在Networkx中,

  

图拉普拉斯算子是矩阵1/sqrt(d_u d_v),其中0是邻接矩阵,L = D - A是节点度的对角矩阵。

我接受鲍尔和约斯特的话,他们的话就相当于范颂所做的事情(我乍一看对我来说并不是很明显)。但我完全不相信她所做的事情会与A具有相同的特征值。

编辑 Aric的回答清楚地表明这是问题,networkx也有您正在寻找的规范化矩阵。