隨機化演算法之取樣問題

2021-06-22 18:49:04 字數 2758 閱讀 4423

**:

一、簡單的隨機抽樣:乙個總體的個數為n,如果通過逐個抽取的方法從中抽取

乙個樣本,且每次抽取時各個個體被抽到的概率相等,則這樣的抽樣為簡單的隨機抽樣。

例如,從含有6個個體的總體中抽取乙個容量為2的樣本,則在抽樣過程

中某個個體a被抽到的概率是多少?

2/6(1) 第一次a被抽中 1/6

(2) 第一次未被抽中,第二次抽中 5/6 * 1/5 = 1/6

(3) 第一次抽中與第二次抽中是互斥事件,所以,在這次抽樣過程中,

個體a被抽中的概率為 1/6 + 1/6 = 2/6。

上述抽樣過程如何用計算機進行模擬呢?

思路:依次遍歷總體n中的每乙個元素,並通過一種隨機測試對每個元素進行決策(選與不選),將被選元素輸出。

所以,上述思路關鍵在於那個隨機測試,由於是簡單隨機抽樣,每個元素被選可能為n/n,所以**如下:

view source

print?

1.for(inti = 0; i < n; i++)

2.

這種做法雖然每個元素以n/n的概率被選,但又可能最後選取的元素小於n, 也極有可能大於n,因此這種做法不可。

我們以 (n-m) / (n - i) 的概率選取第t+1個元素。(m已經選取元素的個數, t已經遍歷的元素數)

view source

print?

01.select = n

02.remaining = n

03.for(i = 0; i < n; i++)

04.

10.remaining--;

11.}

這樣,貌似每個元素不是以n/n的概率進行抽取的。

這裡混淆了條件概率與無條件概率,每乙個元素被選取的概率依賴於前一元素的選取情況。

(1)假設以等概率n/n的概率選擇了第乙個元素,那麼在剩下n-1個元素中選擇n-1個元素,等概率,

選取乙個元素為(n-1)/(n-1),即第二個元素的概率為(n-1)/(n-1).

(2)不選擇第乙個元素(1-n/n),而選擇了第二個元素,則選擇第二個元素概率 n/(n-1). 

(3)最終選取第二個元素的概率為(n/n)*((n-1)/(n-1)) + (1-n/n)*(n/(n-1)) = n/n.

所以上述**模擬了隨機抽樣,可以採用歸納法進行證明。

若不選擇元素t,則remaining--,即以 select /(remaining - 1) 概率選擇第t+1個元素。

若選擇元素t,  則select--, remaing--,即以(select-1) / (remaining - 1) 選擇第t+1個元素。  

可以這樣理解:

圖一中,若隨機數一值落於select - remaining 區間中,remaining會一直縮小,如圖二中。

當remaining與select重合的時候,每次都會選擇乙個數。通過這種限制,保證取得的資料個數正好為select。 

二、蓄水池抽樣

問題:樣本總數n未知,從中取n個(n≤n),最終要求每個數等概率被取得,n/n.

步驟:1. 先將前n個元素放入蓄水池,對於後續元素,以n/a的概率決定是否取該元素( n < a ≤ n)。

2. 若選取了某個元素a(序號也為a),則要替換蓄水池中的乙個元素,採用隨機方法,以概率1/n來

選擇乙個元素(假如b)進行替換。

證明:元素a最終(即抽樣結束)被選擇的概率為 =

a被選中的概率 *

所以,每個元素被選取的概率為n/n,為等概率抽樣。

**:view source

print?

1.a = n + 1;

2.whilehas more input lines

3.choice = random(1, a);

4.if( a <= n)

5.swap(choice, a);

6.a++

1. 將前n個元素放入蓄水池

2. choice為1-a之間的隨機數字

3. 若 choice <=n, 即以n/a的概率選擇這一行

4. choice同時為n中某個元素的下標,將此下標的元素進行替換。

在0-a直接隨機選取乙個數字,如果落到0-n的區間內,則說明概率為n/a.

隨機化演算法

隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...

隨機化演算法基礎

隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為1 n 下面,有兩個常用的演算法來實現輸入分布的隨機化,以給定的輸入陣列...

c語言 隨機化演算法

srand unsigned int time null 若不隨機則生成的都為1 相同值 做產生隨機數的種子 x double rand rand max rand 後若為 則是隨機生成0 1之間的數 若為 則是生成0 rand max之間的數 rand max為最大值32767 rand 前為產生...