В статье под названием Масштабирование степенных корреляций и ее влияние на диффузию в сетях без масштаба авторы определяют величину $E_b (k) $для измерения степени корреляций степени.
Бумага
л. К. Галлос, С. Сонг и Х. А. Максе, Масштабирование степенных корреляций и его влияние на диффузию в свободных масштабах сетей, Phys. Rev. Lett. 100, 248701 (2008).
Вы можете прочитать статью, следующую за эту ссылку или прочитать связанный google книга.
Вопрос
Мой вопрос заключается в том, как вычислить Eb (k) сетей с Python? Моя проблема в том, что я не могу воспроизвести результаты авторов. Я тестирую его с использованием данных Condense Matter. Результат Eb (k) показан на рисунке выше. Вы можете видеть, что одна проблема на моей фигуре - это Eb (k) намного больше, чем 1!!! Я также пробовал Интернет (как данные уровня) и данные WWW, и проблема сохраняется. Несомненно, в моем алгоритме или коде есть что-то серьезное. Вы можете воспроизвести мои результаты и сравнить их с авторами. Ваше решение или предложение получили высокую оценку. Я представлю свой алгоритм и python script ниже.
Я выполняю следующие шаги:
- Для каждого ребра найти ребра, k = k, k ' > 3k. Вероятность этих ребер обозначается как P (k, k ')
- Для node, чтобы получить долю узлов, степень которых больше b * k, что обозначается как p (k '), таким образом, мы можем также иметь k' * p (k ')
- Чтобы получить числитель P1: p1 =\sum P (k, k ')/k' * P (k ')
- Чтобы получить знаменатель p2: P2 =\sum P (k ')
- Eb (k) = p1/p2
Python script
Питон script приведен ниже:
%matplotlib inline
import networkx as nx
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from collections import defaultdict
def ebks(g, b):
edge_dict = defaultdict(lambda: defaultdict(int))
degree_dict = defaultdict(int)
edge_degree = [sorted(g.degree(e).values()) for e in g.edges()]
for e in edge_degree:
edge_dict[e[0]][e[-1]] +=1
for i in g.degree().values():
degree_dict[i] +=1
edge_number = g.number_of_edges()
node_number = g.number_of_nodes()
ebks, ks = [], []
for k1 in edge_dict:
p1, p2 = 0, 0
for k2 in edge_dict[k1]:
if k2 >= b*k1:
pkk = float(edge_dict[k1][k2])/edge_number
pk2 = float(degree_dict[k2])/node_number
k2pk2 = k2*pk2
p1 += pkk/k2pk2
for k in degree_dict:
if k>=b*k1:
pk = float(degree_dict[k])/node_number
p2 += pk
if p2 > 0:
ebks.append(p1/p2)
ks.append(k1)
return ebks, ks
Я тестирую данные ca-CondMat, вы можете скачать его с этого URL: http://snap.stanford.edu/data/ca-CondMat.html
# Load the data
# Remember to change the file path to your own
ca = nx.Graph()
with open ('/path-of-your-file/ca-CondMat.txt') as f:
for line in f:
if line[0] != '#':
x, y = line.strip().split('\t')
ca.add_edge(x,y)
nx.info(ca)
#calculate ebk
ebk, k = ebks(ca, b=3)
plt.plot(k,ebk,'r^')
plt.xlabel(r'$k$', fontsize = 16)
plt.ylabel(r'$E_b(k)$', fontsize = 16)
plt.xscale('log')
plt.yscale('log')
plt.show()
Обновление: проблема еще не решена.
def ebkss(g, b, x):
edge_dict = defaultdict(lambda: defaultdict(int))
degree_dict = defaultdict(int)
edge_degree = [sorted(g.degree(e).values()) for e in g.edges()]
for e in edge_degree:
edge_dict[e[0]][e[-1]] +=1
for i in g.degree().values():
degree_dict[i] +=1
edge_number = g.number_of_edges()
node_number = g.number_of_nodes()
ebks, ks = [], []
for k1 in edge_dict:
p1, p2 = 0, 0
nk2k = np.sum(edge_dict[k1].values())
pk1 = float(degree_dict[k1])/node_number
k1pk1 = k1*pk1
for k2 in edge_dict[k1]:
if k2 >= b*k1:
pk2k = float(edge_dict[k1][k2])/nk2k
pk2 = float(degree_dict[k2])/node_number
k2pk2 = k2*pk2
p1 += (pk2k*k1pk1)/k2pk2
for k in degree_dict:
if k>=b*k1:
pk = float(degree_dict[k])/node_number
p2 += pk
if p2 > 0:
ebks.append(p1/p2**x)
ks.append(k1)
return ebks, ks