當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy qmc.PoissonDisk用法及代碼示例


本文簡要介紹 python 語言中 scipy.stats.qmc.PoissonDisk 的用法。

用法:

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

泊鬆盤采樣。

參數

d int

參數空間的維度。

radius 浮點數

對新候選者進行采樣時點之間保持的最小距離。

hypersphere {“volume”, “surface”},可選

用於生成要添加到最終樣本中的潛在候選者的抽樣策略。默認為“volume”。

  • volume:原始 Bridson 算法,如中所述[1]。對新候選人進行抽樣之內超球麵。

  • surface :僅對超球麵的表麵進行采樣。

ncandidates int

每次迭代采樣的候選數。更多候選者會導致更密集的采樣,因為每次迭代可以接受更多候選者。

optimization {無,“random-cd”,“lloyd”},可選

是否使用優化方案來提高采樣後的質量。請注意,這是一個後處理步驟,不能保證樣品的所有屬性都得到保留。默認為“無”。

  • random-cd:坐標的隨機排列以降低中心差異。基於中心差異的最佳樣本不斷更新。與使用其他差異度量相比,基於中心差異的采樣對 2D 和 3D 子投影顯示出更好的 space-filling 魯棒性。

  • lloyd:使用修改後的Lloyd-Max 算法擾動樣本。該過程收斂到等間隔的樣本。

seed {無,整數, numpy.random.Generator },可選

如果種子是 int 或 None,一個新的numpy.random.Generator是使用創建的np.random.default_rng(seed).如果種子已經是一個Generator實例,然後使用提供的實例。

注意

泊鬆盤采樣是一種迭代采樣策略。從種子樣本開始,在種子周圍的超球麵中對候選者進行采樣。低於一定半徑或域外的候選人將被拒絕。新樣本被添加到樣本種子池中。當池為空或達到所需樣本數量時,該過程停止。

樣本可以包含的最大點數直接與半徑。隨著空間維度的增加,更高的半徑可以使點分布得更遠,有助於克服維數災難。請參閱準蒙特卡羅教程更多細節。

警告

由於其迭代性質和內存要求,該算法更適合低維度和采樣大小。選擇高維度的小半徑意味著該空間比使用較低維度或較大半徑可以包含更多樣本。

部分代碼取自 [2],原作者 Shamis 於 2021 年 3 月 31 日書麵同意,可在 3 條款 BSD 下的 SciPy 中免費使用。

參考

[1]

Robert Bridson,“任意維度的快速泊鬆盤采樣”。西格圖,2007 年。

例子

使用半徑 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 樣本並顯示沒有點比半徑.radius/2用於可視化不相交的圓。如果兩個樣本正好位於半徑彼此距離,然後是它們的半徑圓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()
scipy-stats-qmc-PoissonDisk-1_00_00.png

這種可視化可以看作是圓形包裝:我們可以在空間中放置多少個圓形。這是一個np-hard問題。方法 fill_space 可用於添加樣本,直到無法添加更多樣本為止。這是一個難題,可能需要手動調整參數。注意維度:隨著維度的增加,填充空間所需的樣本數量呈指數增長(curse-of-dimensionality)。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.qmc.PoissonDisk。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。