Generación de Variables Aleatorias

11  18  Descargar (0)

Texto completo

(1)

Generación de Variables Aleatorias

A continuación se exponen distintos métodos para generar algunas de las distribuciones más utilizadas.

Método de la distribución inversa

Teniendo una función de densidad de probabilidad f(x), según la cual queremos generar números al azar, y su función de densidad acumulada F(x), en este método se elige un número u aleatorio con distribución uniforme en el intervalo [0,1], se pide que F(x)=u y se resuelve para obtener x=F-1(u).

F(x): Función de distribución continua e inversible

U: Variable aleatoria con distribución uniforme [0,1]

Entonces X=F-1(U).

Distribución uniforme entre a y b

𝑓(𝑥) { 1 𝑏 − 𝑎 𝑎 ≤ 𝑥 ≤ 𝑏 0 ∀ 𝑜𝑡𝑟𝑜 𝑥 𝐹(𝑥) { 0 𝑥 < 𝑎 𝑥 − 𝑎 𝑏 − 𝑎 𝑎 ≤ 𝑥 ≤ 𝑏 1 𝑥 > 𝑏 Despejando x obtenemos: 𝑥 − 𝑎 𝑏 − 𝑎 = 𝑢 ⇒ 𝑥 = 𝑢 (𝑏 − 𝑎) + 𝑎

(2)

Probamos el cambio de variable en Matlab generando 100.000 números al azar con una distribución uniforme entre 0 y 1, y lo llevamos a una distribución uniforme entre 4 y 10.

Código Matlab-Octave cant = 100000; u = rand(1,cant); a= 4; b= 10; x = u*(b-a)+a;

xlabel('Variable aleatoria x','FontSize',12,'FontName','Arial'); ylabel('Cant. ocurrencias','FontSize',12,'FontName','Arial'); hold on; cantIntervalos=b-a; [counts,centers]=hist(x,cantIntervalos); bar(centers,counts);

Distribución Exponencial Negativa

𝑓(𝑥) = {𝜆𝑒−𝜆𝑥 𝑥 ≥ 0 0 𝑥 < 0 𝐹(𝑥) = { 0 𝑥 < 0 1 − 𝑒−𝜆𝑥 𝑥 ≥ 0 Despejando x obtenemos: 1 − 𝑒−𝜆𝑥= 𝑢 ⇒ 𝑥 = −1 𝜆ln (1 − 𝑢)

Probamos el cambio de variable en Matlab generando 100.000 números al azar con distribución exponencial negativa suponiendo media 1.

(3)

Código Matlab-Otave cant = 100000; cantIntervalos=40; lambda = 1; u = rand(1,cant); x = -1*log(1-u)/lambda; xlabel('Variable aleatoria','FontSize',12,'FontName','Arial'); ylabel('Cant. ocurrencias','FontSize',12,'FontName','Arial'); hold on; [counts,centers]=hist(x,cantIntervalos); bar(centers,counts)

(4)

Distribución Normal

Para la distribución normal vamos a calcular analíticamente la función inversa a la función de probabilidad acumulada, y muestrear algunos puntos de la misma.

Los puntos rojos indican los pares ordenados a tomar para muestrear la función de cambio de variable y poder generar la distribución. (0,-5) (0.00003,-4) (0.00135,-3) (0.00621,-2.5) (0.02275,-2) (0.06681,-1.5) (0.11507,-1.2) (0.15866,-1) (0.21186,-0.8) (0.27425,-0.6) (0.34458,-0.4) (0.42074,-0.2) (0.5,0) (0.57926,0.2) (0.65542,0.4) (0.72575,0.6) (0.78814,0.8) (0.84134,1) (0.88493,1.2) (0.93319,1.5) (0.97725,2) (0.99379,2.5) (0.99865,3) (0.99997,4 1,5)

Probando en Matlab u Octave la función de cambio de variable generada a partir de la interpolación de puntos, obtenemos el siguiente histograma:

(5)

Si 𝑥: 𝑁 (𝜇, 𝜎) y se define la función de transformación lineal 𝑦 = 𝑎𝑥 + 𝑏 (con a distinto de cero) Entonces la función de densidad de probabilidad de 𝑦 será 𝑁(𝑎𝜇 + 𝑏, |𝑎|𝜎)

Otros métodos que podemos utilizar para generar una variable aleatoria con distribución normal son los siguientes:

Utilizando el Teorema Fundamental del límite. Versión de Linderberg

Sen 𝑥1, 𝑥2, 𝑥3, … , 𝑥𝑛 variables aleatorias independientes distribuidas idénticamente, siendo:

𝜇1= 𝜇2= 𝜇3= ⋯ = 𝜇𝑛= 𝜇 𝜎12= 𝜎22= 𝜎32= ⋯ 𝜎𝑛2= 𝜎2 Y se define 𝑦 =∑𝑛𝑖=1𝑥𝑖−𝑛𝜇 √𝜇 𝜎 𝑛→∞ ⇒ 𝑓(𝑦) ≈ 𝑁(0,1)

Para la distribución uniforme(0,1) tenemos: 𝜇 =1 2 𝜎 2= 1 12 ⇒ 𝜎 = 1 √12 Código Matlab-Octave cant = 100000; u = zeros(1,cant); cantSuma=100; for i=1:cantSuma u = u + rand(1,cant); end u = (u - cantSuma/2) / (sqrt(cantSuma)/sqrt(12));

xlabel('Variable aleatoria y','FontSize',12,'FontName','Arial'); ylabel('Cant. ocurrencias','FontSize',12,'FontName','Arial'); hold on;

[counts,centers]=hist(u,-5:0.5:5); bar(centers,counts);

(6)

Transformada de Box-Muller

Permite, a partir de dos variables independientes con distribución uniforme(0,1), generar dos variables independientes con distribución normal standard.

𝑧1= √−2𝑙𝑛(𝑢1) cos(𝑢2) 𝑧2= √−2𝑙𝑛(𝑢1) sen(𝑢2) Código Matlab-Octave pi2=2*pi; cant=100000; n1=zeros(1,cant); n2=zeros(1,cant); for i=1:cant u1=rand(1,1); u2=rand(1,1); n1(i)=sqrt(-2*log(u1))*cos(pi2*u2); n2(i)=sqrt(-2*log(u1))*sin(pi2*u2); end

xlabel('Variable aleatoria n1','FontSize',12,'FontName','Arial'); ylabel('Cant. ocurrencias','FontSize',12,'FontName','Arial'); hold on;

[counts,centers]=hist(n1,-5:0.5:5); bar(centers,counts);

(7)

Distribuciones Empíricas

Muchas veces las funciones de distribución de probabilidad no corresponden a alguna de las funciones conocidas y tenemos que definirlas a partir de los datos relevados.

Un ejemplo que muchas veces se da es que el comportamiento de los clientes dentro de un sistema se lo puede clasificar en varias categorías.

Por ejemplo:

Tipo de cliente Probabilidad

1 30 %

2 20 %

3 10 %

4 35 %

5 5 %

Utilizando el método de la transforma inversa obtenemos la siguiente función:

𝑓(𝑥) { 1 0 ≤ 𝑥 < 0.3 2 0.3 ≤ 𝑥 < 0.5 3 0.5 ≤ 𝑥 < 0.6 4 0.6 ≤ 𝑥 < 0.95 5 0.95 ≤ 𝑥 < 1 𝑐𝑜𝑛 𝑥: 𝑈(0,1)

(8)

Método de aceptación o rechazo

Fuente: Performance Modeling and Design of Computer Systems – Mor Harchol - Balter

Este método consiste en generar números aleatorios, utilizando una función de distribución de probabilidades simple de generar, aceptarlos o no en función de una probabilidad de forma que los valores aceptados sigan la ley de probabilidades que se desea generar.

Método de aceptación o rechazo para variables discretas

Partiendo de la función de distribución de probabilidades Q deseamos obtener números aleatorios que sigan la función de distribución de probabilidades P

1. Encontrar una variable aleatoria Q para la cual 𝑞𝑗 > 0 ⇔ 𝑝𝑗> 0

2. Considerando una constante c tal que 𝑝𝑗

𝑞𝑗≤ 𝑐

3. Utilizando Q generamos un número aleatorio j

4. Generamos otra variable aleatoria u con distribución uniforme Si 𝑢 <𝑐𝑞𝑝𝑗

𝑗 entonces aceptamos que j como generado según la ley de probabilidades P sino calculamos otro j

Método de aceptación o rechazo para variables contínuas

Partiendo de la función de distribución de probabilidades 𝒀(𝒕) deseamos obtener números aleatorios que sigan la función de distribución de probabilidades 𝑿(𝒕)

1. Encontrar un función de distribución de probabilidad 𝑌(𝑡) para la cual 𝑌(𝑡) > 0 ⇔ 𝑋(𝑡) > 0 2. Considerar una constante c tal que 𝑋(𝑡)𝑌(𝑡)≤ 𝑐

3. Utilizando 𝑌(𝑡) generamos un número aleatorio j

4. Generamos una variable aleatoria u con distribución uniforme Si 𝑢 < 𝑋(𝑡)

𝑐𝑌(𝑡) entonces aceptamos que j como generado según la ley de probabilidades 𝑋(𝑡) sino calculamos

(9)

Ejemplo 1

Se necesita generar una variable aleatoria x con la siguiente función de distribución de probabilidad 𝑋(𝑡) = 20𝑡(1 − 𝑡)3 𝑐𝑜𝑛 0 < 𝑡 < 1

Para determinar c podemos considerar 𝑚𝑎𝑥𝑡{ 𝑋(𝑡)

𝑌(𝑡)} = 𝑚𝑎𝑥𝑡{20𝑡(1 − 𝑡)

3}

Derivando podemos encontrar el punto máximo 𝑑(20𝑡(1 − 𝑡)3) 𝑑𝑡 = 0 ⇒ 𝑡 = 1 4 ⇒ 𝑐 ≥ 𝑋 (14) 𝑌 (14) ⇒ 𝑢𝑡𝑖𝑙𝑖𝑧𝑎𝑚𝑜𝑠 𝑐 =135 64

(10)

Código Matlab-Octave c=135/64; cant=100000; j=1; while(j<=cant) r1=rand; r2=rand; if ((20*r1*power(1-r1,3)/c)>=r2) v(j)=r1; j++; endif endwhile

xlabel('Variable aleatoria Y','FontSize',9,'FontName','Arial'); ylabel('Cant. ocurrencias X','FontSize',9,'FontName','Arial'); hold on; [counts,centers]=hist(v,20); g=bar(centers,counts); set(g, "facecolor",[0 0 0.7]); Ejemplo 2

Generación de una variable aleatoria con distribución Normal Standard. 𝑋(𝑡) = 2

√2𝜋𝑒

−𝑡2

2 para − ∞ < 𝑡 < ∞

La idea es utilizar un función 𝑌(𝑡) conocida que se ajuste razonablemente bien la función normal, y como queremos que 𝑌(𝑡) > 0 ⇔ 𝑋(𝑡) > 0 debemos utilizar una función que abarque todo el dominio de t. Si consideramos

𝑋(𝑡) = 2 √2𝜋𝑒

−𝑡2

2 para 𝟎< 𝑡 < ∞

Podemos utilizar 𝑌(𝑡) = 𝑒−𝑡 para 0 < 𝑡 < ∞ y una vez que hayamos generado nuestra variable X la multiplicaremos por -1 con probabilidad 0.5 para llevar el dominio de t a −∞ < 𝑡 < ∞

Para determinar c podemos considerar 𝑚𝑎𝑥𝑡{ 𝑋(𝑡) 𝑌(𝑡)} = 𝑚𝑎𝑥𝑡{√ 2 𝜋𝑒 𝑡−𝑡2 2} √2 𝜋𝑒 𝑡−𝑡22

será máximo cuando 𝑡 −𝑡22 lo sea.

𝑑 (𝑡 −𝑡 2 2) 𝑑𝑡 = 1 − 𝑡 = 0 ⇒ 𝑡 = 1 ⇒ 𝑐 ≥ 𝑋(1) 𝑌(1) ⇒ 𝑢𝑡𝑖𝑙𝑖𝑧𝑎𝑚𝑜𝑠 𝑐 = √ 2𝑒 𝜋

(11)

Código Matlab-Octave

c=sqrt(2*e/pi); cant=100000; j=1;

while(j<=cant)

%Utilizamos el método de la transformada inversa para calcular la exponencial u1 = rand; r1 = -1*log(1-u1); u2=rand; if (2*power(e,-1*power(r1,2)/2)/sqrt(2*pi)/(power(e,-r1)*c)>=u2) u3=rand; if (u3>0.5) v(j)=r1; else v(j)=-r1; endif j++; endif endwhile

xlabel('Variable aleatoria Y','FontSize',9,'FontName','Arial'); ylabel('Cant. ocurrencias','FontSize',9,'FontName','Arial'); hold on; [counts,centers]=hist(v,20); g=bar(centers,counts); set(g, "facecolor",[0 0 0.7]);

Figure

Actualización...

Referencias

Actualización...

Related subjects :