给定一个无向 NetworkX Graph graph
,我想检查它是否是无标度的。
为此,据我了解,我需要找到k
每个节点的度数,以及该度数P(k)
在整个网络中的频率。由于度数的频率与度数本身之间的关系,这应该表示幂律曲线。
绘制我对 P(k) 和 k 的计算会按预期显示功率曲线,但是当我对其进行双重记录时,不会绘制直线。
以下图是使用 1000 个节点获得的。
代码如下:
k = []
Pk = []
for node in list(graph.nodes()):
degree = graph.degree(nbunch=node)
try:
pos = k.index(degree)
except ValueError as e:
k.append(degree)
Pk.append(1)
else:
Pk[pos] += 1
# get a double log representation
for i in range(len(k)):
logk.append(math.log10(k[i]))
logPk.append(math.log10(Pk[i]))
order = np.argsort(logk)
logk_array = np.array(logk)[order]
logPk_array = np.array(logPk)[order]
plt.plot(logk_array, logPk_array, ".")
m, c = np.polyfit(logk_array, logPk_array, 1)
plt.plot(logk_array, m*logk_array + c, "-")
m
应该代表缩放系数,如果它在 2 到 3 之间,那么网络应该是无标度的。
这些图是通过调用 NetworkX 的 scale_free_graph 方法获得的,然后将其用作 Graph 构造函数的输入。
更新
根据@Joel 的要求,下面是 10000 个节点的图。
此外,生成图形的确切代码如下:
graph = networkx.Graph(networkx.scale_free_graph(num_of_nodes))
正如我们所看到的,大量的值似乎确实形成了一条直线,但网络似乎在其双对数形式中有一条奇怪的尾巴。