Barabasi-Albert model, wrong degree exponent

萝らか妹 提交于 2019-12-10 11:09:18

问题


I'm trying to generate a scale-free network using the Barabasi-Albert model. The model predicts a degree distribution that follows p(k) ~ k^-3 but mine shows k^-2.

The algorithm was taken from Barabasi's book at this URL: http://barabasi.com/networksciencebook, here is the relevant paragraph:

Barabasi's algorithm

Here is my code, could someone please help me figure out what is wrong?

import numpy as np
import matplotlib.pyplot as plt
from collections import Counter
plt.rcParams["figure.figsize"] = (15,6)

#initialize values
N = 10000
k = 2
m = int(k / 2)

#initialize matrices
adjacency = np.zeros((N,N))
degrees = np.zeros(N)

#add links
for i in range(N):
    degrees[i] = m
    for c in range(m):
        # choose a node with probability proportional to it's degree
        j = np.random.choice(N, p = degrees / (2 * m * i + m + c))
        degrees[j] += 1
        adjacency[i][j] += 1
        adjacency[j][i] += 1


def get_binned_data(labels, values, num):
    min_label, max_label = min(labels), max(labels)
    base = (max_label / min_label) ** (1 / num)
    bins = [base**i for i in range(int(np.log(max_label) / np.log(base)) + 1)]
    binned_values, binned_labels = [], []
    counter = 0
    for b in bins:
        bin_size = 0
        bin_sum = 0
        while counter < len(labels) and labels[counter] <= b:
            bin_size += values[counter]
            bin_sum += values[counter] * labels[counter]
            counter += 1
        if(bin_size):
            binned_values.append(bin_size)
            binned_labels.append(bin_sum / bin_size)
    return binned_labels, binned_values


labels, values = zip(*sorted(Counter(degrees).items(), key = lambda pair: 
pair[0]))

binned_labels, binned_values = get_binned_data(labels, values, 15)

fig, (ax1, ax2) = plt.subplots(ncols = 2, nrows = 1)
fig.suptitle('Barabasi-Albert Model',fontsize = 25)

ax1.loglog(binned_labels, binned_values, basex = 10, basey = 10, linestyle = 
'None', marker = 'o',  color = 'red')
ax1.set(xlabel = 'degree', ylabel = '# of nodes')
ax1.set_title('log-log scale (log-binned)',{'fontsize':'15'})

ax2.plot(labels, values, 'ro')
ax2.set(xlabel = 'degree', ylabel = '# of nodes')
ax2.set_title('linear scale',{'fontsize':'15'})

plt.show()

回答1:


Your code does not run (probabilities in np.random.choice do not sum to 1). Why not p = degrees/np.sum(degrees)?

According to Wikipedia, you need to start with some already connected nodes, whereas you start from nothing. Also, you should probably put degrees[i] = m after the inner loop to avoid forming links from node i to itself.

This might help, but it's not clear to me how you generate your degree plot, so I can't verify it.



来源:https://stackoverflow.com/questions/47922737/barabasi-albert-model-wrong-degree-exponent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!