2012-04-27 25 views
8

He escrito una simulación en C++ que genera (1,000,000)^2 números de una distribución de probabilidad específica y luego hace algo con ellos. Hasta ahora he usado distribuciones Exponencial, Normal, Gamma, Uniforme y Poisson. Aquí está el código para uno de ellos:Números aleatorios de la distribución Beta, C++

#include <boost/random.hpp> 

...main... 

    srand(time(NULL)) ; 
    seed = rand(); 
    boost::random::mt19937 igen(seed) ; 
    boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> > 
    norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ; 

Ahora necesito ejecutarlo para la distribución Beta. Todas las distribuciones que he hecho hasta ahora tomaron de 10 a 15 horas. La distribución Beta no está en el paquete boost/random así que tuve que usar el paquete boost/math/distributions. Encontré this page on StackOverflow que propuso una solución. Aquí está (copiado):

#include <boost/math/distributions.hpp> 
using namespace boost::math; 
double alpha, beta, randFromUnif; 
//parameters and the random value on (0,1) you drew 
beta_distribution<> dist(alpha, beta); 
double randFromDist = quantile(dist, randFromUnif); 

Lo repliqué y funcionó. Las estimaciones de tiempo de ejecución de mi simulación son lineales y predecibles con precisión. Dicen que esto durará 25 días. Veo dos posibilidades: 1. El método propuesto es inferior a la que estaba usando anteriormente para otras distribuciones 2. la distribución Beta es simplemente mucho más difícil de generar números aleatorios desde

Desnudo en cuenta que tengo debajo de un mínimo comprensión de la codificación C++, por lo que las preguntas que estoy haciendo pueden ser tontas. No puedo esperar un mes para completar esta simulación, entonces ¿hay algo que pueda hacer para mejorar eso? Tal vez use el método inicial que estaba usando y modifíquelo para trabajar con el paquete boost/math/distributions? Ni siquiera sé si eso es posible.

Otra información que puede ser útil es que los parámetros son los mismos para todos (1,000,000)^2 de los números que necesito generar. Estoy diciendo esto porque la distribución Beta tiene un PDF desagradable y quizás el conocimiento de que los parámetros están corregidos se puede usar de alguna manera para simplificar el proceso. Solo una suposición al azar.

Respuesta

5

La distribución beta está relacionada con la distribución gamma. Sea X un número aleatorio extraído de Gamma (α, 1) e Y de Gamma (β, 1), donde el primer argumento para la distribución de gamma es el parámetro de forma. Entonces Z = X/(X + Y) tiene distribución Beta (α, β). Con esta transformación, solo debería tomar el doble de tiempo que su prueba de distribución de rayos gamma.

Nota: Lo anterior asume la representación más común de la distribución gamma, Gamma (forma, escala). Tenga en cuenta que las diferentes implementaciones del generador aleatorio de distribución gamma variarán con el significado y el orden de los argumentos.

+0

Gracias, no estaba al tanto de esa propiedad. También he usado el hecho de que la distribución gamma es solo una suma de exponenciales. Su sugerencia cambió el tiempo de ejecución de 600 a 40 horas. ¡Gracias! – jaff

+0

Usando la notación estándar, ¿no debería ser Gamma (α, 1) y Gamma (β, 1) en lugar de Gamma (1, α) y Gamma (1, β)? Es decir, los α y β deberían ser parámetros de forma, no parámetros de escala. – BenRI

+0

@BenRI - Existen múltiples formas de parametrizar la distribución gamma. Uno de los más utilizados es 'gamma (shape_factor, scale_factor)', y con este uso, estás en lo cierto. Ese factor de escala también puede ser una tasa o una media. Otros especifican la forma como el segundo argumento (pero aparentemente no es tan ampliamente utilizado). Actualizaré mi respuesta para reflejar la notación más común e indicar que el argumento de forma es la clave. –

0

Intente compilar con optimización. Usar una bandera -O3 generalmente acelerará las cosas. Consulte esto post on optimisation flags o this overview para obtener un poco más de detalle.

+5

Primero debe preguntar a OP en un comentario si realmente está usando indicadores de optimización. – mfontanini

2

Si desea una distribución que es muy similar a beta, pero tiene una muy simple CDF de forma cerrada inversa, vale la pena considerar la distribución Kumaraswamy:

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

Se utiliza como una alternativa a la Distribución beta cuando se requiere una gran cantidad de muestras aleatorias rápidamente.

Cuestiones relacionadas