Веса в двухсторонней центральности? - PullRequest
0 голосов
/ 10 ноября 2019

Я использую python и networkx, чтобы смоделировать, какой оратор упоминает, какой элемент в разговоре. Для этого я хочу построить двудольный график, где один набор узлов представляет колонки, а другой - элементы. Из этого графика я хочу вычислить некоторые показатели центральности, например, между центральностью. Я также хочу передать вес каждого ребра в качестве аргумента, где вес представляет, как часто говорящий упоминал какой-либо предмет. Однако двухсторонняя реализация не позволяет мне передавать вес в качестве аргумента.

В чем разница между реализациями и какую я должен использовать для моделирования моей проблемы?

import networkx as nx
from networkx.algorithms import bipartite

speakers = ['Pink', 'Green']
items = ['Knife', 'Rope']

B = nx.Graph()

B.add_nodes_from(items, bipartite = 0)
B.add_nodes_from(speakers, bipartite = 1)

B.add_edge('Pink', 'Knife', weight = 10)
B.add_edge('Pink', 'Rope', weight = 4)
B.add_edge('Green', 'Rope', weight = 2)
B.add_edge('Green', 'Knife', weight = 7)

bottom_nodes, top_nodes = bipartite.sets(B)

print(nx.is_bipartite(B))
print(bipartite.betweenness_centrality(B, bottom_nodes))
print(nx.betweenness_centrality(B))
print(nx.betweenness_centrality(B, weight = 'weight'))

Я получаю следующий вывод:

True
{'Knife': 0.25, 'Rope': 0.25, 'Pink': 0.25, 'Green': 0.25}
{'Knife': 0.16666666666666666, 'Rope': 0.16666666666666666, 'Pink': 0.16666666666666666, 'Green': 0.16666666666666666}
{'Knife': 0.0, 'Rope': 0.3333333333333333, 'Pink': 0.0, 'Green': 0.3333333333333333}

Я ожидаю, что результаты будут такими же;так в чем же разница в реализации?

1 Ответ

0 голосов
/ 10 ноября 2019

В документации есть объяснение центральности двудольных отношений.

Центральность между узлами v является суммой доли всех пар, кратчайшихпути, проходящие через v.

Значения промежуточности нормализуются по максимально возможному значению, которое для двудольных графов ограничено относительным размером двух наборов узлов

Документациядалее описывается коэффициент нормализации.

На самом деле, если вы проверяете исходный код для версии промежуточности, он напрямую вызывает нецентрализованный код центральности промежуточности, а затем применяет дополнительный коэффициент нормализации. Поэтому единственная причина, по которой существует двудольная версия, заключается в том, что вы можете нормализовать их по-разному.

В настоящее время нет возможности включить вес в двудольную версию. Однако, если вы посмотрите на исходный код, его будет нетрудно включить. Если вы сделаете это, вы должны подумать, как именно вы должны это сделать, чтобы охватить весь процесс, который вы пытаетесь объяснить. Это означает, что вы должны понимать, как происходит эта нормализация. В противном случае я бы придерживался не двудольной версии и просто убедился, что вы понимаете, что сравнивать центральность узлов в разных компонентах нехорошо.

...