#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. Большое вам спасибо!