Использование iGraph в python для обнаружения сообщества и записи номера сообщества для каждого node в CSV

У меня есть сеть, которую я бы хотел проанализировать с помощью алгоритма обнаружения сообщества edge_betweenness в iGraph. Я знаком с NetworkX, но я пытаюсь изучить iGraph из-за этого дополнительные методы обнаружения сообщества через NetworkX.

Моя конечная цель - запустить обнаружение сообщества edge_betweenness и найти оптимальное количество сообществ и написать CSV с членством сообщества для каждого node на графике.

Ниже мой код, как он сейчас стоит. Любая помощь в выяснении членства в сообществе очень ценится.

входные данные ('network.txt'):

1 2
2 3
2 7
3 1
4 2
4 6
5 4
5 6
7 4
7 8
8 9
9 7
10 7
10 8
10 9

Код iGraph

import igraph

# load data into a graph
g = igraph.Graph.Read_Ncol('network.txt')

# plot graph
igraph.plot(g)

igraph.plot(g)

# identify communities
communities = igraph.community_edge_betweenness()

# not really sure what to do next
num_communities = communities.optimal_count
communities.as_clustering(num_communities)

Что мне нужно сделать, чтобы найти оптимальное количество сообществ и написать, какое сообщество каждый node в списке принадлежит списку?

Ответ 1

Вы на правильном пути; оптимальное количество сообществ (где "оптимальный" определяется как "количество сообществ, которые максимизируют коэффициент модульности" ) может быть восстановлено communities.optimal_count, а структура сообщества может быть преобразована в плоскую непересекающуюся кластеризацию с использованием communities.as_clustering(num_communities). Фактически, количество сообществ может быть опущено, если оно окажется равным communities.optimal_count. После этого вы получаете объект VertexClustering с свойством membership, который дает вам индекс кластера для каждой вершины на графике.

Для ясности я переименовываю вашу переменную communities в dendrogram, потому что алгоритм обнаружения сообщества между границами фактически создает dendrogram::

# calculate dendrogram
dendrogram = graph.community_edge_betweenness()
# convert it into a flat clustering
clusters = dendrogram.as_clustering()
# get the membership vector
membership = clusters.membership

Теперь мы можем начать запись вектора принадлежности вместе с именами node в файл CSV::

import csv
from itertools import izip

writer = csv.writer(open("output.csv", "wb"))
for name, membership in izip(graph.vs["name"], membership):
    writer.writerow([name, membership])

Если вы используете Python 3, используйте zip вместо izip, и нет необходимости импортировать itertools.