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


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


本文簡要介紹 python 語言中 scipy.stats.sampling.SimpleRatioUniforms 的用法。

用法:

class  scipy.stats.sampling.SimpleRatioUniforms(dist, *, mode=None, pdf_area=1, domain=None, cdf_at_mode=None, random_state=None)#

簡單的Ratio-of-Uniforms (SROU) 方法。

SROU 基於ratio-of-uniforms 方法,該方法使用通用不等式來構造(通用)邊界矩形。它適用於帶有 T(x) = -1/sqrt(x) 的 T-concave 發行版。該方法的主要優點是快速設置。如果人們反複需要生成具有不同形狀參數的分布的小到中等樣本,這將是有益的。在這種情況下, NumericalInverseHermite NumericalInversePolynomial 的設置步驟將導致性能不佳。

參數

dist 對象

具有pdf 方法的類的實例。

  • pdf:分布的PDF。 PDF 的簽名應為:def pdf(self, x: float) -> float.即 PDF 應該接受 Python 浮點數並返回一個 Python 浮點數。它不需要集成到 1,即 PDF 不需要被規範化。如果不歸一化,pdf_area應設置為 PDF 下的區域。

mode 浮點數,可選

(精確)分布模式。當模式為 None 時,使用慢速數值例程來近似它。默認為 None

pdf_area 浮點數,可選

PDF 下的區域。可選地,可以以增加拒絕常數為代價傳遞 PDF 下區域的上限。默認值為 1。

domain 長度為 2 的列表或元組,可選

分布的支持。默認為 None 。當 None

  • 如果一個support方法由分發對象提供距離,用於設置分布的域。

  • 否則,假定支持為

cdf_at_mode 浮點數,可選

CDF 在模式。可以給出它來提高算法的性能。當 CDF at mode 給定時,拒絕常數減半。默認為 None

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

NumPy 隨機數生成器或底層NumPy 隨機數生成器的種子,用於生成統一隨機數流。如果random_state是無(或np.random), 這numpy.random.RandomState使用單例。如果random_state是一個 int,一個新的RandomState使用實例,播種random_state.如果random_state已經是一個Generator或者RandomState實例然後使用該實例。

參考

[1]

UNU.RAN 參考手冊,第 5.3.16 節,“SROU - 簡單 Ratio-of-Uniforms 方法”,http://statmath.wu.ac.at/software/unuran/doc/unuran.html#SROU

[2]

萊多德,約瑟夫。 “用於連續和離散單變量T-concave 分布的簡單通用生成器。” ACM 數學軟件交易 (TOMS) 27.1 (2001): 66-82

[3]

萊多德,約瑟夫。 “通過通用 ratio-of-uniforms 方法的短通用生成器。”計算數學 72.243 (2003): 1453-1471

例子

>>> from scipy.stats.sampling import SimpleRatioUniforms
>>> import numpy as np

假設我們有正態分布:

>>> class StdNorm:
...     def pdf(self, x):
...         return np.exp(-0.5 * x**2)

請注意,PDF 沒有集成到 1。我們可以在生成器初始化期間傳遞 PDF 下的確切區域,也可以傳遞 PDF 下的確切區域的上限。此外,建議通過分發模式以加快設置:

>>> urng = np.random.default_rng()
>>> dist = StdNorm()
>>> rng = SimpleRatioUniforms(dist, mode=0,
...                           pdf_area=np.sqrt(2*np.pi),
...                           random_state=urng)

現在,我們可以使用 rvs 方法從分布中生成樣本:

>>> rvs = rng.rvs(10)

如果模式下的 CDF 可用,則可以設置它以提高 rvs 的性能:

>>> from scipy.stats import norm
>>> rng = SimpleRatioUniforms(dist, mode=0,
...                           pdf_area=np.sqrt(2*np.pi),
...                           cdf_at_mode=norm.cdf(0),
...                           random_state=urng)
>>> rvs = rng.rvs(1000)

我們可以通過可視化其直方圖來檢查樣本是否來自給定分布:

>>> import matplotlib.pyplot as plt
>>> x = np.linspace(rvs.min()-0.1, rvs.max()+0.1, 1000)
>>> fx = 1/np.sqrt(2*np.pi) * dist.pdf(x)
>>> fig, ax = plt.subplots()
>>> ax.plot(x, fx, 'r-', lw=2, label='true distribution')
>>> ax.hist(rvs, bins=10, density=True, alpha=0.8, label='random variates')
>>> ax.set_xlabel('x')
>>> ax.set_ylabel('PDF(x)')
>>> ax.set_title('Simple Ratio-of-Uniforms Samples')
>>> ax.legend()
>>> plt.show()
scipy-stats-sampling-SimpleRatioUniforms-1.png

相關用法


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