<p>你说你想学习抽样截断分布的基本思想,但是你的来源是一篇关于
<a href="https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm" rel="noreferrer">Metropolis–Hastings algorithm</a>?你真的需要这种“从概率分布中获得一系列随机样本的方法吗?”,对于这种概率分布,直接抽样是困难的?以此为出发点就像通过阅读莎士比亚来学习英语。</p>
<h3>截尾法向</h3>
<p>对于截尾正态分布,基本<strong>拒绝抽样</strong>就是您所需要的:为原始分布生成样本,拒绝超出范围的样本。正如Leandro Caniglia指出的,您不应该期望截断的分布具有相同的PDF,除非间隔较短-这显然是不可能的,因为PDF图形下的区域总是1。如果你从侧面剪掉一些东西,中间必须有更多的内容;PDF会被重新缩放。</p>
<p>一次采集10万个样本,效率很低。我会一次采集10万个正常样本,只接受那些合适的样本;然后重复,直到我有足够的样本。amin和amax之间截短正态抽样示例:</p>
<pre><code>import numpy as np
n_samples = 100000
amin, amax = -1, 2
samples = np.zeros((0,)) # empty for now
while samples.shape[0] < n_samples:
s = np.random.normal(0, 1, size=(n_samples,))
accepted = s[(s >= amin) & (s <= amax)]
samples = np.concatenate((samples, accepted), axis=0)
samples = samples[:n_samples] # we probably got more than needed, so discard extra ones
</code></pre>
<p>这里是与PDF曲线的比较,<strong>按<code>cdf(amax) - cdf(amin)</code>除法重新缩放</strong>,如上所述。</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/djBzh.png" rel="noreferrer"><img src="https://i.stack.imgur.com/djBzh.png" alt="histogram"/></a></p>
<h3>截断多元正态</h3>
<p>现在我们要保持第一个坐标在amin和amax之间,第二个坐标在bmin和bmax之间。同样的故事,只是有一个2列数组,并且与边界的比较是以一种相对隐蔽的方式完成的:</p>
<pre><code>(np.min(s - [amin, bmin], axis=1) >= 0) & (np.max(s - [amax, bmax], axis=1) <= 0)
</code></pre>
<p>这意味着:从每一行中减去amin,bmin,只保留两个结果都为非负的行(这意味着a>;=amin和b>;=bmin)。对amax,bmax也做类似的事情。只接受同时满足这两个条件的行。</p>
<pre><code>n_samples = 10
amin, amax = -1, 2
bmin, bmax = 0.2, 2.4
mean = [0.3, 0.5]
cov = [[2, 1.1], [1.1, 2]]
samples = np.zeros((0, 2)) # 2 columns now
while samples.shape[0] < n_samples:
s = np.random.multivariate_normal(mean, cov, size=(n_samples,))
accepted = s[(np.min(s - [amin, bmin], axis=1) >= 0) & (np.max(s - [amax, bmax], axis=1) <= 0)]
samples = np.concatenate((samples, accepted), axis=0)
samples = samples[:n_samples, :]
</code></pre>
<p>这里不打算绘制,但这里有一些值:自然,在范围内。</p>
<pre><code>array([[ 0.43150033, 1.55775629],
[ 0.62339265, 1.63506963],
[-0.6723598 , 1.58053835],
[-0.53347361, 0.53513105],
[ 1.70524439, 2.08226558],
[ 0.37474842, 0.2512812 ],
[-0.40986396, 0.58783193],
[ 0.65967087, 0.59755193],
[ 0.33383214, 2.37651975],
[ 1.7513789 , 1.24469918]])
</code></pre>