Düzgün rasgele değişken kullanarak Gauss rassal değişkenini uygulama


11

Ortalamaları ve varyansları göz önüne alındığında Gauss rastgele değerleri döndürecek bir C ++ işlevi yazmaya çalışıyorum.

Ve rand()arasında rastgele sayılar döndüren bir kütüphane işlevi vardır . sabit bir değere sahip değildir, ancak en az olacağı garanti edilir . PDF'si aynıdır.0RAND_MAXRAND_MAX2151

Bunu rand()bir Gauss değişkenine dönüştürmek için Merkezi Limit Teoremini kullanıyorum . Tam olarak ne yapıyorum rand()bir kullanıcı tarafından belirtilen kez çağırmak , sonra dönüş değerlerini toplamak, sonra ortalamasını kullanıcı tarafından belirtilen ortalamaya kaydırmaktır.

Gauss PDF
Yukarıdaki çizimde, Gaussian rastgele oluşturucumu kez aradım ve dönüş değerlerinin frekanslarını çizdim. Gördüğünüz gibi, varyansı çok büyük, çünkü diğer birçok rastgele değerin toplamı tarafından yaratıldı.107

Gaussian PDF ve belirtilen ortalama değeri olan Gauss değişkenini başarıyla döndürür. Ancak, sorun onun varyansıdır. Bu noktada takılıp kaldım, çünkü kullanıcı tarafından belirtilen değere olan varyansını nasıl değiştireceğimi bilmiyorum.

Bu benim kodum (şimdilik eksik; "Varyans" parametresi yok sayılır):

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

Bunun NUM_GAUSSIAN_SUMS100 ve RAND_MAX32767 olduğunu varsayın .

İşlevin parametresine göre rastgele değişkenin varyansını değiştirmek istiyorum. Sorum şu: Bu rastgele değişkenin varyansını nasıl değiştirebilirim? Nasıl yapabilirim?


3
Gauss rasgele değişkenleri oluşturmak için merkezi limit teoreminden daha iyi ve daha hızlı yollar vardır. Biri için Box-Muller yöntemini arayın; bir ziggurat yönteminin daha iyi olduğu söylenir.
Dilip Sarwate


3
Uygulama süresi önemli bir husus olduğu zaman Eskiden, insanlar toplamı olacaktır rastgele değişkenler (değil ) ve çıkarma standart için basit bir yaklaşım için daha sonra ölçek rastgele değişken ve bir almak için rastgele değişken. (Bunun neden işe yaradığını görmek için @ Hilmar'ın cevabına bakınız). Birçok uygulama için bu basit yöntem çok iyi çalıştı, ancak değerler aralıkla sınırlıydı ve bu basit fikir Six-Sigma bir moda kelimesi haline geldiğinde yol kenarına düştü. 12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ-6σ,μ+6σ)
Dilip Sarwate

@DilipSarwate belki de bu alternatifleri neden tercih edeceğimize dair bir gerekçe ile cevap olarak göndermelisiniz
Ivo Flipse

Cevabı @IvoFlipse sorusuna sordu "Ben ortalama sabit sonra nasıl varyans düzeltirim?" aslında Hilmar tarafından kabul edilen cevabın söylediği şey, yorumlarla değiştirildiği gibi: varyansı ölçekleyerek düzeltin ve sonra ortalamayı yeniden düzeltin veya daha iyisi, yeniden düzeltmek zorunda kalacağınız için öncelikle ortalamayı sabitleyerek başlamayın daha sonra; varyansı önce ölçekleyerek düzeltin ve ardından ortalamayı düzeltin. OP, daha iyi yöntemlerle ilgilendiğini ve Box-Muller yönteminin koduna bile sahip olan nibot'un bağlantısını bile iptal etmediğini göstermez. Yani şeyleri olduğu gibi bırakacağım.
Dilip Sarwate

Yanıtlar:


6

İlk algoritmanız 0 ile 1 arasında eşit olarak dağılmış rastgele bir değişken oluşturur. Bunun varyansı 1/12'dir. Bunun NUM_GAUSSIAN_SUMSörneklerini toplarsanız, varyans olacaktır NUM_GAUSSIAN_SUMS/12. Bir hedef varyansına ulaşmak için, Vtoplanan rastgele değişkeni ile çarpmanız gerekir sqrt(V*12/NUM_GAUSSIAN_SUMS).

Bir yan not olarak, bir şablon şamandıralar ve çiftler için makul şekilde çalışacaktır, ancak herhangi bir sabit nokta tipinde önemli sayısal problemler olacaktır.


5

bu rastgele değişkenin varyansını nasıl değiştirebilirim?

cXcXc2X


cXcX

1
Ortalayın, yeniden ölçeklendirin, ardından ortalamayı geri yükleyin. Ortalanmış rastgele bir değişkenin ölçeklendirilmesi (sıfır) ortalamasını etkilemez.
Emre

1

Başka bir yol daha var!

Bir düşünün, ya Gauss'un aksine başka bir dağıtım isteseydiniz? Bu durumda gerçekten Merkezi Limit teoremini kullanamazsınız; o zaman nasıl çözersin?

Düzgün rasgele değişkeni keyfi PDF'ye dönüştürmenin bir yolu vardır. Bu yönteme Ters Dönüşüm Yöntemi denir

U[0-1]

X=FX-1(U)

FX(x)

Bu nedenle, tek yapmanız gereken, üniform rv'nin örneğinden aldığınız değişkene ters CDF işlevini uygulamaktır.

Ayrıca, önceki yöntemlerden farklı olarak - bu herhangi bir yineleme gerektirmeyecek ve Gaussian'a daha yakın sonuçlar elde etmek için kaç yineleme alınacağına bağlı olmayacaktır.

İşte bunun kanıtı olan referanslardan biri .


3
> Başka bir yol daha var! Doğru, ama özellikle Gauss rasgele değişkenleri ile ilgili olan ele alınan soru ile alakasız. Ne Gauss CDF'si ne de tersi, sonlu sayıda işlem kullanılarak temel terimlerle ifade edilemez ve bu nedenle önerilen yöntem kullanılamaz.
Dilip Sarwate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.