Latin Hypercube Sampling
高次元空間で一様分布からランダムサンプリングをすると、球面集中現象によってサンプル点は空間の中心から一定の距離に集中しやすくなる
直感的には「高次元では体積のほとんどが外側にある」ため、点は内部よりも表面付近に多く配置される
結果的に内部の領域ではサンプル点が十分に得られず、偏りが発生してしまう
このような偏ったサンプリングを避ける方法が Latin Hypercube Sampling (LHS)
Latin Hypercube Sampling
サンプル数を $ n_s , 次元数を$ d として, $ [0, 1]^d 空間からサンプリングすることを考える
まず各次元を $ n_s 個に分割する
つまり区間$ [0,1] を$ I_j = \bigg[ \frac{j-1}{n_s}, \frac{j}{n_s} \bigg) に等分する
ただし $ j = 1, \cdots, n_s
例:$ n_s = 3 , $ d=2のとき
$ I_1 = \bigg[0, \frac{1}{3} \bigg) , $ I_2= \bigg[\frac{1}{3}, \frac{2}{3} \bigg) , $ I_3 = \bigg[\frac{2}{3}, 1 \bigg)
各次元ごとにランダム順列をつくる
各次元 $ k について、$ \{1, \cdots, n_s \} のランダム順列 $ \pi^{(k)} を生成する
例:$ n_s = 3 , $ d=2のとき
1次元目が $ \pi^{(1)} = ( 1, 3, 2 )
2次元目が $ \pi^{(2)} = ( 3, 2, 1 )
順列を使うことによって、各次元で各分割がちょうど1回ずつ使うことが保障される
2次元では、各列と各行に必ず1つだけ点が配置される(ラテン方格の性質)
得た順列を使って、サンプリングする層を選ぶ
サンプル $ i に割り振られる層のインデックスは $ j = \pi^{(k)}(i)
例:$ i=2 のとき
$ \pi^{(1)}(2) = 3 なので $ I_3
$ \pi^{(2)}(2) = 2 なので $ I_2
各次元で、選択された層の区間で一様乱数で乱数を一つずつ発生させればよい
一般化すると
サンプル $ i , 次元 $ k の値 $ x_{ik} は以下となる
$ x_{ik} = \frac{\pi^{(k)}(i) - 1}{n_s} + \frac{u_{ik}}{n_s}
$ u_{ik} \sim \text{Uniform}(0,1)
$ x_{ik} の初項は層$ I_j の左端
$ x_{ik} の第二項は層内でのランダムな位置
したがって常に $ x_{ik} \in I_{\pi^{(k)}(i)} が成り立つ
参考
https://chatgpt.com/c/68a77867-9d84-8329-b044-ae183c93c220
可視化してみる
https://minami-public-cbw8kxvgoe.vercel.app/pages/lhs
Claudeで作成 + 手動で微修正
https://claude.ai/chat/4dce1db6-3aaa-4c26-8910-32e482373103
LHSでは3次元でも各区間から均等にサンプリングできていることがわかる
https://gyazo.com/88848868fde732b9371ac4748f590e3d
https://gyazo.com/4b1c330c5af48736adf896b5bdf8c97e
Rでやる場合
code:R
library('lhs')
X = randomLHS(10000, 4) #4次元空間で10000件のサンプリング
Y1 = qunif(X,1, min=2, max=5)
Y2 = qunif(X,2, min=10, max=11)
Y3 = qunif(X,3, min=1.1, max=2.3)
Y4 = qunif(X,4, min=8, max=9.5)
c.f.
/minami-bookmarks/Latin Hypercube Samples - Questions
20220830
public