首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy rv_continuous非常慢

scipy rv_continuous非常慢
EN

Stack Overflow用户
提问于 2020-06-21 20:53:42
回答 2查看 304关注 0票数 1

我正在使用一个自定义函数f(x)来定义一个使用copyrv_continuous类的自定义发行版。

代码语言:javascript
复制
class my_pdf_gen(rv_continuous):
    def _pdf(self, x, integral):
        return f(x)/integral

其中integral确保了正常化。我可以用以下命令创建它的一个实例

代码语言:javascript
复制
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),但从示例中我发现我不清楚如何在我的例子中实现它。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-29 17:55:52

我通过改变方法和使用蒙特卡罗的拒绝采样器方法解决了这个问题

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2020-06-22 14:04:06

预计它会很慢,因为通用实现对cdf进行根求解,cdf本身使用数值积分。

所以最好的办法是提供一个_ppf_rvs实现。如何做到这一点在很大程度上取决于f(x)的细节。如果您不能解析地求解f(x) = r,请考虑制表/反插值或拒绝采样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62498793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档