繁体   English   中英

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

[英]Random numbers from conditional probability distribution in Python

例如,威布尔分布的概率分布函数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()

PDF文件

红色图表说明了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

但是,这对于大的条件值而言极其无效。 你能想到更优雅/更快的东西吗?

通常,没有普遍适用的方法可以从任意随机变量的条件分布中进行有效采样。 但是,由于Weibull分布的分布函数在解析上是已知的,因此您可以在特定示例中使用逆变换采样的方法。

更准确地说,您可以使用转换lmb*(-log (sf*u))**(1.0/k)计算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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM