【问题标题】:How can I extract all possible induced subgraphs from a given graph with networkx如何使用networkx从给定图中提取所有可能的诱导子图
【发布时间】:2014-04-06 11:41:39
【问题描述】:

我想知道是否可以使用 networkx 从输入大图中提取所有可能的诱导子图(graphlet),其中子图中具有特定数量的节点,或者是否有另一个包可以完成这项工作?例如,如果我有一个大图,以 networkx 邻接表格式说明,

图 G:

1 2 3 7
2 1 4
3 1 4 6 5
4 2 3 5
5 3 4 6
6 3 5 7
7 1 6

看起来像

如果我想提取具有 3 个节点的 graphlet,算法应该返回我

子图1:

1 2 3
2 1
3 1

[(1,2),(1,3)] 子图2:

1 3 7
3 1
7 1

[(1,3),(1,7)] 子图3:

3 4 5
4 3 5
5 3 4

[(3,4),(3,5),(4,5)]

subgraph4,subgraph5,subgraph6...

以下是@Hooked 提出的问题的代码。 假设 n=3

import itertools
target = nx.complete_graph(3)
for sub_nodes in itertools.combinations(g.nodes(),len(target.nodes())):
    subg = g.subgraph(sub_nodes)
    if nx.is_connected(subg):
        print subg.edges()

输出看起来像

[(1, 2), (1, 3)]
[(1, 2), (2, 4)]
[(1, 2), (1, 7)]
[(1, 3), (3, 4)]
[(1, 3), (3, 5)]
[(1, 3), (3, 6)]
[(1, 3), (1, 7)]
[(1, 7), (6, 7)]
[(2, 4), (3, 4)]
[(2, 4), (4, 5)]
[(3, 4), (3, 5), (4, 5)]
[(3, 4), (3, 6)]
[(3, 5), (3, 6), (5, 6)]
[(3, 6), (6, 7)]
[(4, 5), (5, 6)]
[(5, 6), (6, 7)]

【问题讨论】:

  • 你的意思是非同构诱导子图吗?为什么不在 3 4 5 上三角形?
  • @hivert Graphlets 对我来说也是一个新名词。维基百科说它们是“......大型网络的小型连接非同构诱导子图。”
  • @Hooked : triangle 3 4 5 is 已连接。
  • @hivert 对不起,我不清楚,如果 OP 表示非同构诱导子图但试图解释“graphlet”的含义,我正在回答您的问题。是的 3,4,5 是连接的,是的,如果我理解这个问题,我认为应该包括它。
  • @Hooked :由于连接这个词没有出现在问题的任何地方,我不确定 OP 是否也是这个意思!

标签: python graph extract networkx subgraph


【解决方案1】:

这假设您想要给定target 的所有匹配子图,您必须定义这些子图。本机方法是遍历所有节点组合,找到连接的节点然后检查同构。目前尚不清楚您是否想要网络主题或graphlet。在 graphlet 中,原始图中存在的所有边都必须存在 - 这会将 3-4-5 从您的目标中排除。此方法查找图元,要查找基序,您必须检查每个组合是否存在诱导子图(以及有多少!)。

import networkx as nx

g = nx.Graph()
g.add_edge(1,2);g.add_edge(1,3)
g.add_edge(1,7);g.add_edge(2,4)
g.add_edge(3,4);g.add_edge(3,5)
g.add_edge(3,6);g.add_edge(4,5)
g.add_edge(5,6);g.add_edge(6,7)

import itertools

target = nx.Graph()
target.add_edge(1,2)
target.add_edge(2,3)

for sub_nodes in itertools.combinations(g.nodes(),len(target.nodes())):
    subg = g.subgraph(sub_nodes)
    if nx.is_connected(subg) and nx.is_isomorphic(subg, target):
        print subg.edges()

对我来说,这给出了边缘集匹配:

[(1, 2), (1, 3)]
[(1, 2), (2, 4)]
[(1, 2), (1, 7)]
[(1, 3), (3, 4)]
[(1, 3), (3, 5)]
[(1, 3), (3, 6)]
[(1, 3), (1, 7)]
[(1, 7), (6, 7)]
[(2, 4), (3, 4)]
[(2, 4), (4, 5)]
[(3, 4), (3, 6)]
[(3, 6), (6, 7)]
[(4, 5), (5, 6)]
[(5, 6), (6, 7)]

您的示例在此处列出。

【讨论】:

  • 感谢您的回答,但我的目的是,对于给定的大图 G 和子图 n 中的节点数,我想提取所有可能包含与原始大图。
  • @tohnperfect 我不确定我是否理解。列出的每个集合都是一个适当的诱导子图。您的两个示例是该列表中的[(1, 2), (1, 3)][(1, 3), (1, 7)][(3, 4), (4, 5)] 不在 cmets 建议的列表中,因为它不是诱导子图,因为需要存在边 (5,3)
  • [(3,4),(4,5),(3,5)] 也应该在列表中。算法会生成很多子图。我的例子不够清楚,因为只有一种子图样式。
  • @tohnperfect 如果将target 更改为三个节点(K3)上的完整图,此算法将匹配它。您的示例仅与我正在查看的三个节点上的折线图匹配。如果您取消对 targetnx.is_isomorphic(subg, target) 的检查,您将获得 all 匹配给定大小 n。
  • 如果您的graphlet 大于几个节点,您将开始遇到其他问题。 itertools.combinations 是一个组合过程,它尝试每个节点组合,例如,100 个主节点和一个 10 个节点的子图,这大约是 10^13 个组合。有更聪明的方法可以解决这个问题,但这超出了问题的范围。尝试数学堆栈交换一些想法,因为这超出了编程领域。
【解决方案2】:

对于最终在这里遇到同样问题但节点过多的人,这里对@Hooked 的答案进行了一些简单的改进(尽管我确信正如@Hooked 在 cmets 中提到的那样,有更好的解决方案,这只是一个为那些因与我一样的原因而最终来到这里并遇到缩放问题的人进行快速复制粘贴修复)

1) igraph 比 networkx 扩展性更好

2)我们只能取一个节点的邻域来消除大部分不必要的组合

例如,如果我们正在寻找更大的 network 中的 motif(两个 igraph 对象)

    motif_rank = max(max(motif.shortest_paths_dijkstra()))
    result = collections.OrderedDict.fromkeys(network.vs['label'], 0)

    for node in self.network.vs:
        # Get relevant nodes around node of interest that might create the motif of interest
        nodes_to_expand = {node}
        for rank in range(motif_rank):
            nodes_expanded = nodes_to_expand
            for node_to_expand in nodes_to_expand:
                nodes_expanded = set.union(nodes_expanded, set(node_to_expand.neighbors()))
            nodes_to_expand = nodes_expanded

        # Look at all combinations
        for sub_nodes in itertools.combinations(nodes_to_expand, motif.vcount()):
            subg = network.subgraph(sub_nodes)
            if subg.is_connected() and subg.isomorphic(motif):
                result[node['label']] = result[node['label']]+1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多