2015-06-29 167 views
1

我想從冪指數分佈(a = -2)的冪律分佈中繪製一個介於2到15之間的隨機變量。我發現以下內容:Python:從冪律分佈生成隨機數

r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000) 

但它並不採用負數。

任何人都知道一條出路?在numpy.randomscipy.stats定義

+0

請嘗試(1/2)。實際上應該是同樣的事情。 –

+4

有人在這裏回答了這個問題:http://stackoverflow.com/questions/17882907/python-scipy-stats-powerlaw-negative-exponent - 如果你從中理解了一些東西。 – Faflok

+0

@RobFoley,我需要檢查它的不同負指數.. -1.5,-2,-3等。因此,我希望如果我能得到更一般的建議:( @Faflok我讀了..但它並沒有幫助我擺脫'a> 0'條件。 – Panchi

回答

9

冪律分佈並不在答案解釋this question數學意義上的負a定義:他們是因爲在零奇不normalizable。所以,不幸的是,數學說'不'。

您可以定義一個pdf的比例爲x^{g-1}g < 0不包含零的區間,如果這就是你以後的分佈。

pdf(x) = const * x**(g-1)a <= x <= b,從一個統一的變量(np.random.random)轉變爲:

In [3]: def rndm(a, b, g, size=1): 
    """Power-law gen for pdf(x)\propto x^{g-1} for a<=x<=b""" 
    ...:  r = np.random.random(size=size) 
    ...:  ag, bg = a**g, b**g 
    ...:  return (ag + (bg - ag)*r)**(1./g) 

然後你就可以做,例如,

In [4]: xx = rndm(1, 2, g=-2, size=10000) 

等。

爲了完整起見,這裏是PDF格式:

In [5]: def pdf(x, a, b, g): 
    ag, bg = a**g, b**g 
    ....:  return g * x**(g-1)/(bg - ag) 

這一切都假定a < bg != 0。對於a=0,b=1g > 0,這些公式應與numpy.powerscipy.stats.powerlaw一致。