nx.draw_networkx(g, pos=layout, )
Самая оцевидная центральность - просто степень узла. Характеризует некоторую популярность узла (много друзей, много связей).
$$ C_d(i) = k(i) = \sum_jA_{ij} = \sum_iA_{ij}$$$$ \bar{C}_d(i) = \frac{1}{n-1} C_d(i)$$Существует обобщение на ориентированные (prestige) и взвешенные сети.
nx.draw_networkx(g, pos=layout, node_size=degr)
degr_cent
{0: 0.4, 1: 0.4, 2: 0.4, 3: 0.6000000000000001, 4: 0.4, 5: 0.2}
Центральность, основанная на расстоянии до остальных вершин в графе.
$$ C_{cl}(i) = \frac{1}{\sum_j d(i,j)} $$$$ \bar{C}_{cl}(i) = (n-1) \cdot C_{cl}(i) $$Актор, расположенный в центре сети может быстро добраться до остальных акторов. Акторы на периферии расположены дальше.
Вопрос: что будет, если граф окажется несвязным?
nx.draw_networkx(g, pos=layout, node_size=closeness_nodes_values)
closeness_nodes
{0: 0.45454545454545453, 1: 0.5555555555555556, 2: 0.5555555555555556, 3: 0.7142857142857143, 4: 0.5555555555555556, 5: 0.38461538461538464}
Пусть $\sigma_{st}$ - количество кратчайших путей между вершинами $s$ и $t$, а $\sigma_{st}(i)$ - кр. пути между $v_s$ и $v_t$, которые проходят через вершину $v_i$.
Тогда $$ C_b(i) = \sum\limits_{s\neq t\neq i} \frac{\sigma_{st}(i)}{\sigma_{st}} $$
$$ \bar{C}_b(i) = \frac{2}{(n-1)(n-2)}C_b(i) $$nx.draw_networkx(g, pos=layout, node_size=betw_nodes_values)
betw_nodes
{0: 0.05, 1: 0.15000000000000002, 2: 0.15000000000000002, 3: 0.65, 4: 0.4, 5: 0.0}
Betweenness также можно расчитывать для ребер! Давайте определим для каких ребер она наибольшая и что это может нам дать?
nx.draw_networkx(g, pos=layout)
df.sort_values('betw', ascending=False, )
source | target | betw | |
---|---|---|---|
4 | 3 | 4 | 0.533333 |
2 | 1 | 3 | 0.333333 |
3 | 2 | 3 | 0.333333 |
5 | 4 | 5 | 0.333333 |
0 | 0 | 1 | 0.200000 |
1 | 0 | 2 | 0.200000 |
Идея PageRank заключается в попытке описать блуждание по вершинам графа. Вероятность перехода в вершину $v_i$ обратнопропорциональна степеням входящих связанных с ней вершин.
$$p^{t+1} = (D^{-1}A)^\top p^t = P^\top p^t$$Помимо случайного блуждания между соседними вершинами заложен механизм "телепорта" между случайными вершинами с вероятностью $1-\alpha$.
$$ \mathbb{P} = \alpha P + \frac{(1 - \alpha)}{n} E,$$где $E$ - это матрица состоящая из единиц.
Вектор Page Rank является одним из решений задачи на поиск собственного числа матрицы $\mathbb{P}$
$$\mathbb{P}^\top p = \lambda p$$nx.draw_networkx(g, pos=layout, node_size=pr)
pr_nodes
{0: 0.16195310432472196, 1: 0.16112205885619568, 2: 0.16112205885619568, 3: 0.2375, 4: 0.17775588228760858, 5: 0.10054689567527803}
Eccentricity - максимальная длина кратчайшего пути из вершины $i$ до всех остальных вершин $e(i) = \max\limits_j d(i, j)$.
Диаметр - $\max e(i)$
Радиус - $\min e(i)$
Центральными вершинами являются те, у которых $e(i)$ равна радиусу графа
print(nx.radius(g))
print(nx.diameter(g))
2 4
nx.draw_networkx(g, pos=layout)
nx.draw_networkx(g, pos=layout, node_size=ecc)
ecc_nodes
{0: 4, 1: 3, 2: 3, 3: 2, 4: 3, 5: 4}
Доля "треугольников" в среди соседей вершины.
nx.draw_networkx(g, pos=layout)
g.add_edge(1,2)
nx.draw_networkx(g, pos=layout)
nx.triangles(g)
{0: 1, 1: 2, 2: 2, 3: 1, 4: 0, 5: 0}
nx.transitivity(g) # доля наблюдаемых треугольников от числа всевозможных
0.5454545454545454
Eсли сеть состоит из нескольких множеств узлов с многочисленными и насыщенными внутренними связями и редкими исходящими связями, то говорят, что данная сеть имеет структуру сообществ (community structure).
Примеры:
В настоящее время, нет общепринятого определения сообщества в сетевом анализе
Понятие "эквивалетности" вершин можно ославить до "схожести" вершин - некоторая мера структурной близости вершин.
Наиболее распространенные практиеские применения мер сходства:
Иерархическую кластеризацию!
Как и в "табличной" кластеризации, качество community detection можно оценить и без ground truth. Для этого считают так называемые scoring functions.
Чего бы нам хотелось получить от выявленного сообщества (разбиения на сообщества):
В статье можно найти наиболее полный набор так называемых scoring functions
nx.draw(g3, pos=m_layout, node_color=mod_labeling)
nx.draw(g3_random, pos=m_layout, node_color=mod_labeling)
где
Какова область значения модулярности?
Пусть
nx.draw_spring(g_test, node_color=list(categ.values()))
nx.assortativity.attribute_assortativity_coefficient(g_test, 'categ')
1.0
nx.draw(g_test, node_color=list(categ.values()))
nx.assortativity.attribute_assortativity_coefficient(g_test, 'categ')
-1.0
Как не странно, определяется аналогично
Пусть