我想比较一下信息在这两个网络中的传播方式
为此,您可以使用efficiency(“网络的效率是衡量它交换信息效率的标准”)。
您可以在 networkx 中将其计算为 1/L,其中 L 是 average shortest path length。
在下面的代码中,G 是无标度图(使用scale_free_graph 生成),H 是随机图(使用gnp_random_graph 生成)。请注意,两个图具有相同数量的节点(200);这样它们就更具可比性。
import networkx as nx
G = nx.scale_free_graph(200)
H = nx.gnp_random_graph(200, 0.5)
print("Efficiency for G:", 1.0/nx.average_shortest_path_length(G))
print("Efficiency for H:", 1.0/nx.average_shortest_path_length(H))
每次运行代码时,下面的输出都会有所不同(图表是随机生成的)。您可以创建多个无标度/随机图,获取它们的平均效率,然后比较这些值。
Efficiency for G: 3.67192545437771
Efficiency for H: 0.6666890013065765
在比较图表时,您当然也可以使用其他网络度量,例如average clustering等
现在,你标题中的问题。
如何比较无标度网络和随机网络?
我认为显示无标度网络和随机网络之间差异的最直观方法是绘制(排序/排序的)节点度数。
从下图中你可以立即猜出哪个是无标度网络,哪个是随机网络。
我得到了带有以下代码的图像(G 和 H 是之前的图表)。
import matplotlib.pyplot as plt
degree_sequence = sorted(nx.degree(G).values(), reverse=True)
plt.plot(degree_sequence, 'b-')
degree_sequence = sorted(nx.degree(H).values(), reverse=True)
plt.plot(degree_sequence, 'r-')
plt.ylabel("degree")
plt.xlabel("rank")
plt.show()
您当然会得到稍微不同的图像,因为节点度数 (degree_sequence) 取决于随机生成的图形。
最后一个提示:如果您要绘制多个无标度图,请考虑使用对数图。