2013-05-10 23 views
9

Sıklıkla, aşağıdaki şekiller gibi karmaşık ağlardan uzun kuyruk dereceli dağılım/histogramlarla karşılaştım ve yaptım. Pek çok gözlemlerinden çok ağır ve kalabalık, bu kuyruklarının ağır son vermek iyi:Kayıtlı ağ için ağ dağılımı dağılımları

Classic long-tailed degree distribution Ancak

, okuduğum birçok yayın sonunda bu clumpiness yok daha temiz derecesi dağılımları var dağılım ve gözlemler daha eşit aralıklıdır.

! Classic long-tailed degree distribution

NetworkX ve matplotlib ile nasıl bir tablo hazırlıyorsunuz?

+0

Burada tam olarak soru nedir? Aradığın sonucu zaten elde etmiş gibisin. "Daha iyisini yap" dan daha spesifik olmanız gerekecek. – Hooked

+2

Hiçbir sorun, sadece bir problemi nasıl çözdüğümü paylaştığımı ve yaklaşımıma bir şey özlediysem başkalarının geri bildirimlerine açtığını paylaşıyorum. –

+0

Bunu yapmanın daha iyi yolu, aksi halde kapanacak, bunu bir soruya bölmek ve kendinize cevaplamaktır. Http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – Hooked

cevap

11

log binning (see also) kullanın. Dereceli bir histogramı temsil eden Counter nesnesinin kodu ve dağıtımı daha seyrek ve daha pürüzsüz bir dağılım sağlamak için dağıtımı kayıt altına alın.

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 klasik bir ölçek içermeyen ağı oluşturuluyor ve sonra bu komplo:

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() 

mavi "ham" dağıtım ve "Gruplu" dağılımında arasındaki çakışmayı gösteren aşağıdaki grafik üretir kırmızı. Ben belirgin bir şey kaçırmıştım, bu yaklaşımı veya geri bildirimde nasıl geliştirilebileceğine ilişkin

Comparison between raw and log-binned

Düşünceler açıktır.

+0

Eğer mutlu iseniz kendi cevabınızı kabul etmeyi unutmayın! Noobs için – tacaswell

+0

, burada x-y etiketleri nelerdir? – sAguinaga

+0

x-y etiketleri şunlardır: x ekseni -> ağda karşılaşılan derecelerin günlüğü; y ekseni -> bu derecelerin frekansının günlüğü. – FaCoffee