2009-05-28 23 views
26

मैं एक सी ++ कमांड लाइन लिनक्स ऐप के लिए कुछ परीक्षण लिख रहा हूं। मैं एक पावर-लॉ/लंबी पूंछ वितरण के साथ पूर्णांक का एक गुच्छा उत्पन्न करना चाहता हूं। मतलब, मुझे कुछ संख्याएं अक्सर मिलती हैं लेकिन उनमें से अधिकतर अपेक्षाकृत कम होती हैं।यादृच्छिक संख्या जेनरेटर जो पावर-लॉ वितरण का उत्पादन करता है?

आदर्श रूप से कुछ जादू समीकरण होंगे जो मैं रैंड() या stdlib यादृच्छिक कार्यों में से एक के साथ उपयोग कर सकता हूं। यदि नहीं, तो सी/सी ++ का उपयोग करने में आसान एक बहुत अच्छा होगा।

धन्यवाद!

उत्तर

34

यह page at Wolfram MathWorld चर्चा करता है कि एक समान वितरण से पावर-लॉ वितरण कैसे प्राप्त किया जाता है (जो कि सबसे यादृच्छिक संख्या जनरेटर प्रदान करता है)।

संक्षिप्त उत्तर (ऊपर के लिंक पर व्युत्पत्ति):

x = [(x1^(n+1) - x0^(n+1))*y + x0^(n+1)]^(1/(n+1)) 

जहां y एक समान variate है, n वितरण शक्ति है, x0 और x1 की सीमा को परिभाषित वितरण, और x आपके पावर-लॉ वितरित विविधता है।

+0

क्या यह कार्य 0 और अनंतता के समय काम करता है? – Peaceful

+1

छोटे अतिरिक्त विवरण: ** वाई ** [0,1] रेंज में एक समान भिन्नता है। –

+0

dmckee का उत्तर गायब संदर्भ प्रदान करता है जो वोल्फ्राम आलेख में व्युत्पन्न को समझने के लिए जरूरी है। – SigmaX

18

यदि आप जो वितरण चाहते हैं उसे जानते हैं (जिसे संभाव्यता वितरण फ़ंक्शन (पीडीएफ) कहा जाता है) और इसे उचित रूप से सामान्यीकृत किया गया है, तो आप संचयी वितरण फ़ंक्शन (सीडीएफ) प्राप्त करने के लिए इसे एकीकृत कर सकते हैं, फिर सीडीएफ (यदि संभव हो) को उलटा कर सकते हैं वांछित [0,1] वितरण से आपकी वांछित रूपांतरण को प्राप्त करें।

तो आप जो वितरण चाहते हैं उसे परिभाषित करके शुरू करते हैं।

P = F(x) 

तो एकीकृत

C(y) = \int_0^y F(x) dx 

देने के लिए (में [0,1] एक्स के लिए) इस आप

y = F^{-1}(C) 

मिलता तो rand() फोन और में परिणाम प्लग उल्टे किया जा सकता है अंतिम पंक्ति में C और वाई का उपयोग करें।

इस परिणाम को नमूनाकरण का मौलिक प्रमेय कहा जाता है। सामान्यीकरण आवश्यकता और फ़ंक्शन को विश्लेषणात्मक रूप से उलटा करने की आवश्यकता के कारण यह एक परेशानी है।

वैकल्पिक रूप से आप एक अस्वीकृति तकनीक का उपयोग कर सकते हैं: वांछित सीमा में समान संख्या को फेंक दें, फिर एक और संख्या फेंक दें और अपने पहले फेंक द्वारा स्थानांतरित स्थान पर पीडीएफ की तुलना करें। अस्वीकार करें कि दूसरा फेंक पीडीएफ से अधिक है। पीडीएफ के लिए बहुत कम संभावना वाले क्षेत्र के साथ पीड़ितों के लिए अक्षम रहता है, जैसे लंबी पूंछ वाले ...

एक मध्यवर्ती दृष्टिकोण में सीआरएफ को ब्रूट फोर्स द्वारा परिवर्तित करना शामिल है: आप सीडीएफ को लुकअप टेबल के रूप में स्टोर करते हैं, और एक रिवर्स करते हैं परिणाम प्राप्त करने के लिए देखो।


यहाँ असली बदमाश कि सरल x^-n वितरण रेंज [0,1] पर गैर normalizable हैं, तो आप नमूना प्रमेय का उपयोग नहीं कर सकते हैं। कोशिश करें (x + 1)^- n इसके बजाय ...

3

मैं बिजली कानून वितरण (अन्य पदों के सुझाव देने के लिए आवश्यक गणित पर टिप्पणी नहीं कर सकता) लेकिन मैं सुझाव दूंगा कि आप <random> में TR1 C++ मानक लाइब्रेरी यादृच्छिक संख्या सुविधाओं के साथ स्वयं को परिचित करें। ये std::rand और std::srand से अधिक कार्यक्षमता प्रदान करते हैं। नई प्रणाली जनरेटर, इंजन और वितरण के लिए एक मॉड्यूलर एपीआई निर्दिष्ट करती है और प्रीसेट का एक गुच्छा प्रदान करती है।

शामिल वितरण प्रीसेट हैं:

  • uniform_int
  • bernoulli_distribution
  • geometric_distribution
  • poisson_distribution
  • binomial_distribution
  • uniform_real
  • exponential_distribution
  • normal_distribution
  • gamma_distribution

जब आप अपनी शक्ति कानून वितरण परिभाषित करते हैं, आप इसे मौजूदा जनरेटर और इंजन के साथ में प्लग करने के लिए सक्षम होना चाहिए। पुस्तक सी ++ मानक लाइब्रेरी एक्सटेंशन पीट बेकर द्वारा <random> पर एक महान अध्याय है।

कैसे अन्य वितरण (कॉची, ची-वर्ग, छात्र टी और स्नेडेकोर एफ के लिए उदाहरण के साथ) बनाने के लिए के बारे में Here is an article

1

मैं बस (हक) स्वीकार किए जाते हैं जवाब देने के लिए एक पूरक के रूप में एक वास्तविक अनुकरण बाहर ले जाने के लिए चाहते थे । हालांकि आर में, कोड इतना आसान है (छद्म) - छद्म कोड। स्वीकार किए जाते हैं जवाब और अन्य में Wolfram MathWorld formula के बीच

एक छोटे अंतर, शायद अधिक आम, समीकरणों तथ्य यह है कि बिजली कानून प्रतिपादकn (जो आमतौर पर अल्फा के रूप में निरूपित किया जाता है) एक स्पष्ट ऋणात्मक चिह्न नहीं होता है। तो चुना गया अल्फा मान नकारात्मक होना चाहिए, और आम तौर पर 2 और 3.

x0 और x1 वितरण की निचली और ऊपरी सीमाओं के लिए खड़ा होना चाहिए।

तो यहाँ यह है:

x1 = 5   # Maximum value 
x0 = 0.1   # It can't be zero; otherwise X^0^(neg) is 1/0. 
alpha = -2.5  # It has to be negative. 
y = runif(1e5) # Number of samples 
x = ((x1^(alpha+1) - x0^(alpha+1))*y + x0^(alpha+1))^(1/(alpha+1)) 
hist(x, prob = T, breaks=40, ylim=c(0,10), xlim=c(0,1.2), border=F, 
col="yellowgreen", main="Power law density") 
lines(density(x), col="chocolate", lwd=1) 
lines(density(x, adjust=2), lty="dotted", col="darkblue", lwd=2) 

enter image description here

या लघुगणकीय पैमाने में साजिश रची:

012,351:

h = hist(x, prob=T, breaks=40, plot=F) 
    plot(h$count, log="xy", type='l', lwd=1, lend=2, 
    xlab="", ylab="", main="Density in logarithmic scale") 

enter image description here

यहां डेटा के सारांश है

> summary(x) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
    0.1000 0.1208 0.1584 0.2590 0.2511 4.9388 
+0

यह सुनिश्चित नहीं है कि आप कहते हैं कि एक्सपोनेंट -2 और -3 के बीच होना चाहिए (मैंने सोचा था कि प्रकृति में असुरक्षित बिजली कानूनों के वितरण में 1 और 2 के बीच अल्फा था) लेकिन आर कोड की लाइन के लिए धन्यवाद! –

+1

@ सिमोनसी। मुझे इसे [इस पेपर के पेज 4 बाएं कॉलम] से मिला है (http://www-personal.umich.edu/~mejn/courses/2006/cmplxsys899/powerlaws.pdf)। संकेत हमेशा ऋणात्मक होगा (और अल्फा को सकारात्मक मान के रूप में व्यक्त किया जाता है जब सूत्र में ऋण चिह्न होता है)। – Toni

+0

हो हाँ क्षमा करें, मैं नकारात्मक संकेत के लिए पूरी तरह से सहमत हूं, मैं सिर्फ यह पूछ रहा था कि अल्फा को [-2, -3] क्यों सीमित करें। –

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

  • कोई संबंधित समस्या नहीं^_^