la façon de générer une distribution gaussienne en utilisant mysql fonction définie par l'utilisateur

StackOverflow https://stackoverflow.com/questions/2360180

Question

J'aime utiliser MySQL pour effectuer des analyses quantitatives et statistiques. Je voudrais faire une fonction définie par l'utilisateur MySQL de la forme: sample_gaussian (moyenne, stdev) qui retourne un seul randomisée valeur échantillonnée à partir d'une distribution gaussienne ayant norme moyenne et déviation des arguments entrés par l'utilisateur. MySQL a déjà fonction rand () qui retourne un nombre aléatoire, donc je dois juste en savoir pseudocode pour contraindre / transformer cette valeur de sorte qu'il tombe dans la bonne distribution. Toutes les suggestions?

Ce BTW est ma première question stackoverflow, donc s'il vous plaît pardonnez moi si cette question demande trop d'utilisateurs sur ce site.

Était-ce utile?

La solution

En réponse à ma propre question, voici une fonction définie par l'utilisateur MySQL qui retourne une seule valeur aléatoire échantillonné à partir d'une distribution gaussienne avec une moyenne donnée et l'écart-type.

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 ;

Pour vérifier que cela est en fait le retour d'une distribution gaussienne, vous pouvez générer une série de ceux-ci, puis tracer un histogramme:

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 vous tracez que l'histogramme dans Excel ou un outil de choix graphique, vous verrez la forme de cloche courbe normale.

Autres conseils

rand () retourne une variable aléatoire uniformément répartie entre 0 et 1 (vous devez vérifier cela parce que je ne suis pas sûr - c'est comment cela fonctionne dans Sybase). Vous pouvez utiliser rand () pour générer une ou plusieurs variables aléatoires normalement distribuées r avec une moyenne nulle et écart-type (et la variance) un, par exemple r ~ N (0,1), la mise en œuvre l'une des méthodes mentionnées ici

Lorsque vous avez généré une variable aléatoire de N (0,1), vous pouvez dé-normaliser (résoudre pour X dans la formule ici ) pour obtenir une variable aléatoire de N (my_mean, my_std), qui est en le multipliant par my_std, puis en ajoutant my_mean.

Le Box-Muller transformation est un moyen de générer des nombres aléatoires standards normaux en utilisant des fonctions élémentaires . Il génère deux à la fois, ce qui est parfois inutile, mais je trouve très élégant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top