【问题标题】:Function "shared neighbors distribution" in igraphigraph中的函数“共享邻居分布”
【发布时间】:2019-05-23 12:18:47
【问题描述】:

我想知道是否有人可以给我一些关于在给定集群的情况下编写诸如“共享邻居分布”之类的函数的线索。我发现 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

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

【问题讨论】:

  • 你好。为了提供帮助,你能告诉我们这个函数需要什么样的输入以及输出是什么?到目前为止,您尝试过什么?
  • 谢谢@Joel,我稍微修改了一下我的问题。简而言之,输入是一个图,输出是共享邻居数量的分布。
  • 我有一个这样的想法:将图转换成邻接矩阵matrix &lt;- get.adjacency(graph, type=c("both")) 然后我们按照行的内容对矩阵进行排序。

标签: networkx igraph


【解决方案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})

【讨论】:

  • 如果我的回答对你有帮助,如果你能支持/接受我的回答,我将不胜感激:)
  • 但是当我将它用于我的示例网络时,结果似乎不正确。它返回defaultdict(int, {0: 8})
  • 你有有向图还是无向图?
  • 无向图@vurmux
  • 你能把你的图表添加到问题中吗?
【解决方案2】:

非常感谢@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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-19
    • 2016-07-04
    相关资源
    最近更新 更多