Как генерировать гауссовское распределение с использованием пользовательской функции mysql
Мне нравится использовать MySQL для количественного анализа и статистики.
Я хотел бы сделать пользовательскую функцию MySQL в форме:
sample_gaussian (mean, stdev), который возвращает одно рандомизированное
значение, выбранное из гауссового распределения со средним и стандартным
отклонение введенных пользователем аргументов. MySQL уже имеет
функция rand(), которая возвращает случайное число, поэтому мне просто нужно
знать некоторый псевдокод для ограничения/преобразования этого значения
так что он попадает в правильное распределение.
Любые предложения?
BTW- Это мой первый вопрос о стеке, поэтому, пожалуйста, простите
если этот вопрос задает слишком много пользователей на этом сайте.
Ответы
Ответ 1
В ответ на мой собственный вопрос, вот пользовательская функция 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
Если вы нарисуете эту гистограмму в специальном инструменте выбора или графике, вы увидите нормальную форму колокола.
Ответ 2
rand() возвращает равномерно распределенную случайную переменную между 0 и 1 (вы должны это проверить, потому что я не уверен - так оно работает в Sybase). Вы можете использовать rand() для генерации одной или более нормально распределенных случайных величин r со средним нулем и стандартным отклонением (и дисперсией), т.е. R ~ N (0,1), реализуя один из указанных методов здесь
Когда вы создали случайную переменную из N (0,1), вы можете де-стандартизировать ее (решить для X в формуле здесь), чтобы получить случайную переменную из N (my_mean, my_std), то есть путем умножения ее на my_std и затем добавления my_mean.
Ответ 3
Трансформация Box-Muller - способ генерации стандартных нормальных случайных вариаций с использованием элементарных функций. Он генерирует два за раз, что иногда расточительно, но я нахожу его очень элегантным.