как сгенерировать гауссовское распределение, используя пользовательскую функцию mysql - PullRequest
5 голосов
/ 02 марта 2010

Мне нравится использовать MySQL для количественного анализа и статистики. Я хотел бы сделать пользовательскую функцию MySQL в форме: sample_gaussian (mean, stdev), который возвращает один случайный значение, выбранное из гауссовского распределения, имеющего среднее и стандартное отклонение введенных пользователем аргументов. MySQL уже имеет Функция rand (), которая возвращает случайное число, поэтому мне просто нужно знать некоторый псевдокод для ограничения / преобразования этого значения так что это попадает в правильное распределение. Есть предложения?

Кстати, это мой первый вопрос о переполнении стека, поэтому, пожалуйста, прости мне, если этот вопрос задает слишком много пользователей на этом сайте.

Ответы [ 3 ]

9 голосов
/ 03 марта 2010

В ответ на мой собственный вопрос, вот пользовательская функция MySQL, которая возвращает одно случайное значение, выбранное из распределения Гаусса с заданным средним и стандартным отклонением.

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 ;

Чтобы убедиться, что это на самом деле возвращает распределение Гаусса, вы можете сгенерировать их серию, а затем построить гистограмму:

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

Если вы построите эту гистограмму в Excel или на другом графическом инструменте, вы увидите нормальную кривую в форме колокола.

2 голосов
/ 02 марта 2010

rand () возвращает равномерно распределенную случайную величину между 0 и 1 (вы должны проверить это, потому что я не уверен - именно так она работает в Sybase). Вы можете использовать rand () для генерации одной или нескольких нормально распределенных случайных величин r со средним нулем и стандартным отклонением (и дисперсией), т. Е. R ~ N (0,1), реализующих один из методов, упомянутых здесь

Когда вы сгенерировали случайную переменную из N (0,1), вы можете отменить ее стандартизацию (для X в формуле здесь ) получить случайную переменную из N (my_mean, my_std ), то есть умножив его на my_std, а затем добавив my_mean.

1 голос
/ 03 марта 2010

Преобразование Box-Muller - это способ генерации стандартных нормальных случайных величин с использованием элементарных функций. Он генерирует два за раз, что иногда бесполезно, но я нахожу это очень элегантным.

...