2014-07-04 3 views
5

यदि मैं एक छिद्रित पूर्णांक पावर कानून का नमूना देना चाहता हूं तो पायथन में मैं किस फ़ंक्शन का उपयोग कर सकता हूं?पाइथन में एक छोटा सा पूर्णांक पावर कानून नमूना?

है यही कारण है, दो पैरामीटर a और m को देखते हुए सीमा [1,m) कि 1/x^a करने के लिए एक वितरण आनुपातिक इस प्रकार में एक यादृच्छिक पूर्णांक x उत्पन्न करते हैं।

मैं numpy.random के आसपास खोज रहा हूं, लेकिन मुझे यह वितरण नहीं मिला है।

+0

क्यों निर्मित बिजली कानून वितरण के साथ अस्वीकृति नमूना न करें? –

उत्तर

3

AFAIK, न तो NumPy और न ही Scipy आपके लिए इस वितरण को परिभाषित करता है।

import numpy as np 
import scipy.stats as stats 
import matplotlib.pyplot as plt 

def truncated_power_law(a, m): 
    x = np.arange(1, m+1, dtype='float') 
    pmf = 1/x**a 
    pmf /= pmf.sum() 
    return stats.rv_discrete(values=(range(1, m+1), pmf)) 

a, m = 2, 10 
d = truncated_power_law(a=a, m=m) 

N = 10**4 
sample = d.rvs(size=N) 

plt.hist(sample, bins=np.arange(m)+0.5) 
plt.show() 

enter image description here

+0

ऐसा लगता है कि आप pmf को एकीकृत कर रहे हैं जैसे कि यह निरंतर था, और 1 (2) के बीच क्षेत्र को पी (2) के साथ आने के लिए, पी (2) आदि के लिए 2 और 3 के बीच लेना सही है? यदि ऐसा है, तो आपके उदाहरण के लिए मुझे लगता है कि आपको रीढ़ की हड्डी का अनुकरण करने की आवश्यकता है और पी (10) प्राप्त करने के लिए 11 पर जाएं। आपके 'const' को denominator में' (m + 1) ** k' रखने के द्वारा समायोजित किया जाएगा। या मैं गलतफहमी हूँ? – pjs

+0

@pjs: मैं पीडीएफ * निरंतर * फ़ंक्शन '1/x ** ए' होने के लिए ले रहा हूं। इसलिए अंतराल पर कोई एकीकरण नहीं है [1,2], [2,3], आदि। हालांकि, मैंने 'सीडीएफ 'के विपरीत' const' और' _ppf' के सूत्रों को खोजने के लिए (हाथ से) एकीकृत किया है। । मुझे लगता है * मुझे यह सही मिला, लेकिन मैं गलत हो सकता था। (मैंने आपके सुझाव का प्रयास किया है, लेकिन यह डोमेन को '[1, 11]' में बदल देता है, इसलिए यदि मैं आपको सही तरीके से समझ रहा हूं, तो यह मूल सैनिटी चेक पास नहीं करता है।) वैसे, स्पाइनल टैप क्या है यहाँ? – unutbu

+0

स्पाइनल टैप एक भारी धातु बैंड के बारे में एक मॉक्यूमेंटरी फिल्म थी। उन्होंने अपने एम्पलीफायरों को 11 बजे तक अपने बैंड से अलग कर दिया। – pjs

3

मैं अजगर, इसलिए बजाय जोखिम वाक्यविन्यास त्रुटियों का प्रयोग नहीं करते मैं समाधान का वर्णन करने की कोशिश करेंगे: हालांकि, वह SciPy का उपयोग कर इसे scipy.rv_discrete उपयोग कर अपने खुद असतत वितरण समारोह को परिभाषित करने के लिए आसान है एल्गोरिदम रूप से। यह एक क्रूर बल असंगत उलटा है। इसे पाइथन में आसानी से अनुवाद करना चाहिए। मैं सरणी के लिए 0-आधारित अनुक्रमण मान रहा हूँ।

सेटअप:

  1. पहली प्रविष्टि, शेष प्रविष्टियों के लिए cdf[i] = cdf[i-1] + 1/(i+1)**a के रूप में आकार m की एक सरणी cdfcdf[0] = 1 साथ उत्पन्न करें।

  2. प्रत्येक में cdf[m-1] को विभाजित करके सभी प्रविष्टियों को स्केल करें - अब वे वास्तव में सीडीएफ मान हैं।

उपयोग:

  • एक वर्दी (0,1) और cdf[] के माध्यम से खोज पैदा करके आपका यादृच्छिक मान उत्पन्न जब तक आप एक प्रविष्टि अपने वर्दी से अधिक लगता है। इंडेक्स + 1 को अपने x -value के रूप में वापस करें।

जितना चाहें उतने x के लिए दोहराएं।

उदाहरण के लिए, a,m = 2,10 के साथ, मैं संभावनाओं की गणना सीधे रूप में:

[0.6452579827864142, 0.16131449569660355, 0.07169533142071269, 0.04032862392415089, 0.02581031931145657, 0.017923832855178172, 0.013168530260947229, 0.010082155981037722, 0.007966147935634743, 0.006452579827864143] 

और CDF है:

[0.6452579827864142, 0.8065724784830177, 0.8782678099037304, 0.9185964338278814, 0.944406753139338, 0.9623305859945162, 0.9754991162554634, 0.985581272236501, 0.9935474201721358, 1.0] 

है, पैदा करता है, तो मैं 0.90 की एक वर्दी परिणाम मैं वापसी होगी मिला x=4 क्योंकि 0.918 ... मेरी वर्दी से बड़ी सीडीएफ प्रविष्टि बड़ी है।

यदि आप गति के बारे में चिंतित हैं तो आप उपनाम तालिका बना सकते हैं, लेकिन ज्यामितीय क्षय के साथ सरणी के माध्यम से एक रैखिक खोज की प्रारंभिक समाप्ति की संभावना काफी अधिक है। उदाहरण के लिए, उदाहरण के लिए, आप उस समय के लगभग 2/3 पहली चोटी पर समाप्त कर देंगे।

+0

दोह, ओपी का एहसास करने के लिए मुझे केवल दो घंटे (और अपना जवाब पढ़ना) लगा कि * एक * अलग * संभावना वितरण के लिए पूछ रहा है ... – unutbu

+0

यही कारण है कि मैं अलग-अलग मूल्यों को प्राप्त करने के लिए सीमा क्षेत्रों को लेने के बारे में पूछ रहा था। – pjs

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