Python scipy rv_连续非常慢

Python scipy rv_连续非常慢,python,class,scipy,distribution,Python,Class,Scipy,Distribution,我正在使用一个自定义函数f(x)来定义使用copy的rv_continuous类的自定义分发。我的代码是 class my_pdf_gen(rv_continuous): def _pdf(self, x, integral): return f(x)/integral 其中积分确保标准化。我可以用 my_pdf = my_pdf_gen(my_int,a = a, b = b, name = 'my pdf') 使用a,b值范围的上限和下限,以及my_int=sci

我正在使用一个自定义函数
f(x)
来定义使用
copy
rv_continuous
类的自定义分发。我的代码是

class my_pdf_gen(rv_continuous):
    def _pdf(self, x, integral):
        return f(x)/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秒)

我读到,还应该覆盖类中的一些其他方法(如
\u ppf
),但从示例中,我发现我不清楚如何在我的示例中实现它


非常感谢

由于通用实现对cdf进行根求解,而cdf本身使用数值积分,因此预计速度会很慢


因此,您最好的选择是提供
\u ppf
\u rvs
实现。如何做到这一点在很大程度上取决于
f(x)
的细节。如果不能解析<代码> f(x)=r</代码>,考虑列表/逆插值或拒绝采样。< /P> < P>我通过改变方法和使用蒙特卡罗拒绝抽样方法< /P>解决了问题。
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
def拒绝_取样器(p、xbounds、pmax):
尽管如此:
x=np.random.rand(1)*(xbounds[1]-xbounds[0])+xbounds[0]
y=np.随机随机随机数(1)*pmax

如果你每次都重新计算积分吗?@severinpapadeux因为计算起来可能有点棘手,我把它存储在一个值中,每次都调用它OK,所以下一次重新实现将是_ppf,它实际上是逆CDF,采样基本上是
返回ppf(randomU01)。我还建议你看看你所拥有的,并看到所有的东西都是矢量化的(它可能需要一个数值的numpy向量和结果的返回向量)。否则,您将看到函数的多个调用