很容易计算概率分布函数的逆

2024-04-25 22:54:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图模拟由某个概率分布产生的大量数字。由于大量的代,代码是非常缓慢,并使用我所有的RAM。你知道吗

如果我使用正态分布来生成数字,使用scipy.stats.norm.ppf(random.random()),代码很容易执行,这就是为什么我知道问题来自于此。你知道吗

我想到的唯一方法是创建一个函数,在某个点给出分布的CDF,并对其进行优化,以找到它到达随机生成的数字的位置:

def mytwofunctions():
    def hansenPDF (z,x):
        heta = 2.1+27.9/exp(-x[3])
        c = math.gamma((heta+1)/2)/(sqrt(math.pi*(heta-2))*math.gamma(heta/2))
        a = 4*x[3]*c*(heta-2)/(heta-1)
        b = sqrt(1+3*x[3]**2-a**2)

        if z < -a/b:
            g = b*c*(1+1/(heta-2)*((b*z+a)/(1-x[3]))**2)**(-(heta+1)/2)
        else:
            g = b*c*(1+1/(heta-2)*((b*z+a)/(1+x[3]))**2)**(-(heta+1)/2)

        return g

    def integrator (z):
        return integrate.quad(hansenPDF,-100,z,args=(optimparams[-1]))[0] - random.random()

有什么办法做得更有效率吗?你知道吗


Tags: 代码returndefstats数字randommathscipy