最终,我试图想象两个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)
有没有更好的方法来生成随机变量?
根据@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)