代码之家  ›  专栏  ›  技术社区  ›  hfingler Jim Puls

概率密度函数的一篇论文,用C++实现,不按预期工作

  •  6
  • hfingler Jim Puls  · 技术社区  · 15 年前

    所以我实现了一个启发式算法,我遇到了这个函数。

    根据作者的说法,“l”是一个随机数:0<l<n。在我的测试代码中,它当前正在生成0<=l<=n。我有正确的代码,但是我已经花了好几个小时来处理这个问题,而且我懒得重新编写代码。

    所以我对函数的第一部分进行了编码,因为y<=0.5 结果不是在0到n之间,而是一些浮点数。n越大,这个浮点数就越小。

    这是C测试代码。”x”是“l”参数。

    //hate how code tag works, it's not even working now  
    int n = 100;  
    float y = 0.2;  
    float n_copy;  
    
    for(int i = 0 ; i < 20 ; i++)  
    {  
        float x = (float) (rand()/(float)RAND_MAX);  // 0 <= x <= 1  
        x = x * n;                                // 0 <= x <= n  
        float p1 = (1 - y) / (n*y);  
        float p2 = (1 - ( x / n ));  
        float exp = (1 - (2*y)) / y;  
        p2 = pow(p2, exp);  
        n_copy = p1 * p2;  
        printf("%.5f\n", n_copy);  
    }  
    

    0.03354  
    0.00484  
    0.00003  
    0.00029  
    0.00020  
    0.00028  
    0.00263  
    0.01619  
    0.00032  
    0.00000  
    0.03598  
    0.03975    
    0.00704  
    0.00176  
    0.00001  
    0.01333  
    0.03396   
    0.02795  
    0.00005  
    0.00860 
    

    文章是:

    http://www.scribd.com/doc/3097936/cAS-The-Cunning-Ant-System

    第6和7页。

    我做错什么了?我不认为作者是错的,因为有超过5篇论文描述了同样的功能。

    谢谢:)

    3 回复  |  直到 11 年前
        1
  •  4
  •   Justin Peel    15 年前

    dmckee实际上是正确的,但我想我会详细说明,并试图解释掉这里的一些困惑。我肯定会失败的。 f_s(l) ,上面公式中的函数,是概率分布函数。它告诉你,对于给定的输入 l 介于0和n之间,则 是段长度。0到n之间所有值的和(整数)应等于1。

    第7页顶部的图表混淆了这一点。它勾勒出 与。 弗斯(l) ,但你必须注意它给你带来的不稳定因素。您注意到底部的值从0变为1,但是 x n 在侧面,这意味着 x 1/n 这意味着这些值实际上不会上升到3,而是上升到3/n。

    事实证明这并不算太糟(我是用Wolfram Mathematica在线积分器做的,用x表示 . 如果我们将得到的方程设置为某个变量(例如z),那么现在的目标是

    再做一点工作

    我会再帮你一点。我试着做我说的y<=0.5,但是我使用的符号代数系统不能做倒数(其他一些系统可能可以)。不过,后来我决定尝试使用.5<y<=1的公式。事实证明这要容易得多。如果我改变 到x英寸 我明白了

    y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))
    

    在x上积分从0到 我得到(使用Mathematica的在线积分器):

    (l / n)^(y / (1 - y))
    

    用这种东西没什么比这更好的了。如果我把它设为z,然后解

    l = n * z^(1 / y - 1)      for .5 < y <= 1
    

    快速检查y=1。在这种情况下,我们得到 l = n 它是按您的要求分布的。5<y<=1。但是等等,看看第7页的图表,你会发现概率分布函数是对称的。这意味着我们可以使用上面的结果来找到0<y<=0.5的值。我们只是改变 -> n-l y -> 1-y

    n - l = n * z^(1 / (1 - y) - 1)
    
    l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .5
    

    无论如何,除非我在某个地方犯了错误,否则这应该能解决你的问题。祝你好运。

        2
  •  6
  •   dmckee --- ex-moderator kitten    15 年前

    你可能会误解别人对你的期望。


    f_s(l) 是PDF,并且已在 [0,n) .

    g_s(l') = \int_0^{l'} dl f_s(l)
    

    注意,这是对我调用的未指定端点的定积分 l' 我的 . 假设我们有正常化的权利, g_s(N) = 1.0 . 如果不是这样,我们用一个简单的系数来修正它。

    G^{-1}(x) . 为此,您可能需要选择特定的gamma值。

    然后对 ,并以此作为论据, x ,到 G^{-1} . 结果应该介于 [0,1) ,并应根据 f_s .

    就像贾斯汀说的,你可以用计算机代数系统来计算数学。

        3
  •  0
  •   Ben Jackson    15 年前

    假设对于任何值l,y,n,如前所述,p1和p2都在[0,1]中,exp在[1,…]中,使得pow(p2,exp)也在[0,1)中,因此我不知道你如何得到范围为[0,n)的输出