图中的功能“共享邻居分布”

时间:2019-05-23 12:18:47

标签: networkx igraph

我想知道是否有人可以给我一些有关在给定簇的情况下编写“共享邻居分布”之类的功能的线索。我在Cytoscape NetworkAnalyzer中发现此功能对于我的研究目的非常有用。由于我要分析许多集群,因此为该工作编写脚本会很方便。欢迎使用igraph,networkx等提出建议。非常感谢你!

例如:

edgelist <- read.table(text = "
E   B
E   A
B   D
B   F
B   C
A   C
A   F
A   D")

library(igraph)
graph <- graph.data.frame(edgelist,directed=F)
plot(graph)

我们将看到如下图: enter image description here

两个节点(C,D,E,F)共享节点A和B。这是6倍。 节点A和B共享节点(C,D,E,F)。 总的来说,摘要应如下所示: enter image description here

我想知道是否有更好的解决方案,而不是编写循环(获取每个顶点的邻居并进行比较)。

2 个答案:

答案 0 :(得分:1)

Networkx没有针对此问题的内置功能,因此您应该手动进行操作。而且,如果有的话,这些函数会在它们内部使用节点循环。因此,节点循环实际上是一个最佳或次佳的解决方案。对于您的代码,您可以使用Python defaultdicts使其更简单:

import networkx as nx
from collections import defaultdict

G = nx.Graph()
G.add_edges_from([
    ("E", "B"),
    ("E", "A"),
    ("B", "D"),
    ("B", "F"),
    ("B", "C"),
    ("A", "C"),
    ("A", "F"),
    ("A", "D")
])
snd = defaultdict(int)
for n1 in G.nodes:
    for n2 in G.nodes:
        len_nbrs = len(set(G.neighbors(n1)) & set(G.neighbors(n2)))
        if len_nbrs:
            snd[len_nbrs] += 1
snd

所以snd看起来像这样:

defaultdict(int, {2: 16, 4: 4})

答案 1 :(得分:0)

非常感谢@vurmux提供的框架和想法。我只是调整了配对组合,以避免自我配对,重复等。然后我们得到了正确的答案。大。干杯!

import networkx as nx
from collections import defaultdict
from itertools import combinations

G = nx.Graph()
G.add_edges_from([
    ("E", "B"),
    ("E", "A"),
    ("B", "D"),
    ("B", "F"),
    ("B", "C"),
    ("A", "C"),
    ("A", "F"),
    ("A", "D")
])

snd = defaultdict(int)
l =G.nodes()
comb =combinations(l,2) # combinations('ABCD', 2) --> AB AC AD BC BD CD
for i in list(comb):
    len_nbrs = len(set(G.neighbors(i[0])) & set(G.neighbors(i[1])))
    if len_nbrs:
        snd[len_nbrs] += 1

snd

现在我们有:

defaultdict(int, {2: 6, 4: 1})