scipy.stats.qmc.
几何差异#
- scipy.stats.qmc.geometric_discrepancy(sample, method='mindist', metric='euclidean')[源代码][源代码]#
基于几何属性的给定样本的差异。
- 参数:
- 示例array_like (n, d)
用于计算偏差的样本。
- 方法{“mindist”, “mst”},可选
使用的方法。可以是
mindist
表示最小距离(默认),或者是mst
表示最小生成树。- 指标str 或 callable,可选
要使用的距离度量。查看
scipy.spatial.distance.pdist
的文档以了解可用的度量和默认值。
- 返回:
- 差异浮动
差异(较高的值对应于更大的样本均匀性)。
参见
注释
这种差异可以作为随机样本质量的一个简单度量。这一度量基于样本中点的分布的几何特性,例如任意两点之间的最小距离,或最小生成树中的平均边长。
值越高,参数空间的覆盖率越好。请注意,这与
scipy.stats.qmc.discrepancy
不同,在后者中,较低的值对应于较高的样本质量。另请注意,当使用此函数比较不同的采样策略时,样本大小必须保持不变。
可以从最小生成树计算两个指标:平均边长和边长的标准差。使用这两个指标比单独使用任何一个指标更能反映均匀性,平均值较高且标准差较低更为理想(参见 [1] 的简要讨论)。此函数目前仅计算平均边长。
参考文献
[1]Franco J. 等人。“最小生成树:评估计算机实验设计质量的新方法。”《化学计量学与智能实验室系统》,97 (2),第164-169页,2009年。
示例
使用最小欧几里得距离(默认值)计算样本的质量:
>>> import numpy as np >>> from scipy.stats import qmc >>> rng = np.random.default_rng() >>> sample = qmc.LatinHypercube(d=2, seed=rng).random(50) >>> qmc.geometric_discrepancy(sample) 0.03708161435687876
使用最小生成树中的平均边长来计算质量:
>>> qmc.geometric_discrepancy(sample, method='mst') 0.1105149978798376
显示最小生成树和距离最小的点:
>>> import matplotlib.pyplot as plt >>> from matplotlib.lines import Line2D >>> from scipy.sparse.csgraph import minimum_spanning_tree >>> from scipy.spatial.distance import pdist, squareform >>> dist = pdist(sample) >>> mst = minimum_spanning_tree(squareform(dist)) >>> edges = np.where(mst.toarray() > 0) >>> edges = np.asarray(edges).T >>> min_dist = np.min(dist) >>> min_idx = np.argwhere(squareform(dist) == min_dist)[0] >>> fig, ax = plt.subplots(figsize=(10, 5)) >>> _ = ax.set(aspect='equal', xlabel=r'$x_1$', ylabel=r'$x_2$', ... xlim=[0, 1], ylim=[0, 1]) >>> for edge in edges: ... ax.plot(sample[edge, 0], sample[edge, 1], c='k') >>> ax.scatter(sample[:, 0], sample[:, 1]) >>> ax.add_patch(plt.Circle(sample[min_idx[0]], min_dist, color='red', fill=False)) >>> markers = [ ... Line2D([0], [0], marker='o', lw=0, label='Sample points'), ... Line2D([0], [0], color='k', label='Minimum spanning tree'), ... Line2D([0], [0], marker='o', lw=0, markerfacecolor='w', markeredgecolor='r', ... label='Minimum point-to-point distance'), ... ] >>> ax.legend(handles=markers, loc='center left', bbox_to_anchor=(1, 0.5)); >>> plt.show()