ディスク上の均一な分布をシミュレートする


24

私は、円の任意の部分に欠陥がある可能性が同じになるように、円内のランダムなポイントの注入をシミュレートしようとしました。円を等面積の長方形に分割すると、結果の分布の面積あたりのカウントがポアソン分布に従うと予想しました。

円形領域内にポイントを配置するだけなので、極座標で2つの均一なランダム分布を注入しました:(半径)と(極角)。Rθ

しかし、この注入を行った後、私は明らかに、エッジと比較して円の中心により多くのポイントを取得します。

ここに画像の説明を入力してください

ポイントがサークル全体にランダムに分散されるように、円全体にこの注入を実行する正しい方法は何でしょうか?


:この質問は、幾何学フォーラムでの正確なアナログ持っmath.stackexchange.com/questions/87230/...
Aksakal

回答:


35

点の割合は、原点までの距離ではなく、面積に均一に比例する必要があります。面積は平方距離に比例するため、均一なランダム半径を生成し、平方根取ります。 それを均一な極角と組み合わせます。

これはコーディングが迅速かつ簡単で、実行が効率的で(特に並列プラットフォームで)、指定された数のポイントを正確に生成します。

これはR、アルゴリズムを説明するための作業コードです。

n <- 1e4
rho <- sqrt(runif(n))
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

ここに画像の説明を入力してください


3

拒否サンプリングを使用できます。これは、2D均一分布からサンプリングし、ディスク条件を満たすサンプルを選択できることを意味します。

以下に例を示します。

x=runif(1e4,-1,1)
y=runif(1e4,-1,1)

d=data.frame(x=x,y=y)
disc_sample=d[d$x^2+d$y^2<1,]
plot(disc_sample)

ここに画像の説明を入力してください


3
これは、OPが取ったアプローチの優れた代替手段です。シンプルで効率的。ただし、極座標法を変更して均一に分布した変量を生成する方法に関する問題は、実際には解決していません。なぜ気にするのでしょうか?含意のため:極座標で均一に分布した点を生成する方法を知ったら、極座標で拒絶サンプリング(および他のよく知られた方法)を使用して、デカルト座標でサンプリングするのが非常に複雑な可能性のある領域からサンプリングできます(ハイポサイクロイドを考えてください) 、 例えば)。
whuber

1
また、ディスク内に10,000ポイントを生成していないことに注意してください。ポイント数は、 10,000に近いランダムな値です。これを回避する効率的な方法がありますが、それらを実装するとアルゴリズムが複雑になります。π/4
whuber

@whuber答えをコメントして教えてくれてありがとう!
ハイタオデュ

3

もちろん、2次元の場合にも有効な一般的なn次元の答えを示します。3次元では、ディスクの類似物は固体ボール(球)のボリュームです。

これから説明する2つのアプローチがあります。そのうちの1つを「正確」と呼び、Rで完全なソリューションを取得します。2つ目はヒューリスティックと呼びますが、これは単なるアイデアであり、完全なソリューションは提供されません。

「正確な」ソリューション

私の解決策はマルサリアとミュラーの作品に基づいてます。基本的には、ノルムに正規化されたガウスベクトルがd次元超球面上の均一に分布した点を与えるように発生します。

ここに画像の説明を入力してください

d1/d

n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")

ここに画像の説明を入力してください

以下は、3Dケースのコードスニペット、つまりソリッドボールです。

library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk

d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)

scatterplot3d(x[,1], x[,2], x[,3])

ここに画像の説明を入力してください

発見的アプローチ

VnR=πn2Γn2+1Rn
Rn

=1dバツ2<R2

私が提案する解決策は、中心付近のポイントをオーバーサンプリングして除去サンプリングを使用することです。ランダムな均一サンプルのデカルト座標の1つをボールの内側から見ている場合、その分布は分散ガウスに収束することがわかります。1d+2


@Silverfish、あなたは右、私は言語に固定している
Aksakal

それは別の対象だけれども@Silverfish、それは、ガウスは、変量の使用に起因する遅いですが、速く多くに明らかにされていません、高次元の場合は、単純な棄却サンプリング、より可能性
Aksakal

1/dd

@whuber、私はコピーペーストで、キューブパワーのタイプミスを修正しました。我々はガウスを使用する場合、拒否サンプリングは良くないが、我々は速いガウスよりも使用に何かベル形を持っていると思いますので、あなたのしている右
Aksakal

0

以下に代替ソリューションを示しRます。

n <- 1e4
## r <- seq(0, 1, by=1/1000)
r <- runif(n)
rho <- sample(r, size=n, replace=T, prob=r)
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

ここに画像の説明を入力してください


4
この答えをわかりやすい英語で説明できますか?私たちは実際にはコードヘルプサイトではありません。コードのみの回答は推奨されません。
GUNG -復活モニカ

5
01r <- seq(0, 1, by=1/10)

1
@whuberそれを指摘してくれてありがとう。それは実際にソリューションの私の主なアイデアです。私のアプローチは、さまざまな半径の均一な円を多数生成することでした。各円について、ポイントの数はその半径の長さに比例します。したがって、異なる半径の円の単位長さでは、ポイントの数は同じです。離散的な性質を避けるために、rUniform(0,1)からサンプリングできます。
Q_Li
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.