Функция «Распределение общих соседей» в igraph - PullRequest
1 голос
/ 23 мая 2019

Интересно, может ли кто-нибудь дать мне подсказку о написании функции типа «распределение общих соседей» с учетом кластеров. Я нашел эту функцию в 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)

Мы бы увидели такой график: введите описание изображения здесь

Либо два из узлов (C, D, E, F) имеют общие узлы A и B. Это 6 раз. Узлы A и B имеют общие узлы (C, D, E, F). В итоге резюме должно выглядеть так: введите описание изображения здесь

Вместо того, чтобы писать цикл (чтобы получить соседей для каждой вершины и сравнить их), мне интересно, есть ли лучшие решения.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

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})
0 голосов
/ 25 мая 2019

Большое спасибо @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})
...