本文簡要介紹 python 語言中 scipy.stats.sampling.RatioUniforms
的用法。
用法:
class scipy.stats.sampling.RatioUniforms(pdf, *, umax, vmin, vmax, c=0, random_state=None)#
使用 ratio-of-uniforms 方法從概率密度函數生成隨機樣本。
- pdf: 可調用的
具有簽名 pdf(x) 的函數,與分布的概率密度函數成比例。
- umax: 浮點數
u-direction 中邊界矩形的上限。
- vmin: 浮點數
v-direction 中邊界矩形的下界。
- vmax: 浮點數
v-direction 中邊界矩形的上限。
- c: 浮點數,可選。
ratio-of-uniforms 方法的移位參數,請參見注釋。默認值為 0。
- random_state: {無,整數,
numpy.random.Generator
, numpy.random.RandomState
}, optional如果種子是無(或np.random), 這
numpy.random.RandomState
使用單例。如果種子是一個 int,一個新的RandomState
使用實例,播種種子.如果種子已經是一個Generator
或者RandomState
實例然後使用該實例。
參數 ::
注意:
給定一個單變量概率密度函數pdf和一個常數c, 定義集合
A = {(u, v) : 0 < u <= sqrt(pdf(v/u + c))}
.如果(U, V)
是一個均勻分布的隨機向量A
, 然後V/U + c
遵循一個分布pdf.上述結果(見[1],[2]) 可用於僅使用 PDF 對隨機變量進行采樣,即不需要 CDF 的反轉。典型選擇c是零或模式pdf.套裝
A
是矩形的子集R = [0, umax] x [vmin, vmax]
其中umax = sup sqrt(pdf(x))
vmin = inf (x - c) sqrt(pdf(x))
vmax = sup (x - c) sqrt(pdf(x))
特別是,這些值是有限的,如果pdf是有界的並且
x**2 * pdf(x)
是有界的(即次二次尾部)。一個可以生成(U, V)
一致地R
並返回V/U + c
如果(U, V)
也在A
可以直接驗證。如果對於任何常數 k > 0,將 pdf 替換為 k * pdf,則該算法不會改變。因此,通過刪除不必要的歸一化因子,使用與概率密度函數成比例的函數通常很方便。
直觀地說,如果
A
填滿大部分封閉矩形,使得概率很高(U, V)
在於A
每當它位於R
因為否則所需的迭代次數會變得太大。更準確地說,請注意要繪製的預期迭代次數(U, V)
均勻分布在R
這樣(U, V)
也在A
由比率給出area(R) / area(A) = 2 * umax * (vmax - vmin) / area(pdf)
,其中麵積(pdf)是積分pdf(如果使用概率密度函數,則等於一,但如果使用與密度成比例的函數,則可以取其他值)。等式成立,因為麵積A
等於0.5 * area(pdf)
(定理 7.1 中[1])。如果采樣在 50000 次迭代後未能生成單個隨機變量(即沒有一次抽簽在A
),引發異常。如果未正確指定邊界矩形(即,如果它不包含
A
),算法從不同於下式給出的分布中采樣pdf.因此,建議執行測試,例如scipy.stats.kstest作為支票。參考:
[1] (1,2)L. Devroye,“非均勻隨機變量生成”,Springer-Verlag,1986 年。
[2]W. Hoermann 和 J. Leydold,“生成廣義逆高斯隨機變量”,統計與計算,24(4),p。 547-557,2014 年。
[3]A.J. Kinderman 和 J.F. Monahan,“使用均勻偏差比率的隨機變量的計算機生成”,ACM Transactions on Mathematical Software,3(3),p。 257-260,1977。
例子:
>>> import numpy as np >>> from scipy import stats
>>> from scipy.stats.sampling import RatioUniforms >>> rng = np.random.default_rng()
模擬正態分布的隨機變量。在這種情況下,很容易顯式地計算邊界矩形。為簡單起見,我們刪除了密度的歸一化因子。
>>> f = lambda x: np.exp(-x**2 / 2) >>> v = np.sqrt(f(np.sqrt(2))) * np.sqrt(2) >>> umax = np.sqrt(f(0)) >>> gen = RatioUniforms(f, umax=umax, vmin=-v, vmax=v, random_state=rng) >>> r = gen.rvs(size=2500)
K-S 檢驗確認隨機變量確實是正態分布的(正態性在 5% 顯著性水平上不被拒絕):
>>> stats.kstest(r, 'norm')[1] 0.250634764150542
index 分布提供了另一個可以明確確定邊界矩形的示例。
>>> gen = RatioUniforms(lambda x: np.exp(-x), umax=1, vmin=0, ... vmax=2*np.exp(-1), random_state=rng) >>> r = gen.rvs(1000) >>> stats.kstest(r, 'expon')[1] 0.21121052054580314
相關用法
- Python SciPy sampling.DiscreteAliasUrn用法及代碼示例
- Python SciPy sampling.DiscreteGuideTable用法及代碼示例
- Python SciPy sampling.FastGeneratorInversion用法及代碼示例
- Python SciPy sampling.TransformedDensityRejection用法及代碼示例
- Python SciPy sampling.SimpleRatioUniforms用法及代碼示例
- Python SciPy sampling.NumericalInverseHermite用法及代碼示例
- Python SciPy sampling.NumericalInversePolynomial用法及代碼示例
- Python SciPy stats.anderson用法及代碼示例
- Python SciPy stats.iqr用法及代碼示例
- Python SciPy special.exp1用法及代碼示例
- Python SciPy special.expn用法及代碼示例
- Python SciPy signal.czt_points用法及代碼示例
- Python SciPy signal.chirp用法及代碼示例
- Python SciPy stats.genpareto用法及代碼示例
- Python SciPy signal.residue用法及代碼示例
- Python SciPy special.ncfdtri用法及代碼示例
- Python SciPy special.gamma用法及代碼示例
- Python SciPy signal.iirdesign用法及代碼示例
- Python SciPy special.y1用法及代碼示例
- Python SciPy special.y0用法及代碼示例
- Python SciPy special.ellip_harm_2用法及代碼示例
- Python SciPy signal.max_len_seq用法及代碼示例
- Python SciPy sparse.isspmatrix用法及代碼示例
- Python SciPy signal.kaiser_atten用法及代碼示例
- Python SciPy stats.skewnorm用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.sampling.RatioUniforms。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。