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

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

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

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

ввод данных (сеть.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)

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

1 ответов


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

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

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

теперь мы можем начать писать вектор членства вместе с именами узлов в 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.