![](/img/trans.png)
[英]How to calculate the probability between two numbers from a probability distribution in 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()
紅色圖表說明了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.