3Dユニットボールに均一に分布したポイントを生成するにはどうすればよいですか?


11

以前の質問を投稿しましたが、これは関連していますが、別のスレッドを開始することをお勧めします。今回は、3次元の単位球内に均一に分布する点を生成する方法と、分布を視覚的および統計的に確認する方法について知りたいと思います。そこに掲載されている戦略がこの状況に直接転用できるとは思えません。


4
前の質問の手法は、原点からの距離内のポイントの数がr 3に比例する必要があることを確認すると、直接適用されます。あなたは独立した均一な変量生成したがって場合U[ 0 1 ]ポイントとともにWスケーリング、球体の表面上のwはによってU 1 / 3がトリックを行います。rr3u[0,1]wwu1/3
whuber

@whuber:たぶん、以前のテクニックの本質を理解できなかっただけかもしれません。あなたが説明したことを試してみましょう。さらに、ここで均一性を再度確認する方法は何ですか?
Qiang Li

2
@Qiang RipleyのK関数とカイ2乗検定。また、球の表面上の点の放射状投影の均一性、点の長さの立方体の均一性、およびこれら2つの独立性を確認することもできます。
whuber

私にとって、「均一に分散」の意味はそれほど明白ではありません...そしておそらくそれを定義しようとすると、自動的に生成アルゴリズムが作成されます(=

fR,Θ,Φ(r,θ,ϕ)=r2

回答:


14

43πr3=0.523...


+1。これは、comp.graphics.algorithms FAQ 「球上の均一なランダムポイント」で
David Cary

1
n>100

2
これは「拒否方法」と呼ばれます。27次元で3次元でうまく機能している間、27球にあるのは1兆ポイントに1点しかないため、27キューブの他の部分にはありません。そのため、拒否方法は一般化しません。私は現在、2,440次元のボールで均一にサンプルを必要としているので、これについて言及します。
Reb.Cabin

13

xyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2θsin(θ)/2

θ11

Rでは、これは次のようになります。

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

この回答を書いて編集する過程で、このソリューションは思ったより簡単ではないことに気付きました。

(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
拒絶反応がないため、これははるかに良い答えです。高次元空間では、受け入れの確率が低いため、拒否サンプリングは非常にコストがかかる可能性があります。
kingledion

2
コードの最後のビットは、より高い次元に適合させることができますd。このために、すべてのインスタンス置き換える3ことによってをd
gui11aume 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.