У меня есть следующий неориентированный и невзвешенный график, и я хочу измерить качество алгоритма кластеризации. Для этого измерения мне нужен ответ на вопрос:
Сколько уникальных ребер между вершинами одного кластера?
Например: кластер red будет иметь 6 ребер, кластер blue будет иметь 4 ребра, а кластер green будет иметь 4 ребра.
Это код, который я использовал для создания графика:
import networkx as nx
G = nx.Graph(directed=False).to_undirected()
G.add_edges_from([
("peter", "missy"),
("peter", "longfellow"),
("missy", "rhinehardt"),
("missy", "vivian"),
("brandon", "longfellow"),
("brandon", "zoe"),
("longfellow", "flash"),
("longfellow", "ox"),
("longfellow", "heather"),
("rhinehardt", "ox"),
("rhinehardt", "zostra"),
("rhinehardt", "vivian"),
("ox", "jenny"),
("vivian", "zostra"),
("vivian", "sarah"),
("flash", "zoe"),
("flash", "zostra"),
("flash", "heather"),
("zoe", "mathilda"),
("heather", "caitlyn"),
("heather", "sarah"),
("zostra", "mathilda"),
("zostra", "jenny"),
("sarah", "caitlyn"),
("caitlyn", "jenny")
])





Пример для зеленого кластера
# Original cluster
cluster = set(["caitlyn", "jenny", "zostra", "ox", "flash"])
# Searching for external vertices between two of cluster's vertices
# Can be more efficient if the inner loop starts from the current position
# of the outer loop
for u in cluster:
for v in cluster:
for between in list(nx.shortest_path(G, u, v)):
cluster.add(between)
# Create subgraph and count edges
subgraph = G.subgraph(list(cluster))
print(len(subgraph.edges()))
Вы также можете рассмотреть меры качества, предлагаемые networkx: Измерение перегородок. Он включает охват, модульность и производительность.
Если вы посмотрите на код, вы также найдете методы для intra_community_edges и inter_community_edges.
Спасибо за подсказку