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)
。該方法的主要優點是設定快速。如果需要重複生成具有不同形狀參數的分佈的小到中等樣本,這可能是有益的。在這種情況下,NumericalInverseHermite
或NumericalInversePolynomial
的設定步驟將導致效能不佳。- 參數:
- 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.random.RandomState
}, optionalNumPy 隨機數生成器或用於產生均勻隨機數流的底層 NumPy 隨機數生成器的種子。如果 random_state 為 None(或 np.random),則使用
numpy.random.RandomState
單例。如果 random_state 是 int,則會使用新的RandomState
實例,並以 random_state 作為種子。如果 random_state 已經是Generator
或RandomState
實例,則使用該實例。
參考文獻
[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()
方法
rvs
([size, random_state])從分佈中取樣。
set_random_state
([random_state])設定底層的均勻隨機數生成器。