2010-01-16 11 views
23

Ortalama 0 ve sigma 1 ile normal bir dağıtma oluşturmak için boost :: normal_distribution kullanmaya çalışıyorum.Boost normal dağıtım sınıfları nasıl kullanılır?

Aşağıdaki kod, bazı değerler -1 ve 1'in üzerinde veya üstünde olduğu gibi çalışmıyor (ve olmamalı). Bir şey yanlış yaptığımı işaret edebilir mi? Benim makinede

#include <boost/random.hpp> 
#include <boost/random/normal_distribution.hpp> 

int main() 
{ 
    boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant) 

    boost::normal_distribution<> nd(0.0, 1.0); 

    boost::variate_generator<boost::mt19937&, 
          boost::normal_distribution<> > var_nor(rng, nd); 

    int i = 0; for (; i < 10; ++i) 
    { 
    double d = var_nor(); 
    std::cout << d << std::endl; 
    } 
} 

sonucudur:

0.213436 
-0.49558 
1.57538 
-1.0592 
1.83927 
1.88577 
0.604675 
-0.365983 
-0.578264 
-0.634376 

Eğer tüm değerler -1 ve 1.

şimdiden teşekkür ederiz arasındaki değildir görebileceğiniz gibi!

EDIT: Son teslim tarihleri ​​olduğunda ve uygulamayı yapmadan önce teoriden kaçınmak istediğinizde olan şey budur.

+7

Neredeyse tüm istatistiklerimi unuttum, ancak varyans (dağıtımın ctorunun ikinci parametresi olan) kesinlikle bir aralık için mutlak bir kesme belirtmiyor mu? İşlerin nasıl yayıldığının bir ölçüsüdür. –

+0

@Neil Butterworth: Yapıcıdaki ikinci parametre standart sapmadır (varyansın karekökü). – jason

+0

Eh, neredeyse her şeyi unuttuğumu söyledim! –

cevap

29

Aşağıdaki kod, bazı değerler -1 ve 1'in üzerinde veya üstünde (ve olmamalıdır) olduğu gibi çalışmaz. Bir şey yanlış yaptığımı işaret edebilir mi?

Resim bu standart sapması ve bir yanlış anlama normal dağılımın (yapıcı ikinci parametresi).

Normal dağılım, bilinen çan eğrisidir. Bu eğri size değerlerin dağılımını etkili bir şekilde söyler. Çan eğrisi tepe noktalarının yakın olduğu değerler, uzak değerlerden (dağıtımın kuyruğu) daha muhtemeldir.

Standart sapma, değerlerin ne kadar yayıldığını gösterir. Sayı ne kadar küçük olursa, daha konsantre değerler ortalamadadır. Sayı ne kadar büyükse, daha az yoğun olan değerler ortalamanın üzerindedir. Aşağıdaki resimde kırmızı eğrinin bir varyansa (varyansın standart sapmanın karesi) 0.2 olduğunu görüyorsunuz. Bunu, aynı ortama, ancak 1.0'lık bir varyansa sahip olan yeşil eğriyle karşılaştırın. Yeşil eğrideki değerlerin kırmızı eğriye göre daha fazla yayıldığını görebilirsiniz. Mor eğri, varyans 5.0'a sahiptir ve değerler daha da yayılmıştır.

Bu, değerlerin neden [-1, 1] ile sınırlı olmadığını açıklar. Bununla birlikte, değerlerin% 68'inin her zaman ortalama bir standart sapma içinde olduğu ilginç bir gerçektir. Dolayısıyla, kendiniz için ilginç bir test olarak, ortalama 0 ve varyans 1 ile normal bir dağılımdan çok sayıda değer çizmek için bir program yazın ve ortalamanın standart sapması içindeki sayıyı sayar. % 68'e yakın bir sayı almalısınız (% 68.2689492137% biraz daha hassas).

alt text

: boost documentation kaynaktan:

normal_distribution(RealType mean = 0, RealType sd = 1);

ile normal bir dağılım oluşturur ortalama ve standart sapma ortalama ± SD.

8

Yanlış bir şey yapmıyorsunuz. Normal bir dağılım için sigma, menzili değil, standart sapmasını belirtir. Yeterli örnek oluşturursanız, sadece yaklaşık , bunların% 68'inin [ortalama sigma, ortalama + sigma], 2 sigma içinde yaklaşık% 95, ve 3 sigma içinde% 99'dan fazla olduğunu göreceksiniz.

İlgili konular