【问题标题】:NetworkX Make iteration list of combinations of edgesNetworkX 制作边组合的迭代列表
【发布时间】:2019-04-24 18:34:49
【问题描述】:

我有一个 180x180 的邻接矩阵,我正在尝试生成所有合理的组合以使用 NetworkX。

我想依次删除部分图表,然后确定新编辑的图表对全局效率的影响。

在此视图中,一组合理的组合是彼此相邻的所有节点集,以及从假设它们彼此相邻到子图的所有可能的子图组合。

运行所有组合的蛮力方法太慢了,对于任何超过 15 个删除序列的运行时间约为 21 小时。因此,我们只想通过查看彼此相邻的组合来解决这个问题.

基本上代码需要做到以下几点:

  1. 导入包含二进制邻接矩阵的 csv,其中 1 表示物理连续性(在本例中为大脑)
  2. 导入networkx图
  3. 确定彼此之间的路径长度最多为 1 的所有组合集 ....换句话说,如果两个节点或两个节点集在任一端的距离大于 1,则它们将被忽略
  4. 为每个可能的组合生成这些节点集的列表

这是基本问题

假设大脑某个区域的物理空间包括几个大致像这样的区域......假设这些是镶嵌平面的不规则多边形

1 2 3 4 5

6 7 8 9

10 11

我们可以把它变成一个邻接矩阵,其中 1 表示区域共享边界,0 表示它们在物理上不相互接壤

+--+---------------------------------+
|  | 1  2  3  4  5  6  7  8  9  10 11|
+--+---------------------------------+
|1 | 0  1  0  0  0  1  0  0  0  0  0 |
|2 | 1  0  1  0  0  0  1  1  0  0  0 |
|3 | 0  1  0  1  0  0  0  1  1  0  0 |
|4 | 0  0  1  0  1  0  0  0  1  0  0 |
|5 | 0  0  0  1  0  0  0  0  1  0  0 |
|6 | 1  0  0  0  0  0  1  0  0  1  0 |
|7 | 0  1  0  0  0  1  0  1  0  1  1 |
|8 | 0  1  1  0  0  0  1  0  1  0  1 |
|9 | 0  0  1  1  0  0  0  1  0  0  0 |
|10| 0  0  0  0  0  1  1  0  0  0  1 |
|11| 0  0  0  0  0  0  1  1  0  1  0 |
+--+---------------------------------+

基本上,邻接矩阵表示彼此相邻的大脑部分......我们想要遍历并生成这些节点的分组列表,这些节点从单个节点开始,并工作到每个可能的组合带有警告的节点,我们不希望组合彼此不物理接触.....

所以例如这样的列表将有 1,2,....11 还有 1+2 和 7+8 等 最终我们将有 2+7+8 和 6+7+8+10 因为所有这些节点都相互接触并形成一个连通分量 1-11 不允许,因为它们不共享边界​​,4+5+10 也不允许,因为它们不接触

这很重要的原因是我们是脑外科医生,我们删除部分图表以谋生......即大脑图表......但您永远不会删除不相邻的节点......我们正在尝试使用图表来定义我们可以在手术中走多远......所以我们需要使用 python 来生成所有可能的节点删除组合,这在现实世界中是有意义的......二进制邻接矩阵代表物理中的现实空间

一旦我有了一个节点删除的合理组合列表,我就有了一个采用不同 pandas 数据帧的代码……将节点和边归零,然后创建一个 networkx 图,我们在该图上运行效率指标…… .我只需要一种方法来确定所有可能的连续组件集,这样我们就不会运行解剖学上不合理的组合

我想解决这个问题的方法是在 networkx 中使用某种连续组件函数,但无论如何我都找不到从图中导出所有可能的连接组件组合

基本上代码会是这样的

boundary=pd.read_csv(adjacency.csv)
G=networkx.from_pandas_adjacency(boundary)
combo="something to iterate the graph g to create a list of all connected components"


for row in combo:
        values = row
        datasafe=pandas.read_csv("connections.csv", index_col=0)
        datasafe.loc[values, :] = 0

        datasafe[values] = 0

        g=networkx.from_pandas_adjacency(datasafe)
        h=networkx.from_pandas_adjacency(datasafe)
        le=local_efficiency(g)
        LE_list.append(le)
        ge=global_efficiency(h)
        GE_list.append(ge)
output=pandas.DataFrame(list(zip(combo, GE_list,LE_list)))
output.to_csv('multi.csv',index=None)

请注意,我们使用一个 csv 来确定列表并在不同的 CSV 上使用该列表

提前致谢...这是您正在帮助解决的一个重要问题,可以挽救生命

【问题讨论】:

  • 那么,您想要一个所有直接相互连接的节点的列表吗?请提供您的数据和代码的最小示例。
  • 请提供一个最小示例,即一小段数据(输入)和预期输出。也请提供您代码中的相关部分。
  • 我编辑了问题以包含我们需要的示例

标签: python networkx


【解决方案1】:

连接组件的正确命名是complete subgraph(不要混淆真正的connected components)。您的问题被称为clique problemnetworkx 有几种算法可以解决这个问题: networkx cliques

你的问题可以通过这个函数解决:networkx.algorithms.clique.enumerate_all_cliques

请注意,此函数返回所有可能的团,长度也为 1 和 2(即每个节点和每条边),因此您应该过滤 1-2 长度的团。例如,对于您的图表,此函数返回:

list(nx.enumerate_all_cliques(G))

[[0],
 [1],
 [2],
 [3],
 [4],
 [5],
 [6],
 [7],
 [8],
 [9],
 [10],
 [0, 1],
 [0, 5],
 [1, 2],
 [1, 6],
 [1, 7],
 [2, 3],
 [2, 7],
 [2, 8],
 [3, 4],
 [3, 8],
 [4, 8],
 [5, 6],
 [5, 9],
 [6, 7],
 [6, 9],
 [6, 10],
 [7, 8],
 [7, 10],
 [9, 10],
 [1, 2, 7],
 [1, 6, 7],
 [2, 3, 8],
 [2, 7, 8],
 [3, 4, 8],
 [5, 6, 9],
 [6, 7, 10],
 [6, 9, 10]]

但如果我们过滤所有无用的派系,我们会得到这个:

list(filter(lambda x: len(x) > 2, nx.enumerate_all_cliques(G)))

[[1, 2, 7],
 [1, 6, 7],
 [2, 3, 8],
 [2, 7, 8],
 [3, 4, 8],
 [5, 6, 9],
 [6, 7, 10],
 [6, 9, 10]]

【讨论】:

  • 如果您稍后需要帮助,可以通过vurmux@gmail.com 电子邮件或 Telegram 中的t.me/vurmux 与我联系。我很乐意为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2013-01-30
相关资源
最近更新 更多