當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy sampling.FastGeneratorInversion用法及代碼示例


本文簡要介紹 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。支持的發行版列表可以在注釋部分找到。形狀參數,locscale用於創建分布的必須是標量。例如,對於具有形狀參數的 Gamma 分布p,p必須是浮點數,對於具有形狀參數 (a, b) 的 beta 分布,a 和 b 都必須是浮點數。

domain 浮點數元組,可選

如果希望從截斷/條件分布中采樣,則必須指定域。默認值為“無”。在這種情況下,隨機變量不會被截斷,並且域是根據分布的支持推斷的。

ignore_shape_range 布爾值,可選。

如果為 False,則形狀參數超出有效值範圍,以確保數值精度(請參閱注釋)較高,引發 ValueError。如果為 True,則接受對分布有效的任何形狀參數。這對於測試很有用。默認值為 False。

random_state {無,整數, numpy.random.Generator

NumPy 隨機數生成器或底層 NumPy 隨機數生成器的種子,用於生成均勻隨機數流。如果 random_state 為 None,則使用 self.random_state 。如果 random_state 是 int,則使用np.random.default_rng(random_state)。如果 random_state 已經是GeneratorRandomState 實例,則使用該實例。

注意

該類為連續分布創建一個對象,指定為距離。方法rvs使用來自的生成器scipy.stats.sampling它是在對象實例化時創建的。此外,方法qrvsppf被添加。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,cdfpdfrv_frozen。使用此類的主要好處可概括如下: 一旦在設置步驟中創建了用於采樣隨機變量的生成器,就可以使用以下方法對 PPF 進行采樣和評估:ppf速度非常快,並且性能本質上與分布無關。因此,如果需要大量隨機變量,許多分布可以實現顯著的加速。重要的是要知道這種快速采樣是通過 CDF 的反轉來實現的。因此,一個均勻隨機變量被轉換為非均勻變量,這對於多種模擬方法來說是一個優點,例如,當使用常見隨機變量或對立變量的方差減少方法時([2])。

此外,反演使得可以 - 使用 QMC 生成器scipy.stats.qmc(方法qrvs), - 生成截斷為區間的隨機變量。例如,如果目標是從區間 (2, 4) 中采樣標準正態隨機變量,則可以通過使用參數輕鬆實現領域.

最初定義的位置和規模距離可以重置,而無需重新運行設置步驟來創建用於采樣的生成器。分布關係Ylocscale到標準分布X(IE。,loc=0scale=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 浮點數

尺度參數。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.sampling.FastGeneratorInversion。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。