jueves, 29 de marzo de 2012

Tarea 3: Pruebas estadísticas para los números pseudoaleatorios

Librería de generación de números pseudoaleatorios
Para realizar esta parte, lo primero que hice es generar numeros pseudo-aleatorios de manera teórica con octave para generar una gráfica en donde pudiera ver como varia la distriución de forma visual, en mi caso estoy utilizando la distribución de possion que utiliza la siguiente formula.



Por lo que hice esta función en octave:
function teo = teo_poisson(var, lam)
teo = (exp(-lam) * lam^var) / factorial(var)



En gnuplot genero esta gráfica.


Luego para generar la estadística, como sabemos debemos de generar mediante una unidad de tiempo saber cuando es mayor a uno y que esto regrese un numero aleatorio por medio de un random uniforme, por lo que generé otra función la cual da este numero.


function pru = prueba_poisson(lam)
evento = 0;
tiempo = 0;
tmp = 0;
while (tiempo <= 1)
evento = evento + 1;
tmp = - log(unifrnd(0, 1))/lam;
tiempo = tiempo + tmp;
endwhile
evento = evento - 1;
pru = evento;



Para luego, generar esta gráfica en gnuplot


Luego necesitamos un programa que genere y hacer "canastas" para normalizar los numeros.
function m = generar(lam)
repeticion = 10000
guia = []
guia(10) = 0 ;
for x = 1:repeticion
expe = prueba_poisson(lam);
if(expe != 0)
guia(expe) = guia(expe) + 1;
endif
endfor
guia
for x = 1:(length(guia))
guia(x) = guia(x) / repeticion;
endfor
guia2 = []
for x = 1:(length(guia))
guia2(x) = teo_poisson(x, lam);
endfor
length(guia);
for x = 1:(length(guia))
printf("%g %g\n", guia(x), guia2(x));
endfor
endfunction



Generando los siguientes resultados los cuales voy a utilizar para las pruebas.




Luego si comparamos las dos versiones de numeros pseudo-aleatorios, tenemos que una gráfica comprobando que pertenecen a la misma distribución


Pruebas estadísticas
Ahora, para verificar que lo que estoy generando, se apegan a la distribución de poisson, por lo que mediante una investigación en internet por lo que decidí hacer la prueba de chi cuadrado.


La prueba de chi cuadrado,sigue una distribución de chi cuadrada de Pearson, en donde mido la discrepancia entre una distribución observada y otra teórica, por lo que genere en una lista numeros desde la libreria de numpy con numeros de distribución de poission, comparados los numeros teóricos que generé, al igual que los numeros experimentales y para verificar que esto funciona, lo que hice fue compararlo con numeros que utilicen otra distribución, en donde tuvimos resultados satisfactorios teniendo Hipotesis contrarias.


Expongo el código.
#!/usr/bin/python
from scipy import stats
from numpy import random
import numpy as np
lista_teorico = np.array([0.270671, 0.270671, 0.180447, 0.0902235, 0.0360892, 0.0120298, 0.0343709, 0.000859272, 0.000190949])
lista_prueba = np.array([0.2803, 0.2693, 0.17, 0.0911, 0.0416, 0.0111, 0.003, 0.0014, 0.0002])
lista_ran = []
lista_ran2 = []
for i in range(9):
res = random.poisson(2.0)
lista_ran.append(res)
for i in range(9):
res = random.random()
lista_ran2.append(res)
lista_ran3 = np.array(lista_ran)
lista_ran4 = np.array(lista_ran2)
observado = lista_teorico
esperado = np.array(lista_ran3) * np.sum(observado)
chist1, p1 = stats.chisquare(observado, esperado)
observado = lista_prueba
esperado = np.array(lista_ran3) * np.sum(observado)
chist2, p2 = stats.chisquare(observado, esperado)
observado = lista_prueba
esperado = np.array(lista_ran4) * np.sum(observado)
chist3, p3 = stats.chisquare(observado, esperado)
if (chist1 >= p1):
print "Se rechaza"
else:
print "Se acepta Ho"
if (chist2 >= p2):
print "Se rechaza Ho"
else:
print "Se acepta Ho"
if(chist3 >= p3):
print "Se rechaza Ho"
else:
print "Se acepta Ho"
view raw gistfile1.py hosted with ❤ by GitHub



Teniendo los siguientes resultados.

Por lo que podemos comprobar que al comparar con la distribución de poisson, tenemos un resultado satisfactorio pero al momento de comparar con una distribución normal, se rechaza.

Podemos concluir que los numeros generados si pertenecen a la distribución de poisson.

1 comentario:

  1. Buena la parte de la distribución. Faltó lo de aleatoriedad. Te van 4 y 4, porque ando amable.

    ResponderEliminar