2010-03-02 11 views
5

Mi piace usare MySQL per fare analisi quantitative e statistiche. Vorrei creare una funzione definita dall'utente MySQL del modulo: sample_gaussian (mean, stdev) che restituisce un singolo valore randomizzato campionato da una distribuzione gaussiana avente deviazione media e standard degli argomenti inseriti dall'utente. MySQL ha già una funzione rand() che restituisce un numero casuale, quindi ho solo bisogno di conoscere qualche pseudocodice per limitare/trasformare quel valore in modo che cada nella giusta distribuzione. Qualche suggerimento?come generare una distribuzione gaussiana usando la funzione definita dall'utente mysql

BTW- Questa è la mia prima domanda StackOverflow, quindi ti prego di perdonare me se questa domanda sta chiedendo troppo di utenti su questo sito.

risposta

8

In risposta alla mia domanda, ecco una funzione definita dall'utente MySQL che restituisce un singolo valore casuale campionato da una distribuzione gaussiana con una determinata media e deviazione standard.

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 ; 

Per verificare se questo è in realtà il ritorno una distribuzione gaussiana, è possibile generare una serie di questi, quindi tracciare un'istogramma:

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 

Se si traccia che istogramma in Excel o strumento di rappresentazione grafica di scelta, vedrai la curva a forma di campana normale.

2

rand() restituisce una variabile casuale distribuita uniformemente tra 0 e 1 (è necessario verificare questo perché non sono sicuro - questo è il modo in cui funziona in Sybase). Puoi usare rand() per generare una o più variabili casuali normalmente distribuite r con media zero e deviazione standard (e varianza), cioè r ~ N (0,1), implementando uno dei metodi menzionati here

Quando hai generato una variabile casuale da N (0,1), puoi de-standardizzarlo (risolvilo con X nella formula here) per ottenere una variabile casuale da N (my_mean, my_std), cioè moltiplicandola per my_std e quindi aggiungendo my_mean.

+1

collegamento sitmo.com non funzionante – vbence

+0

Un elenco di algoritmi è fornito da Wikipedia qui: http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution –

1

La trasformazione Box-Muller è un modo per generare variabili casuali normali standard utilizzando funzioni elementari. Ne genera due alla volta, che a volte è uno spreco, ma lo trovo molto elegante.

Problemi correlati