给定一个无向的NetworkX图graph,我想要检查它是否是无标度的。为了做到这一点,我需要找到每个节点的度k以及整个网络中该度数P(k)的频率。由于度数和频率之间的关系,这应该表示一个幂律曲线。我的计算结果显示P(k)和k的图像呈现出预期的幂律曲线,但是当我对其进行双对数处理时,没有绘制出一条直线。以下图像是使用1000个节点获得的。
{{m}}代表缩放系数,如果其在2到3之间,则该网络应该是无标度的。
通过调用NetworkX的scale_free_graph方法获取图形,然后将其用作Graph构造函数的输入来获得这些图形。
更新 根据@Joel的请求,以下是10000个节点的绘图。此外,生成图形的确切代码如下: graph = networkx.Graph(networkx.scale_free_graph(num_of_nodes))
可见,很多值似乎形成一条直线,但是该网络在对数-对数形式中有一个奇怪的尾巴。
代码如下:
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))
可见,很多值似乎形成一条直线,但是该网络在对数-对数形式中有一个奇怪的尾巴。
k
值的增加,它变得更加模糊,这污染了我的图表,因此也影响了缩放系数的计算。 - Mox