scipy.stats.qmc.

PoissonDisk#

class scipy.stats.qmc.PoissonDisk(d, *, radius=0.05, hypersphere=\'volume\', ncandidates=30, optimization=None, seed=None)[source]#

泊松圆盘抽样。

Parameters:
dint

参数空间维度。

radiusfloat

抽样新候选项时,点之间保持的最小距离。

hypersphere{“volume”, “surface”}, optional

生成要添加到最终样本中的潜在候选项的抽样策略。默认参数为 “volume”。

  • volume: [1] 中描述的 Bridson 算法。新候选项在超球体抽样。

  • surface: 仅在超球体的表面上抽样。

ncandidatesint

每次迭代中要采样的候选对象数量。更多的候选对象会导致更密的采样,因为每次迭代可以接受更多的候选对象。

优化{None、“random-cd”、“lloyd”},可选

是否使用优化方案来提高采样后的质量。请注意,这是一个后处理步骤,不能保证所有样本属性都会被保留。默认为无

  • random-cd:坐标随机排列以降低中心离散度。基于中心离散度的最佳样本会不断更新。与使用其他离散度测量相比,基于中心离散度的采样显示出对 2D 和 3D 子投影有更好的空间填充鲁棒性。

  • lloyd:使用改进的 Lloyd-Max 算法对样本进行扰动。此过程收敛为等距样本。

在 1.10.0 版本中添加。

种子{None、int、numpy.random.Generator,可选}

如果seed是 int 或 None,则使用np.random.default_rng(seed)创建一个新的numpy.random.Generator。如果seed已经是生成器实例,则使用提供的实例。

备注

泊松圆盘采样是一种迭代采样策略。从种子样本开始,在种子周围的超球面中采样ncandidates。低于某个radius或在域外的候选对象将被拒绝。将新样本添加到样本种子的池中。当池为空或达到所需样本数时,此过程停止。

样本中可以包含的最大点数与radius直接相关。随着空间维度的增加,较高的半径会进一步铺开这些点,并有助于克服维数灾难。有关更多详细信息,请参阅准蒙特卡洛教程

警告

由于其迭代性质和内存要求,该算法更适用于低维度和采样大小。使用高维度的较小半径意味着空间可能包含的样本多于使用较低维度或较大半径。

某些代码摘录自[2],原始作者 Shamis 于 2021 年 3 月 31 日书面同意在 SciPy 中免费使用,根据三项条款 BSD 使用。

参考

[1]

罗伯特·布里奇森,“任意维度的快速泊松圆盘采样”。SIGGRAPH,2007 年。

实例

使用 radius 为 0.2 生成一个 2D 样本。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from matplotlib.collections import PatchCollection
>>> from scipy.stats import qmc
>>>
>>> rng = np.random.default_rng()
>>> radius = 0.2
>>> engine = qmc.PoissonDisk(d=2, radius=radius, seed=rng)
>>> sample = engine.random(20)

对 2D 样本进行可视化,并显示所有点的距离都不会小于 radiusradius/2 用于可视化非相交圆。如果两个样本之间的距离恰好为 radius,那么它们的半径为 radius/2 的圆就会相切。

>>> fig, ax = plt.subplots()
>>> _ = ax.scatter(sample[:, 0], sample[:, 1])
>>> circles = [plt.Circle((xi, yi), radius=radius/2, fill=False)
...            for xi, yi in sample]
>>> collection = PatchCollection(circles, match_original=True)
>>> ax.add_collection(collection)
>>> _ = ax.set(aspect='equal', xlabel=r'$x_1$', ylabel=r'$x_2$',
...            xlim=[0, 1], ylim=[0, 1])
>>> plt.show()
../../_images/scipy-stats-qmc-PoissonDisk-1_00_00.png

这种可视化可以被视为圆形填充:我们可以将多少个圆形放置在该空间内。这是一个 NP-hard 问题。方法 fill_space 可用于添加样本,直到无法再添加任何样本。这是一个难题,可能需要手动调整参数。注意维度:随着维度的增加,填充空间所需的样本数量呈指数增长(维数灾难)。

方法

fast_forward(n)

将序列快速向前移动 n 个位置。

fill_space()

在区间 [0, 1] 中绘制 n 个样本。

integers(l_bounds, *[, u_bounds, n, ...])

l_bounds(含)到 u_bounds(不含),或如果 endpoint=True,则从 l_bounds(含)到 u_bounds(含)绘制 n 个整数。

random([n, workers])

在半开区间 [0, 1) 中绘制 n

reset()

将引擎重置为基本状态。