首页 > 解决方案 > 使用自定义 pdf 时 stats.rv_continuous 缓慢

问题描述

最终,我试图可视化从数据估计的两个 PDF 之间的 copula(均通过 KDE)。假设,对于其中一个 KDE,我将离散x,y数据排序在一个名为data. 我需要生成具有此分布的随机变量以执行概率积分变换(并最终获得均匀分布)。我生成随机变量的方法如下:

import scipy.stats as st
from scipy import interpolate, integrate

pdf1 = interpolate.interp1d(data[0], data[1])

class pdf1_class(st.rv_continuous):
    def _pdf(self,x):
        return pdf1(x)

pdf1_rv = pdf1_class(a = data[0][0], b= data[0][-1], name = 'pdf1_class')

pdf1_samples = pdf1_rv.rvs(size=10000)

但是,这种方法非常缓慢。我还收到以下警告:

集成警告:已达到最大细分数 (50)。如果增加限制没有改善,建议分析被积函数以确定困难。如果可以确定局部难度的位置(奇点、不连续性),则可能会从拆分区间并调用子范围上的积分器中获益。也许应该使用专用的积分器。警告。警告(味精,集成警告)

IntegrationWarning:检测到舍入错误的发生,这会阻止达到要求的容差。错误可能被低估了。警告。警告(味精,集成警告)

有没有更好的方法来生成随机变量?

标签: pythonrandomscipystatistics

解决方案


根据@unutbu 的建议,我实现了_cdfand _ppf,这使得 10000 个样本的计算瞬间完成。为此,我在上面的代码中添加了以下内容:

discrete_cdf1 = integrate.cumtrapz(y=data[1], x = data[0])
cdf1 = interpolate.interp1d(data[0][1:], discrete_cdf1)
ppf1 = interpolate.interp1d(discerete_cdf1, data[0][:-1])

然后我将以下两种方法添加到pdf1_class

def _cdf(self,x):
    return cdf1(x)

def _ppf(self,x):
    return ppf1(x)

推荐阅读