Python 中条件概率分布的随机数

Random numbers from conditional probability distribution in Python

例如,Weibull 分布的概率分布函数 PDF 可能看起来有点像下图中的黑色图形。

from scipy.stats import exponweib
import matplotlib.pyplot as plt
import numpy as np

def condwbull_pdf(x, k, lmb, cond):
    return (x >= cond) * exponweib.pdf(x, 1, k, scale=lmb, loc=0) / exponweib.sf(cond, 1, k, scale=lmb, loc=0)

k = 5
lmb = 100.
cond = 100
x = np.linspace(0, 200, 100)
plt.plot(x, exponweib.pdf(x, 1, k, scale=lmb, loc=0), 'k')
plt.plot(x, condwbull_pdf(x, k, lmb, cond), 'r')
plt.show()

红色图表说明 conditional probability distribution 条件 x = 100。参见 condwbull_pdf()

通常我可以从上述 Weibull 分布中抽取随机数:

import random
random.weibullvariate(lmb, k)

现在,我想从条件函数中抽取随机数。一种方法是:

def cond_rnd(lmb, k, cond):
    stop = 0
    while stop < cond:
        stop = random.weibullvariate(lmb, k)
    return stop

但是,对于较大的条件值,这变得非常低效。你能想出更优雅/更快的东西吗?

一般来说,没有普遍适用的方法可以从任意随机变量的条件分布中进行有效抽样。但是,由于威布尔分布的分布函数是解析已知的,所以你可以使用Inverse transform sampling的方法来具体举例。

更准确地说,您可以使用转换计算 cond_rnd(lmb, k, cond) lmb*(-log (sf*u))**(1.0/k),其中 sf=exponweib.sf(cond, 1, k, scale=lmb, loc=0)u=uniform(0,1)

对于一般罕见事件模拟技术的可访问处理,您可以查看 http://onlinelibrary.wiley.com/doi/10.1002/9781118014967.ch10/summary