Использование 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)
# 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
.