Networkx — получить вероятность p (k) из сети

#networkx #probability-distribution

#networkx #распределение вероятности

Вопрос:

Я построил гистограмму network (фрейма данных) с количеством подключений к узлам ‘k’, например:

 import seaborn as sns

parameter ='k'
sns.histplot(network[parameter])
 

введите описание изображения здесь

Но теперь мне нужно создать модульный случайный граф, используя вышеуказанное групповое распределение с:

 from networkx.generators.community import random_partition_graph

random_partition_graph(sizes, p_in, p_out, seed=None, directed=False)
 

И вместо подсчета мне нужно это значение p(k) , которое должно быть передано как p_in .

 p_in (float)
probability of edges with in groups
 

Как мне получить p(k) из моего network ?

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

1. Должен ли случайный граф быть a random_partition_graph ? Похоже, вы могли бы получить желаемый результат, используя один из случайных графиков, перечисленных здесь .

2. Я не знаю. У меня есть две сети, и мне нужно спроецировать соединения из одной в другую, используя некоторую вероятность p. Но на самом деле мне нужно вывести вероятность из моего РЕАЛЬНОГО распределения графа.

3. Если у вас есть число со степенью k , затем разделите это на размер популяции, и вы получите вероятность того, что случайный узел имеет степень k .

Ответ №1:

Вот как я бы справился с тем, что вы описали. Во-первых, вы можете нормализовать свою гистограмму таким образом, чтобы интеграл от гистограммы был равен 1. Это можно сделать weights , соответствующим образом установив аргумент вашей гистограммы. Затем эту гистограмму можно считать распределением вероятностей ваших степеней. Теперь, когда у вас есть это распределение вероятностей, то есть список вероятностей ( deg_prob в коде), вы можете произвольно выбирать из него, используя np.random.choice(np.arange(np.amin(degrees),np.amax(degrees) 1), p=deg_prob, size=N_sampling) . Из этой случайной выборки вы можете затем создать случайную expected_degree_graph , просто передав свои выборки в w аргумент. Затем вы можете сравнить распределение степеней вашего исходного графика с распределением из вашего случайного графика.

Смотрите ниже код и более подробную информацию:

 import networkx as nx
from networkx.generators.random_graphs import binomial_graph
from networkx.generators.degree_seq import expected_degree_graph
import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()

N_nodes=1000
G=binomial_graph(n=N_nodes, p=0.01, seed=0) #Creating a random graph as data
degrees = np.array([G.degree(n) for n in G.nodes()])#Computing degrees of nodes
bins_val=np.arange(np.amin(degrees),np.amax(degrees) 2) #Bins

deg_prob,_,_=plt.hist(degrees,bins=bins_val,align='left',weights=np.ones_like(degrees)/N_nodes,
                      color='tab:orange',alpha=0.3,label='Original distribution')#Histogram

#Sampling from distribution
N_sampling=500
random_sampling=np.random.choice(np.arange(np.amin(degrees),np.amax(degrees) 1), p=deg_prob, size=N_sampling)

#Creating random graph from samples
G_random_sampling=expected_degree_graph(random_sampling,seed=0,selfloops=False)
degrees_random_sampling = np.array([G_random_sampling.degree(n) for n in G_random_sampling.nodes()])

deg_prob_random_sampling,_,_=plt.hist(degrees_random_sampling,bins=bins_val,align='left',
                                      weights=np.ones_like(degrees_random_sampling)/N_sampling,color='tab:blue',label='Sample distribution',alpha=0.3)

#Plotting both histograms
plt.xticks(bins_val)
plt.xlabel('degree')
plt.ylabel('Prob')
plt.legend()
plt.show()
 

Затем вывод выдает:

введите описание изображения здесь

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

1. Большое вам спасибо!