本文簡要介紹 python 語言中 scipy.stats.sampling.FastGeneratorInversion
的用法。
用法:
class scipy.stats.sampling.FastGeneratorInversion(dist, *, domain=None, ignore_shape_range=False, random_state=None)#
通過 CDF 的數值反轉對
scipy.stats
中的一大類連續分布進行快速采樣。- dist: rv_frozen 對象
凍結分布對象來自
scipy.stats
。支持的發行版列表可以在注釋部分找到。形狀參數,loc
和scale
用於創建分布的必須是標量。例如,對於具有形狀參數的 Gamma 分布p,p必須是浮點數,對於具有形狀參數 (a, b) 的 beta 分布,a 和 b 都必須是浮點數。- domain: 浮點數元組,可選
如果希望從截斷/條件分布中采樣,則必須指定域。默認值為“無”。在這種情況下,隨機變量不會被截斷,並且域是根據分布的支持推斷的。
- ignore_shape_range: 布爾值,可選。
如果為 False,則形狀參數超出有效值範圍,以確保數值精度(請參閱注釋)較高,引發 ValueError。如果為 True,則接受對分布有效的任何形狀參數。這對於測試很有用。默認值為 False。
- random_state: {無,整數,
numpy.random.Generator
, numpy.random.RandomState
}, optionalNumPy 隨機數生成器或底層 NumPy 隨機數生成器的種子,用於生成均勻隨機數流。如果
random_state
為 None,則使用self.random_state
。如果random_state
是 int,則使用np.random.default_rng(random_state)
。如果random_state
已經是Generator
或RandomState
實例,則使用該實例。
參數 ::
注意:
該類為連續分布創建一個對象,指定為距離。方法
rvs
使用來自的生成器scipy.stats.sampling
它是在對象實例化時創建的。此外,方法qrvs
和ppf
被添加。qrvs
根據 quasi-random 數字生成樣本scipy.stats.qmc
.ppf
是基於數值反演方法的PPF[1](scipy.stats.sampling.NumericalInversePolynomial)用於生成隨機變量。支持的發行版(遠程名稱) 是:
alpha
,anglit
,argus
,beta
,betaprime
,bradford
,burr
,burr12
,cauchy
,chi
,chi2
,cosine
,crystalball
,expon
,gamma
,gennorm
,geninvgauss
,gumbel_l
,gumbel_r
,hypsecant
,invgamma
,invgauss
,invweibull
,laplace
,logistic
,maxwell
,moyal
,norm
,pareto
,powerlaw
,t
,rayleigh
,semicircular
,wald
,weibull_max
,weibull_min
.rvs
依賴於數值反演的精度。如果使用非常極端的形狀參數,數值反演可能不起作用。然而,對於所有實現的分布,允許的形狀參數已經過測試,如果用戶提供超出允許範圍的值,則會出現錯誤。對於所有有效參數,u-error 不應超過 1e-10。請注意,即使實例化對象時參數在有效範圍內,也可能會引發警告。要檢查數值準確性,可以使用方法evaluate_error
。請注意,所有已實現的發行版也是
scipy.stats
,以及創建的對象FastGeneratorInversion
依賴於類似的方法ppf
,cdf和pdf從rv_frozen。使用此類的主要好處可概括如下: 一旦在設置步驟中創建了用於采樣隨機變量的生成器,就可以使用以下方法對 PPF 進行采樣和評估:ppf
速度非常快,並且性能本質上與分布無關。因此,如果需要大量隨機變量,許多分布可以實現顯著的加速。重要的是要知道這種快速采樣是通過 CDF 的反轉來實現的。因此,一個均勻隨機變量被轉換為非均勻變量,這對於多種模擬方法來說是一個優點,例如,當使用常見隨機變量或對立變量的方差減少方法時([2])。此外,反演使得可以 - 使用 QMC 生成器
scipy.stats.qmc
(方法qrvs
), - 生成截斷為區間的隨機變量。例如,如果目標是從區間 (2, 4) 中采樣標準正態隨機變量,則可以通過使用參數輕鬆實現領域.最初定義的位置和規模距離可以重置,而無需重新運行設置步驟來創建用於采樣的生成器。分布關係Y和
loc
和scale
到標準分布X(IE。,loc=0
和scale=1
) 是(誰)給的Y = loc + scale * X
.參考:
[1]德弗林格、格哈德、沃爾夫岡·霍曼和約瑟夫·萊多德。 “當僅知道密度時,通過數值反演生成隨機變量。” ACM 建模和計算機仿真匯刊 (TOMACS) 20.4 (2010):1-25。
[2]霍曼、沃爾夫岡、約瑟夫·萊多德和格哈德·德弗林格。 “自動非均勻隨機數生成。”施普林格,2004。
例子:
>>> import numpy as np >>> from scipy import stats >>> from scipy.stats.sampling import FastGeneratorInversion
讓我們從一個簡單的例子開始來說明主要函數:
>>> gamma_frozen = stats.gamma(1.5) >>> gamma_dist = FastGeneratorInversion(gamma_frozen) >>> r = gamma_dist.rvs(size=1000)
平均值應約等於形狀參數 1.5:
>>> r.mean() 1.52423591130436 # may vary
同樣,我們可以根據quasi-random數字抽取樣本:
>>> r = gamma_dist.qrvs(size=1000) >>> r.mean() 1.4996639255942914 # may vary
將 PPF 與近似值
ppf
進行比較。>>> q = [0.001, 0.2, 0.5, 0.8, 0.999] >>> np.max(np.abs(gamma_frozen.ppf(q) - gamma_dist.ppf(q))) 4.313394796895409e-08
為了確認數值反演的準確性,我們評估近似誤差(u-error),該誤差應低於1e-10(更多詳細信息,請參閱
evaluate_error
的文檔):>>> gamma_dist.evaluate_error() (7.446320551265581e-11, nan) # may vary
請注意,可以更改位置和比例,而無需實例化新的生成器:
>>> gamma_dist.loc = 2 >>> gamma_dist.scale = 3 >>> r = gamma_dist.rvs(size=1000)
平均值應約為 2 + 3*1.5 = 6.5。
>>> r.mean() 6.399549295242894 # may vary
我們還說明如何應用截斷:
>>> trunc_norm = FastGeneratorInversion(stats.norm(), domain=(3, 4)) >>> r = trunc_norm.rvs(size=1000) >>> 3 < r.min() < r.max() < 4 True
檢查平均值:
>>> r.mean() 3.250433367078603 # may vary
>>> stats.norm.expect(lb=3, ub=4, conditional=True) 3.260454285589997
在這種特殊情況下,
scipy.stats.truncnorm
也可用於生成截斷的正態隨機變量。- loc: 浮點數
位置參數。
- random_state: {
numpy.random.Generator
,numpy.random.RandomState
} rvs
等相關方法中使用的隨機狀態(除非另一個random_state
作為參數傳遞給這些方法)。- scale: 浮點數
尺度參數。
屬性 ::
相關用法
- Python SciPy sampling.DiscreteAliasUrn用法及代碼示例
- Python SciPy sampling.DiscreteGuideTable用法及代碼示例
- Python SciPy sampling.RatioUniforms用法及代碼示例
- 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.FastGeneratorInversion。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。