scipy.stats.qmc.
geometric_discrepancy#
- scipy.stats.qmc.geometric_discrepancy(sample, method='mindist', metric='euclidean')[source]#
基於幾何特性的給定樣本的差異性。
- 參數:
- samplearray_like (n, d)
用於計算差異性的樣本。
- method{“mindist”, “mst”}, optional
要使用的方法。選項之一為
mindist
代表最小距離(預設值)或mst
代表最小生成樹。- metricstr 或 callable, optional
要使用的距離度量。請參閱
scipy.spatial.distance.pdist
的文件,以取得可用的度量和預設值。
- 返回:
- discrepancyfloat
差異性(值越高表示樣本均勻性越高)。
另請參閱
筆記
差異性可以作為隨機樣本品質的簡單度量。此度量基於樣本中點分佈的幾何特性,例如任何點對之間的最小距離,或最小生成樹中的平均邊長。
值越高,參數空間的覆蓋率越好。請注意,這與
scipy.stats.qmc.discrepancy
不同,後者中較低的值對應於較高的樣本品質。另請注意,當使用此函數比較不同的抽樣策略時,樣本大小必須保持恆定。
可以從最小生成樹計算兩個度量:平均邊長和邊長的標準差。使用這兩個度量比單獨使用任一度量更能提供均勻性的完整圖像,其中較高的平均值和較低的標準差更佳(參見 [1] 以獲得簡要討論)。此函數目前僅計算平均邊長。
參考文獻
[1]Franco J. et al. “Minimum Spanning Tree: A new approach to assess the quality of the design of computer experiments.” Chemometrics and Intelligent Laboratory Systems, 97 (2), pp. 164-169, 2009.
範例
使用最小歐幾里得距離(預設值)計算樣本的品質
>>> import numpy as np >>> from scipy.stats import qmc >>> rng = np.random.default_rng() >>> sample = qmc.LatinHypercube(d=2, rng=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()