Вычисление центральности собственного вектора с использованием NetworkX

Я использую библиотеку NetworkX для работы с небольшим и средним невзвешенными ориентированными графами без знака, представляющими использование сайта Web 2.0 (наименьший граф: менее двух десятков узлов, самый большой: несколько тысяч). Одна из вещей, которую я хочу вычислить, это центральность собственного вектора, как показано ниже:

>>> eig = networkx.eigenvector_centrality(my_graph)
>>> eigs = [(v,k) for k,v in eig.iteritems()]
>>> eigs.sort()
>>> eigs.reverse() 

Тем не менее, это дает неожиданные результаты: узлы с 0 градусов, но принимающие входящие дуги от самых центральных узлов появляются в самом конце списка с центральностью собственного вектора 0.0 (не будучи математиком, я, возможно, запутался, но я не думаю, что внешние дуги должны иметь какое-либо значение для центральности узла относительно ориентированного графа). В ходе исследования этих результатов я заметил из документации, что NetworkX по умолчанию вычисляет "правильную" центральность собственных векторов; из любопытства я решил вычислить "левую" центральность собственных векторов рекомендованным методом, то есть повернуть график перед вычислением центральности собственных векторов ( см. документацию Networkx). К моему удивлению, я получил точно такой же результат: каждый узел был рассчитан так, чтобы иметь точно такую ​​же центральность собственного вектора, как и раньше. Я думаю, что это должно быть очень маловероятным результатом ( см. Статью в Википедии), но с тех пор я воспроизвел его со всеми графиками, с которыми я работаю. Может кто-нибудь объяснить мне, что я делаю не так?

NB Использование реализации NetworkX алгоритма PageRank дает ожидаемые результаты, то есть узлы, получающие входящие дуги от центральных узлов, имеют высокую центральность, даже если их конечная степень равна 0. PageRank обычно считается вариантом центральности собственного вектора ( см. Статью в Википедии).).

Изменить: после запроса от Арика, я включил некоторые данные. Это анонимная версия моего самого маленького графа. (Я не смог опубликовать игрушечные данные, если проблема связана со структурой моих графиков.) Выполнение приведенного ниже кода на моей машине (с Python 2.7), кажется, показывает (а), что центральность правого и левого собственных векторов каждого узла является то же самое, и (b) что узлы с конечной степенью 0 неизменно также имеют центральность собственного вектора 0, даже если они достаточно центральны для графа в целом (например, узел 61).

import networkx

anon_e_list = [(10, 59), (10, 15), (10, 61), (15, 32), (16, 31), (16, 0), (16, 37), (16, 54), (16, 45), (16, 56), (16, 10), (16, 8), (16, 36), (16, 24), (16, 30), (18, 34), (18, 36), (18, 30), (19, 1), (19, 3), (19, 51), (19, 21), (19, 40), (19, 41), (19, 30), (19, 14), (19, 61), (21, 64), (26, 1), (31, 1), (31, 3), (31, 51), (31, 62), (31, 33), (31, 40), (31, 23), (31, 30), (31, 18), (31, 13), (31, 46), (31, 61), (32, 3), (32, 2), (32, 33), (32, 6), (32, 7), (32, 9), (32, 15), (32, 17), (32, 18), (32, 23), (32, 30), (32, 5), (32, 27), (32, 34), (32, 35), (32, 38), (32, 40), (32, 42), (32, 43), (32, 46), (32, 47), (32, 62), (32, 56), (32, 57), (32, 59), (32, 64), (32, 61), (33, 0), (33, 31), (33, 2), (33, 7), (33, 9), (33, 10), (33, 12), (33, 64), (33, 14), (33, 46), (33, 16), (33, 17), (33, 18), (33, 19), (33, 20), (33, 21), (33, 22), (33, 23), (33, 30), (33, 26), (33, 28), (33, 11), (33, 34), (33, 32), (33, 35), (33, 37), (33, 38), (33, 39), (33, 41), (33, 43), (33, 45), (33, 24), (33, 47), (33, 48), (33, 49), (33, 58), (33, 62), (33, 53), (33, 54), (33, 55), (33, 60), (33, 57), (33, 59), (33, 5), (33, 52), (33, 63), (33, 61), (34, 58), (34, 4), (34, 33), (34, 20), (34, 55), (34, 28), (34, 11), (34, 64), (35, 18), (35, 60), (35, 61), (37, 34), (37, 48), (37, 49), (37, 18), (37, 33), (37, 39), (37, 21), (37, 42), (37, 26), (37, 59), (37, 44), (37, 12), (37, 11), (37, 61), (41, 3), (41, 50), (41, 18), (41, 52), (41, 33), (41, 54), (41, 19), (41, 22), (41, 5), (41, 46), (41, 25), (41, 44), (41, 13), (41, 62), (41, 29), (44, 32), (44, 3), (44, 18), (44, 33), (44, 40), (44, 41), (44, 30), (44, 23), (44, 61), (50, 17), (50, 37), (50, 62), (50, 41), (50, 25), (50, 43), (50, 27), (50, 28), (50, 29), (54, 33), (54, 41), (54, 10), (54, 59), (54, 63), (54, 61), (58, 62), (58, 46), (59, 31), (59, 34), (59, 30), (59, 49), (59, 18), (59, 33), (59, 9), (59, 10), (59, 8), (59, 13), (59, 24), (59, 61), (60, 34), (60, 16), (60, 35), (60, 50), (60, 4), (60, 6), (60, 59), (60, 24), (63, 40), (63, 33), (63, 30), (63, 61), (63, 53)]

my_graph = networkx.DiGraph()
my_graph.add_edges_from(anon_e_list)
r_eig = networkx.eigenvector_centrality(my_graph)
my_graph2 = my_graph.reverse()
l_eig = networkx.eigenvector_centrality(my_graph2)

for nd in my_graph.nodes():
    print 'node: {} indegree: {} outdegree: {} right eig: {} left eig: {}'.format(nd,my_graph.in_degree(nd),my_graph.out_degree(nd),r_eig[nd],l_eig[nd])

1 ответ

Решение

Эти две линии

my_graph2 = my_graph.copy()
my_graph2.reverse()

следует заменить на

my_graph2 = my_graph.reverse()

поскольку метод reverse() по умолчанию возвращает копию графа.

Другие вопросы по тегам