【问题标题】:Unreasonable output generated by python-igraph closeness centralitypython-igraph closeness centrality产生的不合理输出
【发布时间】:2023-01-30 21:26:55
【问题描述】:

我目前正在研究几个图形,使用 python-igraph,设置为未定向、加权和截止,以生成它们的边缘介数和节点紧密度。

可以成功获取边介数。但是对于closeness,只有在没有设置cut-off的情况下才能返回结果;或者输出仅为 1 或 NaN。无论图表的大小和权重如何,都会发生此问题。

以下是一个示例图。 Please see the graph here.

我首先通过 Pandas 创建了边缘数据框。

   u_index  v_index  length
0        0        1       1
1        0        2       1
2        0        3       2
3        0        4       3
4        1        2       1
5        3        4       2

然后根据数据框中的信息创建图表。

ntwrg = ig.Graph()
ntwrg.add_vertices(1+max(edges["u_index"].max(), edges["v_index"].max()))
ntwrg.add_edges(list(zip(edges["u_index"], edges["v_index"])))
ntwrg.es["length"] = edges["length"]

然后我开始计算中心性。没有cut-off时,可以成功生成结果:

ntwrg.closeness(weights="length")
    cls_cen
0  0.571429
1  0.444444
2  0.444444
3  0.400000
4  0.307692

但是,当添加 cutoff = 3 时,预期结果将是:

ntwrg.closeness(weights="length", cutoff=3)
    cls_cen
0  0.571429
1  0.600000
2  0.600000
3  0.400000
4  0.400000

虽然返回的结果是:

   Cls_cen
0      1.0
1      1.0
2      1.0
3      NaN
4      NaN

另一方面,即使 cutoff=3 也能正常生成边介数:

ntwrg.edge_betweenness(weights="length", cutoff=3)
   Btw_cen
0      2.0
1      2.0
2      3.0
3      1.0
4      1.0
5      1.0

【问题讨论】:

  • 当 cutoff=3 时,你能解释一下为什么你期望顶点接近度的这些结果吗?如果没有长度小于 3 的路径,在某些情况下肯定会出现 NaN 的结果,因为路径长度在分母中,因此您不希望它们的总和为 0。
  • 另外请注意,我花了很长时间才阅读您的帖子并理解您的问题。如果以更简单的方式重写您的帖子,将受益于更少的代码和更多的图表绘图,更少强调 pandas 数据框,更多强调您提出的实际问题。
  • “由于我对C语言一无所知,所以我无法理解这个输出背后的逻辑。”<<< 这句话我没看懂。 C 语言与这些有什么关系?
  • 感谢@Stef 的所有建议。我为我的示例的图形图像编辑了文本和链接。你可以看到在这种情况下所有的边缘都在 3 以内,所以我相信在这种情况下不会有 NaN 的情况。

标签: python graph-theory igraph node-centrality


【解决方案1】:

tl;博士这是 python-igraph 0.10.0 – 0.10.3 中的错误。它在 0.10.4 中已修复。


这是 python-igraph 中的一个错误,which I just fixed。感谢您指出。问题只存在于 igraph 的 Python 接口中,不存在于 igraph C 库中,也不存在于 igraph 的其他高级接口中。

这是修复后检查此内容的记录:

In [1]: import igraph as ig

In [2]: g = ig.Graph([(0,1),(0,2),(0,3),(0,4),(1,2),(3,4)])

In [3]: g.es['length']=[1,1,2,3,1,2]

In [4]: g.closeness(weights='length')
Out[4]: 
[0.5714285714285714,
 0.4444444444444444,
 0.4444444444444444,
 0.4,
 0.3076923076923077]

In [5]: g.closeness(weights='length',cutoff=3)
Out[5]: [0.5714285714285714, 0.6, 0.6, 0.4, 0.4]

您可以compile the development version 立即获得修复。

【讨论】:

  • 感谢您解决问题。但是,在 Windows 上获取开发版本时遇到了一个问题。我该如何解决? igraph(pyproject.toml)的构建轮...错误错误:子进程退出错误
  • @user21071448 如果一切顺利,应该会在几天内发布包含此修复程序的新版本。
  • 非常感谢您的帮助。我稍后会尝试新版本。
  • @user21071448 新版本现已发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2017-10-05
相关资源
最近更新 更多