python - 使用自定义 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:检测到舍入错误的发生,这会阻止达到要求的容差。错误可能被低估了。警告。警告(味精,集成警告)
有没有更好的方法来生成随机变量?
解决方案
根据@unutbu 的建议,我实现了_cdf
and _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)
推荐阅读
- python - 为 PyPi 打包 Python 应用程序时如何修复 ModuleNotFoundError
- node.js - Nodejs中的Path.join跨平台要求
- javascript - 简单的云功能复制文档时出错
- node.js - 从服务器到客户端的 Socket.io 消息递增
- installation - 从源代码 Cmake 为 Scientific Linux 7.8 构建
- c# - 等效于 C# 类型参数中的 F# _ 通配符
- python - pygame rect大小没有改变
- javascript - 在发出 AJAX HTTP GET 请求后,如何处理浏览器刷新按钮的这种破坏行为?
- list - 创建 scala 列表的子列表
- javascript - 由javascript可折叠事件侦听器呈现的按钮不起作用