2013-07-26 65 views
3

我想爲scipy.stats.powerlaw例程提供一個負指數,例如, A = -1.5,以繪製隨機樣本:python scipy.stats.powerlaw負指數

""" 
powerlaw.pdf(x, a) = a * x**(a-1) 
""" 

from scipy.stats import powerlaw 
R = powerlaw.rvs(a, size=100) 

爲什麼是a> 0時所需的,如何可以爲了生成隨機樣品提供負一,以及如何可以提供歸一化係數/變換,即

PDF(x,C,a) = C * x**a 

的文檔是在這裏

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.powerlaw.html

謝謝!

編輯:我要補充一點,我試圖複製IDL的RANDOMP功能:

http://idlastro.gsfc.nasa.gov/ftp/pro/math/randomp.pro

回答

5

一個PDF,集成在其領域,必須等於一個。換句話說,概率密度函數曲線下的面積必須等於1。

In [36]: import scipy.integrate as integrate 
In [40]: y, err = integrate.quad(lambda x: 0.5*x**(-0.5), 0, 1) 

In [41]: y 
Out[41]: 0.9999999999999998 # The integral is close to 1 

的冪密度函數具有從0 < = X < = 1域在此領域中,x**b積分是有限任何b> -1。當b較小時,x**bx = 0附近爆炸太快。所以當b <= -1時它不是一個有效的概率密度函數。

In [38]: integrate.quad(lambda x: x**(-1), 0, 1) 
UserWarning: The maximum number of subdivisions (50) has been achieved... 
# The integral blows up 

因此,對於x**(a-1)a必須滿足a-1 > -1或等同地,a > 0

a * x**(a-1)第一個常量a是標準化常數這使得a * x**(a-1)上的積分域[0,1]等於1。所以你不要去選擇a此無關的常數。

現在,如果將域更改爲距離0的可測量距離,那麼可以,您可以爲a定義格式爲C * x**a的PDF。但是你必須說明你想要的域名,我認爲目前還沒有可用的scipy.stats PDF。

+0

到了最後一部分:使用正位置'loc'我們可以移動的分佈。隨後從這個解釋中可以看出,對'a'的限制可以作爲位置'loc'的函數來放鬆。應該值得進行一些測試,應該可以在scipy.stats中進行擴展。 – user333700

+1

@ user333700:儘管可以使用loc來移動分配,但限制'a> 0'仍然存在,因爲在生成基礎分配之後最後執行移位。 – unutbu

+0

你說得對,我沒有正確地思考這個問題。它需要一個額外的形狀參數來改變和擴大分配的支持。 – user333700

1

如果r是一個均勻隨機偏離U(0,1),則x在以下表達式是冪律分佈的隨機偏離:

x = xmin * (1-r) ** (-1/(alpha-1)) 

其中XMIN是最小的(正)值以上這是冪律分佈所持有的,α是分佈的指數。

+0

爲什麼只寫'x = xmin *(r)**(-alpha)'? – theQman

+0

不知道。這只是我從Aaron Clauset得到的公式。 – Virgil

0

如果要生成冪律分佈,可以使用隨機偏差。您只需在[0,1]之間生成一個隨機數並應用逆方法(Wolfran)。在這種情況下,概率密度函數爲:

P(k)的= K ^( - γ)

ÿ是0和1

之間的可變均勻

Y〜U(0,1)

import numpy as np 

def power_law(k_min, k_max, y, gamma): 
    return ((k_max**(-gamma+1) - k_min**(-gamma+1))*y + k_min**(-gamma+1.0))**1.0/(-gamma + 1.0) 

我們生成的分發,你只需要創建一個數組

nodes = 1000 
scale_free_distribution = np.zeros(nodes, float) 
k_min = 1.0 
k_max = 100*k_min 
gamma = 3.0 

for n in range(nodes): 
    scale_free_distribution[n] = power_law(k_min, k_max,np.random.uniform(0,1), gamma) 

這將工作產生與伽馬= 3.0冪律分佈,如果要定勢分佈平均,你有研究Complex Networks會導致k_min取決於k_max和平均的主動性。

0

Python包powerlaw可以做到這一點。考慮a>1與概率密度函數

f(x) = c * x^(-a) 

冪律分佈x > x_minf(x) = 0否則。這裏c是歸一化因子並且被確定爲

c = (a-1) * x_min^(a-1). 

在下面的例子是a = 1.5x_min = 1.0和比較從用來自表達PDF中的隨機樣本估計出的概率密度函數給出以上的預期結果。

import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as pl 

import numpy as np 
import powerlaw 

a, xmin = 1.5, 1.0 
N = 10000 

# generates random variates of power law distribution 
vrs = powerlaw.Power_Law(xmin=xmin, parameters=[a]).generate_random(N) 

# plotting the PDF estimated from variates 
bin_min, bin_max = np.min(vrs), np.max(vrs) 
bins = 10**(np.linspace(np.log10(bin_min), np.log10(bin_max), 100)) 
counts, edges = np.histogram(vrs, bins, density=True) 
centers = (edges[1:] + edges[:-1])/2. 

# plotting the expected PDF 
xs = np.linspace(bin_min, bin_max, 100000) 
pl.plot(xs, [(a-1)*xmin**(a-1)*x**(-a) for x in xs], color='red') 
pl.plot(centers, counts, '.') 

pl.xscale('log') 
pl.yscale('log') 

pl.savefig('powerlaw_variates.png') 

回報

power_law