[英]How to generate random number 1 & 2 instead of 0 & 1 from binomial distribution?
[英]Generate random number from custom distribution
我試圖從自定義分布中生成隨機數,我已經發現了這個問題: 從(任意)連續概率分布中進行模擬,但是不幸的是,這對我沒有幫助,因為該方法建議那里需要一個分布函數的公式。 我的分布是多個均勻分布的組合,基本上分布函數看起來像直方圖。 一個例子是:
f(x) = {
0 for x < 1
0.5 for 1 <= x < 2
0.25 for 2 <= x < 4
0 for 4 <= x
}
您只需要逆CDF方法:
samplef <- function (n) {
x <- runif(n)
ifelse(x < 0.5, 2 * x + 1, 4 * x)
}
自己計算CDF以驗證:
F(x) = 0 x < 1
0.5 * x - 0.5 1 < x < 2
0.25 * x 2 < x < 4
1 x > 4
因此它的逆是:
invF(x) = 2 * x + 1 0 < x < 0.5
4 * x 0.5 < x < 1
您可以結合使用各種有效的方法從連續分布的離散分布中進行采樣。
也就是說,從變量的整數部分Y = [X]進行模擬,該變量的離散分布的概率等於每個間隔中的概率(例如通過表格方法-別名方法),然后簡單地添加一個隨機的均一值[0,1 $,X = Y + U。
在您的示例中,您讓Y分別以概率0.5、0.25和0.25取值1,2,3(這等效於以相等概率對1,1,2,3進行采樣),然后添加一個隨機統一值。
如果您的“直方圖”很大,這可能是一種非常快速的方法。
在R中,您可以通過以下方式進行簡單(如果不是特別有效)的版本
sample(c(1,1,2,3))+runif(1)
要么
sample(c(1,1,2,3),n,replace=TRUE)+runif(n)
通常,您可以在sample
使用概率權重參數。
如果您需要的速度超過了此速度(對於某些應用程序,尤其是對於較大的直方圖和非常大的樣本量),則可以使用鏈接中提到的方法並對主力部分進行編程,從而大大加快離散部分的速度。該功能的下層語言(例如,用C語言表示)。
就是說,即使僅使用上面帶有較大“直方圖”的代碼(數十到數百個bin),這種方法-即使是在我相當描述的筆記本電腦上-似乎也能在一秒鍾內生成一百萬個隨機值,因此對於許多應用程序來說都可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.