【问题标题】:Different results in eigenvector centrality numpy特征向量中心性numpy的不同结果
【发布时间】:2020-06-24 18:13:31
【问题描述】:

以下示例给出了使用eigenvector_centralityeigenvector_centrality_numpy 获得的不同结果。有没有办法让这种计算更加稳健?我正在使用networkx 2.4numpy 1.18.5scipy 1.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}

【问题讨论】:

    标签: python-3.x networkx eigenvector


    【解决方案1】:

    edit - 查看 dshult 的回复。他是维护/更新networkx的主要人员之一。


    我认为这可能是一个错误,但不是您想的那样。该图是有向图和非循环图。所以对于这张图,我认为不存在非零特征值。

    看起来该算法似乎隐含地假设了一个无向图,或者至少如果它是有向图则它具有循环。如果没有循环,我希望算法会中断。

    我将鼓励 networkx 的人们更详细地了解这一点。

    我真的很惊讶它会收敛到非 numpy 版本。

    【讨论】:

    • 那么你是说有向图和无环图不能计算特征中心性?那么什么中心性度量应该更有意义?
    • 我的期望是一个节点的出边的总和越大,它越重要。我正在尝试通过中心性度量来捕捉这一点。
    • 我正在尝试使用nx.pagerank_numpy,到目前为止,它似乎对我的应用程序运行良好且稳健。虽然nx.eigenvector_centrality 也没有收敛问题,但它似乎对权重值更敏感。例如,如果我将AdjacencyMatrix[0][1] 设置为0.50.6,我会得到与pagerank 相同的解决方案,而eigenvector_centrality 会收敛到不同的值。
    • 如果您对重要的外边缘感兴趣,那么 pagerank 并不算数。更多的是关于进入的边缘/路径。PageRank 衡量您最终到达边缘之后的某个地方的可能性,但边缘输出不会影响这一点。这是使算法难以欺骗网站的重要功能之一 - 增加链接(由您控制​​)对您的排名没有帮助。
    • 如果我反转有向图怎么办?我称它为nx.pagerank_numpy(G.reverse(), ...)。我只关心应用程序中的外边缘。
    【解决方案2】:

    Joel 说 eigenvector_centrality 不是有向无环图的有用度量是正确的。见this nice description of centrality。这对于代码的 numpy 和非 numpy 版本都应该没用。

    【讨论】:

    • 是的,我在他的评论之后找到了那个链接。谢谢!
    • 想知道 PageRank 是否是一个安全可靠的选择...
    • PageRank 非常强大(它是为定向网络设计的,并且具有专门处理我为您的网络强调的问题的技术)。
    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 2021-09-20
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多