3次元単位球の表面に均一に分布した点を生成する方法を疑問に思っていますか?また、これらのポイントを生成した後、それらが表面真に均一であるかどうかを視覚化して確認する最良の方法は何ですか?
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
そして v = v/v.norm(10000)
3次元単位球の表面に均一に分布した点を生成する方法を疑問に思っていますか?また、これらのポイントを生成した後、それらが表面真に均一であるかどうかを視覚化して確認する最良の方法は何ですか?
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
そして v = v/v.norm(10000)
回答:
標準的な方法は、3つの標準法線を生成し、それらから単位ベクトルを構築することです。つまり、および場合、は一様に球体に分布しています。この方法は、次元の球体にも適しています。λ 2 = X 2 1 + X 2 2 + X 2 3(X 1 / λ 、X 2 / λ 、X 3 / λ )D
3Dでは、リジェクションサンプリングを使用できます。の長さが1以下になるまで、均一な分布からを描画します。その後、前述の方法と同様に、ベクトルを単位長に正規化します。球面ポイントあたりの予想試行回数は、 = 1.91です。高次元では、予想される試行回数が非常に多くなるため、急速に実行不可能になります。 [ - 1 、1 ] (X 1、X 2、X 3)2 3 /(4 π / 3 )
均一性をチェックする方法はたくさんあります。きちんとした方法は、多少計算負荷がかかりますが、リプリーのK関数を使用します。球上の任意の場所の(3Dユークリッド)距離内にある点の予想数は、距離内の球の面積に比例します。これは等しくなります。すべての点間距離を計算することにより、データをこの理想と比較できます。ρ π ρ 2
統計グラフィックスを構築する一般的な原則は、比較を行う良い方法として、分散安定化残差をに対してプロットすることをここで、は相互距離の最小ので、です。プロットはゼロに近いはずです。(このアプローチは型破りです。)I = 1 、2 、... 、N (N - 1 )/ 2 = m個のD [ I ] I 番目のE I = 2 √
以下は、最初の方法で得られた均一な球面分布からの100の独立したドローの写真です。
距離の診断プロットは次のとおりです。
yスケールは、これらの値がすべてゼロに近いことを示しています。
このような100個のプロットの累積は、サイズの偏差が実際に不均一性の重要な指標になる可能性があることを示唆しています。
(これらのプロットはブラウン橋のようにひどく見えます...ここに潜んでいる興味深い理論的発見があるかもしれません。)
最後に、100個の均一なランダムポイントに加えて、上半球にのみ均一に分布する別の41個のポイントの診断プロットを示します。
均一な分布と比較して、1つの半球の範囲までの平均点間距離の大幅な減少を示しています。それ自体は無意味ですが、ここで役立つ情報は、何かが1つの半球のスケールで不均一であるということです。実際、このプロットは、一方の半球の密度が他方と異なることを容易に検出します。(無限大の可能性のある半球のうち、どの半球をテストするかを事前に知っていれば、より簡単なカイ2乗検定でより強力になります。)
以下は、かなり単純なRコードです。
n <- 100000 # large enough for meaningful tests
z <- 2*runif(n) - 1 # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi # uniform on [-pi, pi]
x <- sin(theta)*sqrt(1-z^2) # based on angle
y <- cos(theta)*sqrt(1-z^2)
構造からあり、であることがわかりますが、テストする必要がある場合は
mean(x^2+y^2+z^2) # should be 1
var(x^2+y^2+z^2) # should be 0
そして、とそれぞれが(明らかに)に均一に分布していることをテストするのは簡単です。
plot.ecdf(x) # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)
明らかに、値が与えられると、とは半径円の周りに均一に分布し、これはそれらの比率のアークタンジェントの分布を調べることでテストできます。ただし、はおよびと同じ周辺分布を持っているため、どのペアについても同様のステートメントが当てはまり、これもテストできます。
plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))
それでも確信が持てない場合、次のステップは、任意の3D回転または特定の立体角内にあるポイントの数を調べることですが、それはより複雑になり始め、不要であると思います。
3D球体(3Dボールの表面)に均一に分布した点をサンプリングする場合は、単純な拒否、またはMarsagliaの方法(Ann。Math。Statist。、43(1972)、pp。645– 646)。低次元の場合、棄却率は非常に低くなります。
高次元の球体とボールからランダムポイントを生成する場合、シミュレーションの目的とスケールに依存します。大規模なシミュレーションを実行したくない場合は、Mullerの方法(Commun。ACM、2(1959)、pp。19–20)またはその「ボール」バージョン(上記のHarman&Lackoの論文を参照)を使用してください。あれは:
n球(表面)に均一に分布するサンプルを取得するには1)n次元の標準正規分布からXを生成する2)Xの各成分をXのユークリッドノルムで除算する
nボール(内部)に均一に分布するサンプルを取得するには1)(n + 2)次元の標準正規分布からXを生成します2)Xの各成分をXのユークリッドノルムで除算し、最初のn成分のみを取得します
大規模なシミュレーションを実行する場合は、より専門的な方法を調査する必要があります。リクエストに応じて、この議論で言及したいくつかのアルゴリズムの分類と一般化を提供する条件付き配布方法に関するHarmanとLackoの論文をお送りします。連絡先は私のウェブサイト(http://www.iam.fmph.uniba.sk/ospm/Lacko)で入手できます。
Youtポイントがボールの表面または内部で本当に均一であるかどうかを確認する場合は、周辺を見てください(回転不変性のため、投影されたサンプルの2乗ノルムはベータ分布です)。
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
そして v = v/v.norm(10000)
私は博士号取得中に同様の問題(n球体)を経験し、地元の「専門家」の1人がnキューブからの拒絶サンプリングを提案しました!もちろん、私がnをhunderdsの順に見ていたので、これは宇宙の時代をとっていただろう。
最終的に使用したアルゴリズムは非常にシンプルで、以下で公開されています。
n球からのWP PetersenおよびA. Bernasconic Uniformサンプリング:等方性手法テクニカルレポート、TR-97-06、スイス科学センター
私が見たことのない参考文献にもこの論文があります。役に立つかもしれません。
Harman、R.&Lacko、V.球と球からの均一サンプリングの分解アルゴリズムについてJournal of Multivariate Analysis、2010
私は以前にこの問題を抱えていましたが、ここに私が見つけた代替案があります、
分布自体については、うまく機能することがわかった公式は、極座標を使用し(実際に開発したポーラー座標のバリエーションを使用する)、次にデカルト座標に変換することです。
もちろん、半径はプロットする球体の半径です。次に、平面上の角度の2番目の値があり、その平面の上または下の角度である3番目の値が続きます。
適切な分布を得るには、Uが一様に分布した乱数、rが半径、aが2番目の極座標、bが3番目の極座標であると仮定します。
a = U * 360 b = U + U-1その後、x = r * sin(b)sin(a)z = r sin(b)cos(a)y = r sin(b)を介してデカルトに変換
最近、数学的にはa = 2(pi)* U b = cos ^ -1(2U-1)の方が良いとわかりました
私の学位は度とラジアンですが、実際には私の元の式と大差はありません。
この最新バージョンはハイパースフィアに使用できると思われますが、その実現方法については言及されていません。
Homeworld 2のマップを作成し、それらのマップを「再生」するというかなり安価な方法で、視覚的に均一性をチェックしますが。実際、マップはluaスクリプトで作成されているため、数式をマップに直接組み込み、ゲームを離れることなく複数のサンプリングをチェックできます。おそらく科学的ではありませんが、結果を視覚的に見るには良い方法です。
私の最善の推測は、最初に2次元空間に均一に分布した点のセットを生成し、次に何らかの投影を使用してそれらの点を球の表面に投影することです。
おそらく、ポイントを生成する方法とマップする方法を組み合わせて一致させる必要があります。2Dポイント生成の観点からは、スクランブルされた低差異のシーケンスは開始するのに適した場所(つまり、スクランブルされたSobolシーケンス)になると思います。どのタイプのマッピングを使用するのかはわかりませんが、WoflramがGnonomicプロジェクションをポップアップしました...それでうまくいくかもしれません。
MATLABには、を使用q = sobolset(2)
して生成したり、を使用してスクランブルしたりできる低不一致シーケンスの適切な実装がありますq = scramble(q)
。MATLABには、マッピングとグラフィックスを自分でコーディングしたくない場合に使用できるさまざまな投影関数を備えたマッピングツールボックスもあります。