簡體   English   中英

從自定義分布生成隨機數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM