scipy.stats.sampling.

SimpleRatioUniforms#

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

簡單均勻比率 (SROU) 方法。

SROU 基於均勻比率方法,該方法使用通用不等式來建構(通用)邊界矩形。它適用於 T 凹分佈,其中 T(x) = -1/sqrt(x)。該方法的主要優點是設定快速。如果需要重複生成具有不同形狀參數的分佈的小到中等樣本,這可能是有益的。在這種情況下,NumericalInverseHermiteNumericalInversePolynomial 的設定步驟將導致效能不佳。

參數:
distobject

具有 pdf 方法的類別實例。

  • pdf:分佈的 PDF。PDF 的簽名預期為:def pdf(self, x: float) -> float。即 PDF 應接受 Python 浮點數並傳回 Python 浮點數。它不需要積分到 1,即 PDF 不需要正規化。如果未正規化,則應將 pdf_area 設定為 PDF 下的面積。

modefloat, optional

分佈的(精確)眾數。當眾數為 None 時,會使用緩慢的數值常式來近似它。預設值為 None

pdf_areafloat, optional

PDF 下的面積。或者,可以傳遞 PDF 下面積的上限,但會增加拒絕常數的成本。預設值為 1。

domain長度為 2 的 list 或 tuple,optional

分佈的支援域。預設值為 None。當 None

  • 如果分佈物件 dist 提供 support 方法,則使用它來設定分佈的域。

  • 否則,支援域假定為 \((-\infty, \infty)\)

cdf_at_modefloat, optional

眾數下的 CDF。可以給定它以提高演算法的效能。當給定眾數下的 CDF 時,拒絕常數會減半。預設值為 None

random_state{None, int, numpy.random.Generator,

NumPy 隨機數生成器或用於產生均勻隨機數流的底層 NumPy 隨機數生成器的種子。如果 random_state 為 None(或 np.random),則使用 numpy.random.RandomState 單例。如果 random_state 是 int,則會使用新的 RandomState 實例,並以 random_state 作為種子。如果 random_state 已經是 GeneratorRandomState 實例,則使用該實例。

參考文獻

[1]

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

[2]

Leydold, Josef. “用於連續和離散單變數 T 凹分佈的簡單通用生成器。” ACM Transactions on Mathematical Software (TOMS) 27.1 (2001): 66-82

[3]

Leydold, Josef. “透過廣義均勻比率方法的短通用生成器。” Mathematics of Computation 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 下的精確面積,或 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()
../../_images/scipy-stats-sampling-SimpleRatioUniforms-1.png

方法

rvs([size, random_state])

從分佈中取樣。

set_random_state([random_state])

設定底層的均勻隨機數生成器。