Probability

如何從離散分佈中採樣?[複製]

  • August 20, 2013

假設我有一個分佈來控制單​​個隨機變量 X 的可能結果。這類似於 [0.1, 0.4, 0.2, 0.3],因為 X 的值是 1、2、3、4。

是否有可能從這個分佈中抽樣,即在給定結果的概率的情況下,在每個可能的結果上生成偽隨機數。所以如果我想知道得到 2 的概率是多少,採樣操作可能會返回 0.34 或類似的值。

我問的原因是我正在嘗試根據研究論文為強化學習方法實施動作選擇策略。根據我從論文中收集到的信息,作者能夠通過“通過自適應數值積分獲得的累積概率密度函數映射均勻分佈 U[0,1]”來對分佈進行採樣。然後,他從中對每次試驗的轉移概率進行採樣……

我將不勝感激有關此的任何信息…

提前致謝

當然。這是一個 R 函數,它將從該分發n時間中進行採樣,並進行替換:

sampleDist = function(n) { 
   sample(x = c(1,2,3,4), n, replace = T, prob = c(0.1, 0.4, 0.2, 0.3)) 
}

# > sampleDist(10)
# [1] 4 2 2 2 2 2 4 1 2 2

如果你想再低一點,你可以通過查看 R 源代碼(用 C 編寫)來查看實際使用的算法:

/* Unequal probability sampling; with-replacement case 
* n are the lengths of p and perm. p contains probabilities, perm
* contains the actual outcomes, and ans contains an array of values 
* that were sampled.
*/

static void ProbSampleReplace(int n, double *p, int *perm, int nans, int *ans)
{
   double rU;
   int i, j;
   int nm1 = n - 1;

   /* record element identities */
   for (i = 0; i < n; i++)
       perm[i] = i + 1;

   /* sort the probabilities into descending order */
   revsort(p, perm, n);

   /* compute cumulative probabilities */
   for (i = 1 ; i < n; i++)
       p[i] += p[i - 1];

   /* compute the sample */
   for (i = 0; i < nans; i++) {
       rU = unif_rand();
       for (j = 0; j < nm1; j++) {
           if (rU <= p[j])
               break;
           }
       ans[i] = perm[j];
   }
}

引用自:https://stats.stackexchange.com/questions/67911

comments powered by Disqus