Ответ 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
.