stats.rv_continuous使用自定义pdf时速度慢

问题描述 投票:1回答:1

最终,我试图想象两个PDF之间的联系,这两个PDF是根据数据估算的(两者都通过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)

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

IntegrationWarning:已实现最大细分数(50)。如果增加限制没有产生任何改进,建议分析被积函数以确定困难。如果可以确定局部难度的位置(奇点,不连​​续),则可能从分割区间并在子范围上调用积分器获得。也许应该使用专用集成商。 warnings.warn(msg,IntegrationWarning)

IntegrationWarning:检测到舍入错误的发生,这会阻止实现所请求的容差。错误可能被低估了。 warnings.warn(msg,IntegrationWarning)

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

python random scipy statistics
1个回答
1
投票

根据@unutbu的建议,我实施了_cdf_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)
© www.soinside.com 2019 - 2024. All rights reserved.