scipy.stats.TransformedDensityRejection

class scipy.stats.TransformedDensityRejection(dist, mode=None, center=None, *, domain=None, c=- 0.5, construction_points=30, variant='ps', use_dars=True, max_squeeze_hat_ratio=0.99, max_intervals=100, guide_factor=2, random_state=None)

变换密度排斥(TDR)法。

TDR是一种利用变换密度的凹性来构造HAT函数并自动压缩的接受/拒绝方法。与专门针对该发行版的算法相比,大多数通用算法都非常慢。速度快的算法设置较慢,需要较大的表。这种通用方法的目的是提供一种不太慢并且只需要很短设置的算法。该方法适用于具有T凹密度函数的单变量和单峰连续分布。看见 [1][2] 了解更多详细信息。

参数
dist对象

的类的实例 pdfdpdf 方法。

  • pdf :发行版的PDF格式。PDF的签名应为: def pdf(self, x: float) -> float 。即PDF应该接受Python浮点并返回Python浮点。它不需要集成到1,也就是说,PDF不需要标准化。

  • dpdf :PDF w.r.t x的导数(即变量)。必须具有与PDF相同的签名。

mode浮动,可选

(精确)分发模式。默认值为 None

center浮动,可选

模式的近似位置或分布的平均值。此位置提供有关PDF主要部分的一些信息,用于避免数字问题。默认值为 None

domain长度为2的列表或元组,可选

发行版的支持。默认值为 None 。什么时候 None

  • 如果一个 support 方法由分发对象提供 dist ,用于设置分布的域。

  • 否则,假定支持为 \((-\infty, \infty)\)

c{-0.5,0.},可选

设置参数 c 对于转换函数 T 。默认值为-0.5。为了构造HAT函数,PDF的变换必须是凹的。这样的PDF被称为T-凹面。目前支持以下转换:

\[\begin{split}C=0。:t(X)&=\log(X)\\ c=-0.5:t(X)&=\frac{1}{\sqrt{x}}\text{(默认值)}\end{split}\]
construction_pointsINT或ARRAY_LIKE,可选

如果是整数,则它定义构造点的数量。如果它是类似数组的,则将数组的元素用作构造点。默认值为30。

variant{‘ps’,‘gw’,‘ia’},可选

要使用的变量。默认值为“ps”。此方法有三种变体可用:

  • GW:在施工点之间挤压,请参见 [3].

  • PS:与帽子函数成正比的挤压。(默认)

  • IA:与变体PS相同,但在挤压下的区域使用“立即接受”的合成方法。

use_dars布尔值,可选

如果为True,则在设置中使用“随机自适应拒绝采样”(DARS)。看见 [1] 获取DARS算法的详细信息。默认值为True。

max_squeeze_hat_ratio浮动,可选

设置比率(挤压下的区域)/(帽子下的区域)的上限。必须是介于0和1之间的数字。默认值为0.99。

max_intervals整型,可选

设置最大间隔数。默认值为100。

guide_factor浮动,可选

为索引搜索的指导表的相对大小设置系数。它必须大于或等于0。设置为0时,则使用顺序搜索。默认值为2。

random_state :{无,整型, numpy.random.Generator{无,整型,

用于生成均匀随机数流的基础NumPy随机数生成器的NumPy随机数生成器或种子。如果 random_state 为无(或 np.random )、 numpy.random.RandomState 使用的是Singleton。如果 random_state 是一个整型、一个新的 RandomState 实例,其种子设定为 random_state 。如果 random_state 已经是一个 GeneratorRandomState 实例,则使用该实例。

参考文献

1(1,2)

UNU.RAN参考手册,第5.3.16节,“TDR-变换密度拒绝”,http://statmath.wu.ac.at/software/unuran/doc/unuran.html#TDR

2

霍尔曼,沃尔夫冈。“一种从T凹形分布中抽样的拒收技术。”ACM数学软件学报(TOMS)21.2(1995):182-193

3

W.R.Gilks和P.Wild(1992)。“吉布斯抽样的自适应拒绝抽样”,应用统计学41,第337-348页。

示例

>>> from scipy.stats import TransformedDensityRejection

假设我们有一个密度:

\[\begin{split}F(X)=\开始{案例} 1-x^2,&1\leq x\leq 1\\ 0,&\text{否则} \结束{案例}\end{split}\]

该密度函数的导数为:

\[\begin{split}\frac{df(X)}{dx}=\BEGIN{Cases} -2x,&-1\leq x\leq 1\\ 0,&\text{否则} \结束{案例}\end{split}\]

请注意,PDF没有集成到1。因为这是一个基于拒绝的方法,所以我们不需要标准化的PDF。要初始化生成器,我们可以使用:

>>> urng = np.random.default_rng()
>>> class MyDist:
...     def pdf(self, x):
...         return 1-x*x
...     def dpdf(self, x):
...         return -2*x
... 
>>> dist = MyDist()
>>> rng = TransformedDensityRejection(dist, domain=(-1, 1),
...                                   random_state=urng)

域对于截断分发非常有用,但为了避免每次都将其传递给构造函数,可以通过提供 support 分布对象中的方法 (dist ):

>>> class MyDist:
...     def pdf(self, x):
...         return 1-x*x
...     def dpdf(self, x):
...         return -2*x
...     def support(self):
...         return (-1, 1)
... 
>>> dist = MyDist()
>>> rng = TransformedDensityRejection(dist, random_state=urng)

现在,我们可以使用 rvs 从分布生成样本的方法:

>>> rvs = rng.rvs(1000)

我们可以通过可视化其直方图来检查样本是否来自给定的分布:

>>> import matplotlib.pyplot as plt
>>> x = np.linspace(-1, 1, 1000)
>>> fx = 3/4 * dist.pdf(x)  # 3/4 is the normalizing constant
>>> plt.plot(x, fx, 'r-', lw=2, label='true distribution')
>>> plt.hist(rvs, bins=20, density=True, alpha=0.8, label='random variates')
>>> plt.xlabel('x')
>>> plt.ylabel('PDF(x)')
>>> plt.title('Transformed Density Rejection Samples')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-TransformedDensityRejection-1_00_00.png

要使用具有10个构造点的对数转换和该方法的立即接受变量,请执行以下操作:

>>> rng = TransformedDensityRejection(dist, c=0., construction_points=10,
...                                   variant='ia', random_state=urng)
>>> rvs = rng.rvs(1000)
属性
hat_area

把帽子下面的区域拿来放发电机。

squeeze_area

找出发电机挤压口下方的区域。

squeeze_hat_ratio

获取发电机的电流比(挤压下的面积)/(帽子下的面积)。

方法:

ppf_hat \(U)

计算HAT分布的CDF的逆 u

rvs \([size] )

分发的样本。

set_random_state \([random_state] )

设置基础均匀随机数生成器。