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

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

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


person ted.strauss    schedule 02.03.2010    source источник


Ответы (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 или графическом инструменте по вашему выбору, вы увидите нормальную кривую в форме колокола.

person ted.strauss    schedule 03.03.2010
comment
Я получаю сообщение об ошибке ОШИБКА 1418: эта функция не содержит DETERMINISTIC, NO SQL или READS SQL DATA в своем объявлении, и включено двоичное ведение журнала (вы можете использовать менее безопасную переменную log_bin_trust_function_creators), когда я попробуйте создать функцию. У вас есть идеи, что я могу делать неправильно? - person E.Aigle; 19.04.2021

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

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

person George Dontas    schedule 02.03.2010
comment
Список алгоритмов приводится в Википедии здесь: en.wikipedia.org/wiki/ - person George Dontas; 08.02.2013

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

person user248693    schedule 03.03.2010