scipy.stats.qmc.

discrepancy#

scipy.stats.qmc.discrepancy(sample, *, iterative=False, method='CD', workers=1)[source]#

给定样本的差异度。

参数:
samplearray_like (n, d)

计算差异度的样本。

iterativebool, optional

如果不用于更新差异度,则必须为 False。默认为 False。有关更多详细信息,请参阅注释。

methodstr, optional

差异度类型,可以是 CDWDMDL2-star。 有关更多详细信息,请参阅注释。 默认为 CD

workersint, optional

用于并行处理的 worker 数量。如果给定 -1,则使用所有 CPU 线程。默认为 1。

返回:
discrepancyfloat

差异度。

另请参阅

geometric_discrepancy

注释

差异度是一种均匀性标准,用于评估超立方体中大量样本的空间填充。 差异度量化了超立方体上的连续均匀分布与 \(n\) 个不同样本点上的离散均匀分布之间的距离。

值越低,参数空间的覆盖率越好。

对于超立方体的子集集合,差异度是一个子集中样本点的比例与该子集的体积之间的差异。 差异度有不同的定义,对应于不同的子集集合。 一些版本采用子集的均方根差,而不是最大值。

如果均匀性度量满足以下标准,则是合理的 [1]

  1. 它在置换因子和/或运行下是不变的。

  2. 它在坐标旋转下是不变的。

  3. 它不仅可以测量样本在超立方体上的均匀性,还可以测量样本在较低维度超立方体的非空子集上的投影均匀性。

  4. 有一些合理的几何意义。

  5. 它很容易计算。

  6. 它满足 Koksma-Hlawka 类不等式。

  7. 它与实验设计中的其他标准一致。

有四种方法可用

  • CD:中心差异度 - 子空间涉及超立方体的一个角

  • WD:环绕差异度 - 子空间可以环绕边界

  • MD:混合差异度 - CD/WD 之间的混合,覆盖更多标准

  • L2-star:L2-star 差异度 - 类似于 CD BUT 旋转变体

方法 CDWDMD 分别实现 [2] 的等式 9、10 和 18 的右手侧; 不取平方根。 另一方面,L2-star 计算 [3] 的等式 10 给出的量,由后续等式实现; 取平方根。

最后,使用 iterative=True,可以计算差异度,就好像我们有 \(n+1\) 个样本一样。 如果我们想向采样中添加一个点并检查哪个候选给出最低的差异度,这将非常有用。 然后,您可以使用 update_discrepancy 使用每个候选更新差异度。 此方法比计算大量候选的差异度更快。

参考文献

[1]

Fang et al. “计算机实验的设计和建模”。 计算机科学和数据分析系列,2006 年。

[2]

Zhou Y.-D. 等人 “用于准随机点集的混合差异度”。 复杂性杂志,29 (3-4) , pp. 283-301, 2013.

[3]

T. T. Warnock. “低差异点集的计算研究。” 将数论应用于数值分析,学术出版社,pp. 319-343, 1972.

示例

使用差异度计算样本的质量

>>> import numpy as np
>>> from scipy.stats import qmc
>>> space = np.array([[1, 3], [2, 6], [3, 2], [4, 5], [5, 1], [6, 4]])
>>> l_bounds = [0.5, 0.5]
>>> u_bounds = [6.5, 6.5]
>>> space = qmc.scale(space, l_bounds, u_bounds, reverse=True)
>>> space
array([[0.08333333, 0.41666667],
       [0.25      , 0.91666667],
       [0.41666667, 0.25      ],
       [0.58333333, 0.75      ],
       [0.75      , 0.08333333],
       [0.91666667, 0.58333333]])
>>> qmc.discrepancy(space)
0.008142039609053464

我们还可以通过使用 iterative=True 以迭代方式计算 CD 差异度。

>>> disc_init = qmc.discrepancy(space[:-1], iterative=True)
>>> disc_init
0.04769081147119336
>>> qmc.update_discrepancy(space[-1], space[:-1], disc_init)
0.008142039609053513