2013-05-10 2 views
9

나는 종종 아래 그림과 같은 복잡한 네트워크에서 긴 꼬리도 분포/히스토그램을 만나고 만들었습니다. 그들은 많은 관찰에서 매우 무겁고 혼잡, 이러한 꼬리의 무거운 말을 잘 :로그 - 비닝 된 네트워크 학위 분포도 표시하기

Classic long-tailed degree distribution 그러나

, 내가 읽은 많은 출판물의 끝이 clumpiness이없는 많은 청소기도 분포를 분포와 관측치가보다 균등하게 분포되어있다.

! Classic long-tailed degree distribution

NetworkXmatplotlib을 어떻게 사용하여 차트를 만드나요?

+0

여기서 정확히 질문은 무엇입니까? 이미 원하는 결과를 얻은 것 같습니다. "더 나아지기"보다는 구체적이어야합니다. – Hooked

+2

아무런 문제가 없으며 문제 해결 방법을 공유하고 다른 방법으로 의견을 찾지 못하면 다른 사람들의 의견을 열어 놓을 수 있습니다. –

+0

이렇게하는 것이 더 좋은 방법입니다. 그렇지 않으면 닫을 수 있습니다.이 질문을 해독하여 직접 대답하는 것입니다. http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – Hooked

답변

11

log binning (see also)을 사용하십시오. 다음은 학위 값의 히스토그램을 나타내는 Counter 객체를 취하고 로그 분배를 통해 분산을 더 부드럽게 분배하는 코드입니다.

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

생각을 환영합니다.

+0

만족한다면 자신의 대답을 받아 들여야합니다! noobs 용 – tacaswell

+0

, 여기에 x-y 레이블은 무엇입니까? – sAguinaga

+0

x-y 레이블은 다음과 같습니다. x 축 -> 네트워크에서 발생한 각도의 로그. y 축 -> 해당 각도의 빈도 로그. – FaCoffee