gpt4 book ai didi

python - 绘制对数分级网络度分布

转载 作者:太空狗 更新时间:2023-10-29 20:17:10 25 4
gpt4 key购买 nike

我经常遇到并从复杂的网络中制作长尾度分布/直方图,如下图所示。从许多观察来看,它们使这些尾部的重端非常重且拥挤:

Classic long-tailed degree distribution

但是,我读过的许多出版物都有更清晰的度数分布,在分布的末端没有这种团 block ,而且观察结果分布更均匀。

! Classic long-tailed degree distribution

如何使用 NetworkXmatplotlib 制作这样的图表?

最佳答案

使用log binning (see also)。以下代码采用表示度值直方图的 Counter 对象并对分布进行 log-bin 以生成更稀疏和更平滑的分布。

import numpy as np
def drop_zeros(a_list):
return [i for i in a_list if i>0]

def log_binning(counter_dict,bin_count=35):

max_x = log10(max(counter_dict.keys()))
max_y = log10(max(counter_dict.values()))
max_base = max([max_x,max_y])

min_x = log10(min(drop_zeros(counter_dict.keys())))

bins = np.logspace(min_x,max_base,num=bin_count)

# Based off of: http://stackoverflow.com/questions/6163334/binning-data-in-python-with-scipy-numpy
bin_means_y = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.values())[0] / np.histogram(counter_dict.keys(),bins)[0])
bin_means_x = (np.histogram(counter_dict.keys(),bins,weights=counter_dict.keys())[0] / np.histogram(counter_dict.keys(),bins)[0])

return bin_means_x,bin_means_y

NetworkX 中生成一个经典的无标度网络,然后绘制它:

import networkx as nx
ba_g = nx.barabasi_albert_graph(10000,2)
ba_c = nx.degree_centrality(ba_g)
# To convert normalized degrees to raw degrees
#ba_c = {k:int(v*(len(ba_g)-1)) for k,v in ba_c.iteritems()}
ba_c2 = dict(Counter(ba_c.values()))

ba_x,ba_y = log_binning(ba_c2,50)

plt.xscale('log')
plt.yscale('log')
plt.scatter(ba_x,ba_y,c='r',marker='s',s=50)
plt.scatter(ba_c2.keys(),ba_c2.values(),c='b',marker='x')
plt.xlim((1e-4,1e-1))
plt.ylim((.9,1e4))
plt.xlabel('Connections (normalized)')
plt.ylabel('Frequency')
plt.show()

生成以下图,显示蓝色“原始”分布和红色“分级”分布之间的重叠。

Comparison between raw and log-binned

如果我遗漏了一些明显的东西,欢迎提出关于如何改进此方法的想法或反馈。

关于python - 绘制对数分级网络度分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com