Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 特征向量中心数的不同结果_Python 3.x_Networkx_Eigenvector - Fatal编程技术网

Python 3.x 特征向量中心数的不同结果

Python 3.x 特征向量中心数的不同结果,python-3.x,networkx,eigenvector,Python 3.x,Networkx,Eigenvector,以下示例给出了使用特征向量中心性和特征向量中心性

以下示例给出了使用
特征向量中心性
特征向量中心性
获得的不同结果。有没有办法使这种计算更加可靠?我使用的是
networkx2.4
numpy1.18.5
scipy1.5.0

import numpy as np
import networkx as nx

AdjacencyMatrix = {
    0: {
        1: 0.6,
    },
    1: {
        2: 0,
        3: 0,
    },
    2: {
        4: 0.5,
        5: 0.5,
    },
    3: {
        6: 0.5,
        7: 0.5,
        8: 0.5,
    },
    4: {},
    5: {},
    6: {},
    7: {},
    8: {},
}

G = nx.DiGraph()

for nodeID in AdjacencyMatrix.keys():
    G.add_node(nodeID)

for k1 in AdjacencyMatrix.keys():
    for k2 in AdjacencyMatrix[k1]:
        weight = AdjacencyMatrix[k1][k2]
        split_factor = len(AdjacencyMatrix[k1])
        G.add_edge(k1, k2, weight=weight / split_factor, reciprocal=1.0 / (split_factor * weight) if weight != 0 else np.inf)

eigenvector_centrality = {v[0]: v[1] for v in sorted(nx.eigenvector_centrality(G.reverse() if G.is_directed() else G, max_iter=10000, weight="weight").items(), key=lambda x: x[1], reverse=True)}
print(eigenvector_centrality)

eigenvector_centrality_numpy = {v[0]: v[1] for v in sorted(nx.eigenvector_centrality_numpy(G.reverse() if G.is_directed() else G, max_iter=10000, weight="weight").items(), key=lambda x: x[1], reverse=True)}
print(eigenvector_centrality_numpy)
以下是我的输出:

{0: 0.6468489798823026, 3: 0.5392481399595738, 2: 0.5392481399595732, 1: 0.0012439403459275048, 4: 0.0012439403459275048, 5: 0.0012439403459275048, 6: 0.0012439403459275048, 7: 0.0012439403459275048, 8: 0.0012439403459275048}
{3: 0.9637027924175013, 0: 0.0031436862826891288, 6: 9.593026373266866e-11, 8: 3.5132785569658154e-11, 4: 1.2627565659784068e-11, 1: 9.433263632036004e-14, 7: -2.6958851817582286e-11, 5: -3.185304797703736e-11, 2: -0.26695888283266833}

编辑-参见dshult的回复。他是维护/更新networkx的主要人员之一


我认为这可能是一个错误,但不是你想的那样。这个图是有向无环的。所以对于这个图,我不认为有一个非零的特征值

看起来这个算法似乎隐式地假设了一个无向图,或者至少如果它是有向的,它就有循环。如果没有循环,我希望算法会崩溃

我将鼓励networkx人员更详细地了解这一点


实际上,我很惊讶它会收敛于非numpy版本。

Joel正确地说,特征向量中心性对于有向无环图来说不是一个有用的度量。看见这对于numpy和非numpy版本的代码都是无用的。

那么你是说不能计算有向图和无环图的特征中心度?那么,什么样的中心性度量才更有意义呢?我的期望是,节点的输出边之和越大,它就越重要。我正试图通过中心性度量来捕捉这一点。我正在尝试使用
nx.pagerank\u numpy
,目前为止,它在我的应用程序中运行良好且稳定。虽然
nx.特征向量_中心性
也没有收敛问题,但它似乎对权重值更敏感。例如,如果我将
邻接矩阵[0][1]
设置为
0.5
0.6
,我得到了与
pagerank
相同的解决方案,而
特征向量(中心性)会收敛到不同的值。如果你对外部边缘重要感兴趣,pagerank实际上并不计算这些值。更多的是边缘/路径。PageRank测量您在某个地方跟随边缘的可能性,但边缘向外并不影响这一点。这是一个重要的特性,使得算法很难欺骗网站-增加链接(由你控制)无助于你的排名。如果我反转有向图呢?我把它叫做
nx.pagerank\u numpy(G.reverse(),…)
。我只关心我的应用程序的外部边缘。是的,我在他的评论后找到了那个链接。谢谢想知道PageRank是否是一个安全和健壮的选项…PageRank非常健壮(它是为定向网络设计的,并且有专门处理我为您的网络强调的问题的技术)。