代码之家  ›  专栏  ›  技术社区  ›  sascha

指数衰减型随机分布与连续分布的离散化

  •  0
  • sascha  · 技术社区  · 15 年前

    遗憾的是,尽管在范围内使用了统一的整数,但我并没有在编程中使用随机数的实际经验。所以我对这个话题有疑问。

    问题1(更具体):

    “指数衰减” ( http://en.wikipedia.org/wiki/Exponential_decay 含义: 我想选择第一个元素而不是其他元素。我想要一个单调的递减函数(在许多著名的概率分布中,比如伽马分布,在递减之前没有增长)。

    当然,选择最后一个元素而不是第一个元素的双重方法也可以。

    问题2(更一般): 在任何实现中,是否有将任何连续随机分布缩放到给定数组范围(包括离散化)的概念?

    示例:使用高斯正态分布,结果始终是某个数组中的有效索引(意思是:首选中间元素)。

    这个能吗( link text

    平台和库: 我在编程 使用 boost::随机 link text ),但我愿意使用 gsl库 质量 图书馆。

    我更喜欢用一些 库而不是一些快速而肮脏的自定义函数。

    谢谢!

    5 回复  |  直到 15 年前
        1
  •  1
  •   Samsdram    15 年前

    我认为把这个问题分成两步是一个很好的开始。首先,如果你有一个离散的概率分布,那么从这个分布中画出来的问题并不是那么糟糕。Boost random有这样做的方法。向下滚动这个 page 以加权骰子为例。它将从给定的概率分布返回一个整数。可以使用此整数从感兴趣的数组中选择元素。

    问题的第二部分是如何从一个连续的概率分布,比如 exponential

    这里的想法是从一组离散点的连续分布中进行采样,然后调整这些点(规格化),使它们合为一。指数分布的代码如下。

    double expDist(int x, double lambda)  
    {
       return(lambda*exp(-lambda*x));
    }
    
    //code to sample from this distribution
    int i,numElements //where numElements has the number of elements in the array you wish to draw from.
    vector<double> output;
    double sum,temp
    sum=0;
    for(i=0;i<numElements;i++)
    {
       temp=expDist(i,0.5);  //substitute any value you want for lambda in the second argument
       output.push_back(temp); 
       sum+=temp;
    }
    //after having sampled at all the points we need to divide each element in the array by the variable sum so that the sum of the values in the array is equal to 1 and thus a valid probability distribution
    for(i=0;i<numElements;i++)
    {
       output[i]/=sum;
    }
    

    然后,您可以将输出变量输入boost库中的加权骰子示例,它应该符合您的需要。这种一般的离散采样,然后规范化矢量的方法可以适用于多种不同的分布。

        2
  •  4
  •   miked    15 年前

    如果希望随机数的概率与f(x)成正比,那么从均匀分布u中选择一个随机数,然后应用f^-1(u),这就是新的数。

    所以,如果你希望随机数的概率与exp(-x)成正比,那么你选择一个均匀分布的随机数,取它的ln:

    double x=ln(rand()); 
    

    应该给你一个概率分布为exp(-x)的随机数。

    注:我不是这么说的 rand() 是一个很好的函数使用,需要研究好随机数生成器的细节。但假设你有一个好的随机数发生器,这是一个好的解决方案。

    编辑:忘记负号:

    double x=-ln(rand()); 
    

        3
  •  2
  •   Tryer    15 年前

    问题2:“示例:使用高斯正态分布,结果总是某个数组中的有效索引(意思是:首选中间元素)。”

    除非我误会这不是真的。服从正态分布的随机变量理论上可以取范围内的值(-无穷大,无穷大)。因此,除非截断异常值并强制位于外部的随机变量值(例如,+/-3标准偏差到+/-3标准偏差值),否则无法强制正态分布到有限网格上。

        4
  •  2
  •   andand    15 年前

    第一季度) 听起来你要找的是 exponential distribution . Boost库附带一个 exponential distribution generator .

    问题2) histogram . 在您站点的示例中,设置数组中间区域的容器,以表示更接近从分布中绘制的正常随机值平均值的元素。如果您没有足够的关于分布性质的信息,您将需要从感兴趣的分布中收集一个代表性的样本并将其存储在另一个数组中。使用样本的最小值和最大值,然后可以创建另一个数组来计算每个容器中有多少采样元素。一个合理的经验法则是,如果有n个样本,则应该有sqrt(n)容器。

        5
  •  1
  •   Alexandre C.    15 年前

    我想你是 无界的 元素的数量,因此会对序列的最后一个元素产生偏差。

    适合你的问题是 Beta distribution

    推荐文章