代码之家  ›  专栏  ›  技术社区  ›  ted.strauss

如何使用mysql自定义函数生成高斯分布

  •  5
  • ted.strauss  · 技术社区  · 15 年前

    我喜欢用MySQL做定量分析和统计。 我想做一个mysql用户定义函数的形式: 返回一个随机的 从具有平均值和标准值的高斯分布中取样的值 用户输入参数的偏差。mysql已经有了 函数rand()返回一个随机数,所以我只需要 知道一些用于约束/转换该值的伪代码 这样它就成了正确的分布。 有什么建议吗?

    顺便说一句-这是我第一个stackoverflow问题,请原谅 如果这个问题问的用户太多,我会问。

    3 回复  |  直到 15 年前
        1
  •  9
  •   ted.strauss    15 年前

    在回答我自己的问题时,这里有一个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
  •  2
  •   Yorgos    15 年前

    rand()返回一个在0和1之间均匀分布的随机变量(您应该对此进行验证,因为我不确定——这就是它在Sybase中的工作方式)。您可以使用r and()生成一个或多个正态分布的随机变量r,其均值为零,标准差(和方差)为1,即r~n(0,1),实现上述方法之一。 here

    当从n(0,1)生成一个随机变量后,可以将其取消标准化(在公式中求解x here )从n中得到一个随机变量(我的平均值,我的标准值),即用它乘以我的标准值,然后再加上我的平均值。

        3
  •  1
  •   user248693    15 年前

    这个 Box-Muller 变换是利用初等函数生成标准正态随机变量的一种方法。它一次产生两个,有时是浪费,但我觉得它很优雅。