2013-05-10 12 views
9

मैंने अक्सर जटिल आंकड़ों से लंबी-पूंछ की डिग्री वितरण/हिस्टोग्राम का सामना किया है जैसे नीचे दिए गए आंकड़े। वे अच्छी तरह से बहुत भारी और भीड़-भाड़ वाले कई टिप्पणियों से इन पूंछ की भारी अंत बनाने के लिए,:प्लॉटिंग लॉग-पिन नेटवर्क डिग्री वितरण

Classic long-tailed degree distribution

हालांकि, कई प्रकाशनों मैंने पढ़ा है कि के अंत में इस clumpiness नहीं है अधिक स्वच्छ डिग्री वितरण है वितरण और अवलोकन अधिक समान रूप से दूरी पर हैं।

! Classic long-tailed degree distribution

NetworkX और matplotlib का उपयोग करके आप इस तरह के चार्ट कैसे बनाते हैं?

+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

अगर आप इससे खुश हैं तो अपना जवाब स्वीकार करना याद रखें! नोबस के लिए – tacaswell

+0

, एक्स-वाई लेबल क्या हैं? – sAguinaga

+0

एक्स-वाई लेबल हैं: एक्स अक्ष -> नेटवर्क में मिली डिग्री का लॉग; वाई धुरी -> उन डिग्री की आवृत्ति का लॉग। – FaCoffee

संबंधित मुद्दे