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对象
的类的实例
pdf
和dpdf
方法。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 已经是一个Generator
或RandomState
实例,则使用该实例。
参考文献
- 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()
要使用具有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] )设置基础均匀随机数生成器。