自定义PDF来自scipy.stats.rv_continuous不需要的上限

时间:2017-07-25 15:45:03

标签: python pdf scipy statistics astronomy

我试图用以下形式生成具有一定光度的QSO的随机概率密度函数:

1 /((L / L_B ^ *)^ alpha +(L / L_B ^ *)^ beta)

其中L_B ^ *,alpha和beta都是常量。为此,使用以下代码:

import scipy.stats as st

logLbreak = 43.88
alpha = 3.4
beta = 1.6


class my_pdf(st.rv_continuous):

    def _pdf(self,l_L): 
        #"l_L" in this is always log L        
        L = 10**(l_L/logLbreak)
        D = 1/(L**alpha + L**beta)
        return D

dist_Log_L = my_pdf(momtype = 0, a = 0,name='l_L_dist')


distro = dist_Log_L.rvs(size = 10000)

(因为所有事情都是以对数尺度完成的,所以L / L ^ *被激活到10的幂)

分布应该产生一个近似this的图形,尾随无穷大,但实际上它产生的图形看起来像this(10,000个样本)。无论使用的样本量如何,上限都是相同的。它是否有被限制的原因?

1 个答案:

答案 0 :(得分:3)

您的PDF未正确规范化。域上PDF的积分必须为1.您的PDF集成到大约3.4712:

In [72]: from scipy.integrate import quad

In [73]: quad(dist_Log_L._pdf, 0, 100)
Out[73]: (3.4712183965415373, 2.0134487716044682e-11)

In [74]: quad(dist_Log_L._pdf, 0, 800)
Out[74]: (3.4712184965748905, 2.013626296581202e-11)

In [75]: quad(dist_Log_L._pdf, 0, 1000)
Out[75]: (3.47121849657489, 8.412130378805368e-10)

这将打破班级inverse transform sampling的实施。它只会从域生成样本,直到从0到x的PDF积分首先达到1.0,在您的情况下约为2.325

In [81]: quad(dist_Log_L._pdf, 0, 2.325)
Out[81]: (1.0000875374350238, 1.1103202107010366e-14)

实际上,就是你在直方图中看到的内容。

作为验证问题的快速解决方法,我将return方法的_pdf()语句修改为:

        return D/3.47121849657489

再次运行您的脚本。 (在实际修复中,该值将是其他参数的函数。)然后是命令

In [85]: import matplotlib.pyplot as plt

In [86]: plt.hist(distro, bins=31)

生成此图:

plot