我试图用以下形式生成具有一定光度的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个样本)。无论使用的样本量如何,上限都是相同的。它是否有被限制的原因?
答案 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)
生成此图: