2016-05-19 13 views
1

Ich kenne Bibliothek wie Gsl Gaussian Verteilungen zu generieren und Zufallszahl basierend auf Gaußverteilung zu generieren. https://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html Ich wundere mich, wenn es eine Bibliothek gibt, die Zufallszahl erzeugen konnte Mischung Gaußverteilung und könnte die Wahrscheinlichkeit des gegebenen Wertes basierend auf Mischung Gaussverteilung zurückgeben? Vielen Dank. enter image description hereMischung der Gaußschen Verteilung in C++

folgende bis: es ist das gleiche, wenn ich zuerst eine Zufallszahl zwischen (0,1) erzeugen, wenn es in fällt (0, 0,5), I nur erzeugen Nummer eins Gaußschen Verteilung gehorchen, sonst Zahl erzeugen von der anderen Gaussverteilung. Ist dieser Prozess derselbe wie das Generieren der Zahlenmischung der beiden Gaussianer? (Unter der Annahme, das Gewicht ist gleich zwischen den beiden Gaußfunktionen)

+0

Jugging von der Grafik, die Sie gepostet haben, nehme ich an, dass Sie mit "Mischung" einfach die Summe von zwei Gaussi bedeuten? –

Antwort

1

Sie sind richtig: Sie können eine Probe aus dem Gaussian Mixture Model in zwei Schritten erzeugt:

  • Randomly entscheiden, aus der Gaußschen Verteilung, zur Probe in Abhängigkeit auf die Gemischgewichte.
  • Erstellen Sie eine Stichprobe aus der ausgewählten Gauß-Verteilung.

Hier ist ein Mindestarbeitsbeispiel der eingebauten Zufallszahlengeneratoren von C++:

#include <iostream> 
#include <random> 
#include <array> 

int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 

    using normal_dist = std::normal_distribution<>; 
    using discrete_dist = std::discrete_distribution<std::size_t>; 

    auto G = std::array<normal_dist, 3>{ 
     normal_dist{5.0, 0.1}, // mean, stddev of G[0] 
     normal_dist{8.0, 0.4}, // mean, stddev of G[1] 
     normal_dist{2.0, 0.3} // mean, stddev of G[2] 
    }; 
    auto w = discrete_dist{ 
     0.1, // weight of G[0] 
     0.6, // weight of G[1] 
     0.3 // weight of G[2] 
    }; 

    for (int n = 0; n < 100; ++n) { 
     // Create one sample of the Gaussian mixture model 
     auto index = w(gen); 
     auto sample = G[index](gen); 
     std::cout << sample << " "; 
    } 
    std::cout << '\n'; 
} 

Try it out here.

Verwandte Themen