境界線からスパンを均一にサンプリングするにはどうすればよいですか?

Aug 24 2020

有界で連続した線があるとします。たとえば、行に0〜3のすべての実数を含めることができます。次のように行からスパンをサンプリングするにはどうすればよいですか。

  • ライン上のどのポイントも、スパンに含まれる可能性は同じです。
  • スパン長の分布は均一です。

私が試みた解決策:

import random

max_length = 15.0
bounds = (0.0, 3.0)

length = random.uniform(0, max_length)
start = random.uniform(bounds[0] - length, bounds[1])
end = min(start + length, bounds[1])
start = max(start, bounds[0])

このソリューションは、2番目の基準ではなく、最初の基準を満たすことができます。

編集: BruceETのリードに続いて、スパンの長さの分布をプロットしました:

import random
from matplotlib import pyplot
import seaborn

max_length = 6
bounds = (0, 3)
num_samples = 10**6

samples = []
for _ in range(num_samples):
    length = random.uniform(0, max_length)
    start = random.uniform(bounds[0] - length, bounds[1])
    end = min(start + length, bounds[1])
    start = max(start, bounds[0])
    samples.append(end - start)

seaborn.distplot(
    samples,
    hist=True,
    kde=True,
    bins=30,
    color='darkblue',
    hist_kws={'edgecolor': 'black'},
    kde_kws={'linewidth': 1})
pyplot.show()

回答

3 BruceET Aug 24 2020 at 01:41

コメント:いくつかの均一確率変数の「スパン」が均一ではないため、2番目のシミュレーションで問題が発生しています。

Rでは、関数rangeはエンドポイントを提供し、差を取ることで「スパン」と呼ばれるものが提供されます。

これは、サイズの100,000サンプルからのスパン長のRでのシミュレーションです。 $n=5$ から $\mathsf{Unif}(0, 3).$

set.seed(2020)
span.5 = replicate(10^6, diff(range(runif(5,0,3))))
summary(span.5)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.07294 1.63716 2.05782 1.99968 2.41826 2.99932 
hist(span.5, prob=T, col="skyblue2")
curve((1/3)*dbeta(x/3, 4, 2), add=T, col="red", lwd=2)