Python 加速从叠加截断正态分布中提取随机值

Python 加速从叠加截断正态分布中提取随机值,python,scipy,statistics,normal-distribution,scipy.stats,Python,Scipy,Statistics,Normal Distribution,Scipy.stats,我想从两个截断正态分布之和的分布中抽取N个随机样本。通过从scipy.stats对rv_continuous类进行子类化,并提供两个给定pdf的平均值的pdf,我得到了想要的结果: 将numpy导入为np 从scipy导入统计信息 my_lim=[0.05,7]#下限和上限 my_loc=[1.2,3]#两个截断正态分布的loc值 my_scale=[0.6,2]#两个截断正态分布的标度值 类别总和(统计值连续): def_pdf(self,x): 返回(stats.truncnorm.pdf(

我想从两个截断正态分布之和的分布中抽取N个随机样本。通过从
scipy.stats
rv_continuous
类进行子类化,并提供两个给定pdf的平均值的pdf,我得到了想要的结果:

将numpy导入为np
从scipy导入统计信息
my_lim=[0.05,7]#下限和上限
my_loc=[1.2,3]#两个截断正态分布的loc值
my_scale=[0.6,2]#两个截断正态分布的标度值
类别总和(统计值连续):
def_pdf(self,x):
返回(stats.truncnorm.pdf(x,
a=(我的极限[0]-我的极限[0])/我的尺度[0],
b=(my_lim[1]-my_loc[0])/my_scale[0],
loc=my_loc[0],
刻度=我的刻度[0])+
stats.truncnorm.pdf(x,
a=(my_lim[0]-my_loc[1])/my_scale[1],
b=(my_lim[1]-my_loc[1])/my_scale[1],
loc=my_loc[1],
刻度=我的刻度[1])/2
但是,使用:

my\u dist=sum\u truncnorm()
my_rvs=my_dist.rvs(尺寸=10)
非常慢,每个随机值大约需要5秒

我确信这可以做得更快,但我不确定如何做。我是否应该将我的分布定义为(非截断的)正态分布之和,然后强制截断?我在这个方向上做了一些测试,但这只快了大约10倍,因此仍然是一种缓慢的方式


谷歌告诉我,我可能需要使用逆变换采样并覆盖
\u rvs
方法,但我无法使其适用于我的截断分布。

首先,您必须确保_pdf是标准化的。 框架不会检查它,否则会无声地产生无意义的结果


第二,为了快速生成图形变量,您需要实现一个_ppf或_rvs。仅使用_pdf,它将通过通用代码路径(数值积分和根查找)这就是为什么您当前的版本很慢。

两个truncnorm的pdf应该被规范化,不是吗!?因为我对这两个pdf使用相同的范围,并将两者的总和除以2,所以我假设它被正确规范化了。这是不正确的?关于_rvs的实现:这是我尝试过的,但没有实现。我怀疑写d更容易拥有_ppf函数,使用
erf
获得截断高斯函数的归一化。