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

3 投票
1 回答
3043 浏览
提问于 2025-04-17 07:21

我正在尝试从一个自定义的概率密度函数(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 之间的均匀随机变量。

这个积分包含了伽马函数和不完全伽马函数,所以尝试反转它有点麻烦。任何帮助都非常欢迎。

非常感谢!

祝好

1 个回答

4

假设你是想随机选择一些值,这些值会按照你的概率密度函数(PDF)来分布,那么这是完全可以做到的。维基百科上有个叫做逆变换抽样的概念,简单来说就是你说的那样:先对概率密度函数进行积分,得到累积分布函数(CDF),然后把它反转(这一步可以提前做好),最后选择一个随机数,把它代入反转后的CDF中。

如果你的范围是从0到正无穷,那么你的分布看起来像是伽马分布,这个分布在Numpy和Scipy中都有内置支持,参数是theta = 1/alphak = alpha+1

撰写回答