2010-03-02 26 views
5

Me gusta usar MySQL para hacer análisis cuantitativos y estadísticas. Me gustaría hacer una función definida por el usuario de MySQL de la forma: sample_gaussian (mean, stdev) que devuelve un único valor aleatorio muestreado de una distribución gaussiana con desviación media y estándar de de los argumentos ingresados ​​por el usuario. MySQL ya tiene una función rand() que devuelve un número aleatorio, por lo que solo necesito conocer algún pseudocódigo para restringir/transformar ese valor para que caiga en la distribución correcta. ¿Alguna sugerencia?cómo generar una distribución gaussiana usando la función definida por el usuario de mysql

BTW- Esta es mi primera pregunta de stackoverflow, así que por favor perdone si esta pregunta está pidiendo demasiado a los usuarios en este sitio.

Respuesta

8

En respuesta a mi propia pregunta, aquí hay una función MySQL definida por el usuario que devuelve un solo valor aleatorio muestreado de una distribución gaussiana con una media y una desviación estándar dadas.

DROP FUNCTION IF EXISTS gauss; 
DELIMITER // 
CREATE FUNCTION gauss(mean float, stdev float) RETURNS float 
BEGIN 
set @x=rand(), @y=rand(); 
set @gaus = ((sqrt(-2*log(@x))*cos(2*pi()*@y))*stdev)+mean; 
return @gaus; 
END 
// 
DELIMITER ; 

Para comprobar que esto es de hecho el retorno de una distribución de Gauss, se puede generar una serie de estos, entonces trazar un histograma:

create temporary table temp (id int, rando float); 
insert into temp (rando) select gauss(2,1); # repeat this operation 500 times 
insert into temp (rando) select gauss(2,1) from any_table_with_500+_entries limit 500; 
select round(temp,1), count(*) from temp group by round(temp,1) # creates a histogram 

Si traza que histograma en Excel o una herramienta gráfica de elección, verá la curva en forma de campana normal.

2

rand() devuelve una variable aleatoria distribuida uniformemente entre 0 y 1 (debe verificar esto porque no estoy seguro, así es como funciona en Sybase). Puede usar rand() para generar una o más variables aleatorias distribuidas normalmente r con media cero y desviación estándar (y varianza) uno, es decir r ~ N (0,1), implementando uno de los métodos mencionados here

Cuándo has generado una variable aleatoria desde N (0,1), puedes desestandarizarla (resolver para X en la fórmula here) para obtener una variable aleatoria de N (my_mean, my_std), es decir, multiplicándola por my_std y luego agregando my_mean.

+1

sitmo.com link not working – vbence

+0

Wikipedia proporciona una lista de algoritmos: http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution –

1

La transformada Box-Muller es una forma de generar variables aleatorias normales estándar utilizando funciones elementales. Genera dos a la vez, lo que a veces es un desperdicio, pero me parece muy elegante.

Cuestiones relacionadas