我正在使用一个自定义函数f(x)来定义一个使用copy的rv_continuous类的自定义发行版。
class my_pdf_gen(rv_continuous):
def _pdf(self, x, integral):
return f(x)/integral其中integral确保了正常化。我可以用以下命令创建它的一个实例
my_pdf = my_pdf_gen(my_int,a = a, b = b, name = 'my pdf')a,b表示值范围的上限和下限,my_int= scipy.integrate.quad(f, a, b)[0]表示值范围的下限。我也可以使用my_pdf.rvs(my_int, size = 5)创建一个随机的数据样本,但速度非常慢。(size=9时最多6秒)。
我读到应该在类中重写一些其他方法(如_ppf),但从示例中我发现我不清楚如何在我的例子中实现它。
非常感谢!
发布于 2020-06-29 17:55:52
我通过改变方法和使用蒙特卡罗的拒绝采样器方法解决了这个问题
def rejection_sampler(p,xbounds,pmax):
while True:
x = np.random.rand(1)*(xbounds[1]-xbounds[0])+xbounds[0]
y = np.random.rand(1)*pmax
if y<=p(x):
return x其中p是概率密度函数,xbounds是包含pdf的上限和下限的元组,pmax是域上pdf的最大值。
这里建议使用蒙特卡罗的拒绝采样器:python: random sampling from self-defined probability function
发布于 2020-06-22 14:04:06
预计它会很慢,因为通用实现对cdf进行根求解,cdf本身使用数值积分。
所以最好的办法是提供一个_ppf或_rvs实现。如何做到这一点在很大程度上取决于f(x)的细节。如果您不能解析地求解f(x) = r,请考虑制表/反插值或拒绝采样。
https://stackoverflow.com/questions/62498793
复制相似问题