как генерировать распределение Гаусса с помощью mysql пользовательскую функцию

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

BTW-Это - мой первый stackoverflow вопрос, поэтому простите мне, если этот вопрос спрашивает слишком много пользователей на этом сайте.

5
задан ted.strauss 2 March 2010 в 00:40
поделиться

3 ответа

В ответ на мой собственный вопрос вот пользовательская функция 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 или другом инструменте построения графика, вы увидите колокольчик образная нормальная кривая.

10
ответ дан 18 December 2019 в 14:44
поделиться

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

1
ответ дан 18 December 2019 в 14:44
поделиться

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

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

2
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: