4

指数分布を使用して、特定の間隔で乱数を生成したいと思います。私の問題は、 exprnd を使用すると間隔を制御できず、平均値しか提供できないことですが、それは私のニーズに合わないことです。別の機能がありますか、それとも私が使用しなければならないトリックがありますか?

4

3 に答える 3

2

これは役に立ちますか?(または、問題を誤解していますか?)

%#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);
于 2012-11-04T11:45:25.203 に答える
1

では指数分布がサポートされてい[0,+\infty)ます。でサポートされている確率変数であるように、測定可能な可逆マップ[0,1)を使用してそれを再マッピングすることをお勧めします。fY = f(X)[0,1)

問題: そのようなf.

私の提案は

 f(x) = 2/pi * arctan(x). 

関数は にarctanマップ(-\infty,\infty)され(-pi/2,pi/2)ます。正のサンプルのみを考慮しているため(X指数関数的に進むため)、でサンプルを取得し[0,pi/2)ます。したがって、 によって再スケーリングする必要があります2/pi。さらに、 のマクローリン展開は であるためarctanx+o(x)原点に十分に近い正確な指数関数のサンプルが得られます。

ここで、任意の指数からサンプリングし (つまり、任意の値を使用して\lambda- できれば小さい)、サンプルを評価fすると、好きなように集中するサンプルが得られます (つまり、指数に近い0またはほぼ指数に近い)。

于 2012-11-04T11:45:41.813 に答える
0

ここに提案があります:

lambda=1 で指数分布からサンプリングし、意図した間隔外の数値を拒否します。間隔が [0,1] の場合、その間隔で数値が得られる確率は ~0.63 です。これは、10 回のサンプル後に「良い」数値が得られる確率が 99% であることを意味します。

もう 1 つの可能性は、n を超える何かをサンプリングする確率が十分に小さくなるように、十分に大きな数 n を選択することです。ラムダ = 1 の場合、n=1000 で十分です。次に、指数関数からサンプリングし、それを a+(ba)*(sample/n) によってランダム サンプルに変換します。

于 2012-11-04T11:40:29.447 に答える