指数分布を使用して、特定の間隔で乱数を生成したいと思います。私の問題は、 exprnd を使用すると間隔を制御できず、平均値しか提供できないことですが、それは私のニーズに合わないことです。別の機能がありますか、それとも私が使用しなければならないトリックがありますか?
3 に答える
これは役に立ちますか?(または、問題を誤解していますか?)
%#Set the parameters
T = 2000; %#Number of observations to simulate
Mu = 0.5; %#Exponential distribution parameter
LB = 0; %#Lower bound on exponential distribution
UB = 1; %#Upper bound on exponential distribution
%#Validate the parameters
if LB < 0 || UB < 0; error('Bounds must be non-negative'); end
if Mu <= 0; error('Mu must be positive'); end
%#Determine LB and UB in terms of cumulative probabilities
LBProb = expcdf(LB, Mu);
UBProb = expcdf(UB, Mu);
%#Simulate uniform draws from the interval LBProb to UBProb
Draw = LBProb + (UBProb - LBProb) .* rand(T, 1);
%#Convert the uniform draws to exponential draws using the inverse cdf
X = expinv(Draw, Mu);
では指数分布がサポートされてい[0,+\infty)
ます。でサポートされている確率変数であるように、測定可能な可逆マップ[0,1)
を使用してそれを再マッピングすることをお勧めします。f
Y = f(X)
[0,1)
問題: そのようなf
.
私の提案は
f(x) = 2/pi * arctan(x).
関数は にarctan
マップ(-\infty,\infty)
され(-pi/2,pi/2)
ます。正のサンプルのみを考慮しているため(X
指数関数的に進むため)、でサンプルを取得し[0,pi/2)
ます。したがって、 によって再スケーリングする必要があります2/pi
。さらに、 のマクローリン展開は であるためarctan
、x+o(x)
原点に十分に近い正確な指数関数のサンプルが得られます。
ここで、任意の指数からサンプリングし (つまり、任意の値を使用して\lambda
- できれば小さい)、サンプルを評価f
すると、好きなように集中するサンプルが得られます (つまり、指数に近い0
またはほぼ指数に近い)。
ここに提案があります:
lambda=1 で指数分布からサンプリングし、意図した間隔外の数値を拒否します。間隔が [0,1] の場合、その間隔で数値が得られる確率は ~0.63 です。これは、10 回のサンプル後に「良い」数値が得られる確率が 99% であることを意味します。
もう 1 つの可能性は、n を超える何かをサンプリングする確率が十分に小さくなるように、十分に大きな数 n を選択することです。ラムダ = 1 の場合、n=1000 で十分です。次に、指数関数からサンプリングし、それを a+(ba)*(sample/n) によってランダム サンプルに変換します。