python: Как получить второй момент распределения степеней по NetworkX

#python #graph #networkx #social-networking

#python #График #networkx #социальные сети

Вопрос:

Как я могу получить второй момент (<k^ 2>) распределения степеней неориентированного графа по NetworkX?

Комментарии:

1. суммируйте k ^ 2 по всем узлам, а затем разделите на количество узлов.

2. Это второй момент графика? Есть ли какая-либо разница между типами сетей? Спасибо @Joel

Ответ №1:

Я не уверен, что вы уже нашли ответ, но вот отличная документация по сетевой науке.

Для вашего вопроса, в частности, проверьте главу 4, раздел: «Значение без масштабирования«:

Уравнение

Как указано в комментариях, 2-й момент может быть вычислен путем деления суммы квадратов степеней на количество узлов (при условии, что каждый узел существует только один раз и все имеют одинаковую вероятность).

Вот обобщенная форма этого вычисления для вычисления n_th момента:

 def nth_moment(g,n):
    s = 0
    for node in g.nodes:
        s  = g.degree[node] ** n
    return (s/len(g))
  

Пример использования функции для вычисления второго момента:

 some_graph = nx.barabasi_albert_graph(10000, 2, seed=1)
print(nth_moment(some_graph, 2))
  

Быстрее — Numpy

 import numpy as np
import networkx as nx

g = nx.barabasi_albert_graph(10000, 2, seed=1)
def nth_moment_v2(g,n):
    degree_np = np.array(list(dict(g.degree).values()))
    return (sum(degree_np**n)/len(g))
  

Раз:

 st = time.time()         
print(nth_moment(g,2))
print(time.time()-st)

st = time.time()          
print(nth_moment_v2(g,2))
print(time.time()-st)
  

58.3626
0.017042160034179688
58.3626
0.005998849868774414

Комментарии:

1. Очень хороший и подробный ответ. Это должно быть принятым ответом.