Я вычисляю triad census
следующим образом для моего undirected network
.
import networkx as nx
G = nx.Graph()
G.add_edges_from(
[('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])
from itertools import combinations
#print(len(list(combinations(G.nodes, 3))))
triad_class = {}
for nodes in combinations(G.nodes, 3):
n_edges = G.subgraph(nodes).number_of_edges()
triad_class.setdefault(n_edges, []).append(nodes)
print(triad_class)
Отлично работает с небольшими сетями. Тем не менее, теперь у меня есть большая сеть с примерно 4000-8000 узлов. Когда я пытаюсь запустить свой существующий код с сетью из 1000 узлов, это занимает несколько дней. Есть ли более эффективный способ сделать это?
Моя текущая сеть в основном редкая. то есть между узлами только несколько соединений. В таком случае, могу ли я оставить неподключенные узлы и сначала выполнить вычисления, а затем добавить незакрытые узлы к выводу?
Я также рад получить приблизительные ответы без расчета каждой комбинации.
Пример переписи триады:
Перепись триад делит триады (3 узла) на четыре категории, показанные на рисунке ниже.
Например, рассмотрим сеть ниже.
Перепись триады четырех классов:
{3: [('A', 'B', 'C')],
2: [('A', 'B', 'D'), ('B', 'C', 'D'), ('B', 'D', 'E')],
1: [('A', 'B', 'E'), ('A', 'B', 'F'), ('A', 'B', 'G'), ('A', 'C', 'D'), ('A', 'C', 'E'), ('A', 'C', 'F'), ('A', 'C', 'G'), ('A', 'D', 'E'), ('A', 'F', 'G'), ('B', 'C', 'E'), ('B', 'C', 'F'), ('B', 'C', 'G'), ('B', 'D', 'F'), ('B', 'D', 'G'), ('B', 'F', 'G'), ('C', 'D', 'E'), ('C', 'F', 'G'), ('D', 'E', 'F'), ('D', 'E', 'G'), ('D', 'F', 'G'), ('E', 'F', 'G')],
0: [('A', 'D', 'F'), ('A', 'D', 'G'), ('A', 'E', 'F'), ('A', 'E', 'G'), ('B', 'E', 'F'), ('B', 'E', 'G'), ('C', 'D', 'F'), ('C', 'D', 'G'), ('C', 'E', 'F'), ('C', 'E', 'G')]}
Я с удовольствием предоставлю более подробную информацию, если это необходимо.
EDIT:
Мне удалось разрешить memory error
, прокомментировав строку #print(len(list(combinations(G.nodes, 3))))
, как предложено в ответе. Тем не менее, моя программа по-прежнему работает медленно и занимает несколько дней, даже если сеть состоит из 1000 узлов. Я ищу более эффективный способ сделать это в Python.
Я не ограничен networkx
и рад принимать ответы, используя также другие библиотеки и языки.
Как всегда, я с радостью предоставлю более подробную информацию по мере необходимости.