Scipy - 从自定义概率密度函数进行反向采样方法

3
我正在尝试从自定义概率密度函数(PDF)进行反向采样。我想知道这是否可能,即对PDF进行积分,反转结果,然后为给定的均匀数解决它。PDF的形状为f(x,alpha,mean(x))=(1/Gamma(alpha+1)(x))((x*(alpha+1)/mean(x))^(alpha+1))exp(-(alpha+1)*(x/mean(x))),其中x>0。从形状来看,只有小于150的值是相关的,对于我正在尝试做的事情,小于80的值已经足够了。不过扩展范围应该不难。
我试图使用反转方法,但是只找到了一种数值方法来计算积分,考虑到我需要反转函数来解决问题,这并不一定有帮助: u=integral(f(x,alpha,mean(x))dx)从0到y,其中y未知,u是0到1之间的均匀随机变量。
积分中有伽玛函数和不完全伽玛函数,因此尝试反转它有点麻烦。任何帮助都欢迎。
提前致谢。
祝好。

你的PDF的定义域是什么?除非你以某种方式限制定义域,否则你所拥有的函数是不可归一化的。 - David Z
抱歉,完整的PDF是: (1/Gamma(alpha+1)(x))((x*(alpha+1)/mean(x))^(alpha+1))exp(-(alpha+1)*(x/mean(x)) 域为0到无穷大。 - madtowneast
你的mean(x)只是一个参数mean_x吗?鉴于x只是评估pdf的点,x的平均值就是x本身。 - Josef
这是一个需要假设的参数,因此mean(x) != x。 - madtowneast
1
你能用明确的形式写出你的PDF吗?例如,作为Python表达式?我的印象是,在标准化之后,PDF看起来就像一个标准的Gamma分布,这在numpy.random和scipy.stats中都有。 - Josef
1个回答

4
假设您的意思是要随机选择值,这些值将根据您的概率密度函数分布,那么是可能的。这在维基百科上被描述为 反转换采样。基本上,这就是你所说的:积分PDF以产生累积分布(CDF),反演它(可以提前完成),然后选择一个随机数并通过反演的CDF运行它。
如果您的域是0到正无穷大,则您的分布似乎与 gamma分布 相匹配,该分布内置于Numpy和Scipy中,其中 theta = 1/alphak = alpha+1

我该如何事先反转它?我在进行反转时遇到了麻烦,因为积分给出了一个不完整的伽玛函数。 - madtowneast
你其实不需要自己进行反演,因为你可以直接使用Numpy的伽马分布来获取符合你所需概率密度函数的值。但如果你确实需要进行反演,我建议使用查找表和点之间的线性插值。 - David Z
我的主要问题是我只需要查找0到150左右的值,因此我在技术上不需要从0到无穷大进行积分。我只是无法通过不完整伽玛函数。我知道我可以进行数值积分,但不确定是否可以从中进行采样。 - madtowneast
我认为你可能需要编辑你的问题,更详细地说明你正在尝试什么。 - David Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接