我喜欢使用MySQL进行定量分析和统计。 我想创建一个MySQL用户定义的函数形式: sample_gaussian(mean,stdev)返回单个随机化的 从具有均值和标准的高斯分布中采样的值 用户输入参数的偏差。 MySQL已经有了 函数rand()返回一个随机数,所以我只需要 知道一些伪代码用于约束/转换该值 所以它属于正确的分布。 有什么建议吗?
BTW-这是我的第一个stackoverflow问题,所以请原谅 我,如果这个问题在这个网站上询问了太多用户。
答案 0 :(得分:9)
在回答我自己的问题时,这是一个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或选择的图形工具中绘制直方图,您将看到钟形正常曲线。
答案 1 :(得分:2)
rand()返回一个介于0和1之间的均匀分布的随机变量(你应该验证这一点,因为我不确定 - 这是它在Sybase中的工作原理)。您可以使用rand()生成一个或多个正态分布的随机变量r,其均值为零,标准偏差(和方差)为1,即r~N(0,1),实现上述方法之一here < / p>
当您从N(0,1)生成随机变量时,可以对其进行去标准化(求解公式here中的X)以从N(my_mean,my_std)获取随机变量,这是通过将其乘以my_std然后添加my_mean。
答案 2 :(得分:1)
Box-Muller变换是一种使用基本函数生成标准正态随机变量的方法。它一次产生两个,有时是浪费,但我发现它非常优雅。