蓄水池 抽樣

2021-06-29 14:15:20 字數 992 閱讀 1247

蓄水池抽樣問題描述的是,在乙個無窮盡的樣本中,要求隨即抽取一些樣本,這些樣本被抽取到的概率必須保持一致。

乙個蓄水池就可以理解為無窮大的樣本空間。

解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持乙個集合,作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。

其偽**如下:

init : a reservoir with the size: k

for    i= k+1 to n

m=random(1, i);

if( m < k)

swap the mth value and ith value

end for

解釋一下:程式的開始就是把前k個元素都放到陣列中,然後對之後的第i個元素,以k/i的概率替換掉這個水庫中的某乙個元素。

解法:我們總是選擇第乙個物件,以1/2的概率選擇第二個,以1/3的概率選擇第三個,以此類推,以1/m的概率選擇第m個物件。當該過程結束時,每乙個物件具有相同的選中概率,即1/n,證明如下。

證明:第m個物件最終被選中的概率p=選擇m的概率*其後面所有物件不被選擇的概率,即

對應蓄水池抽樣問題,可以類似的思路解決。先把讀到的前k個物件放入「水庫」,對於第k+1個物件開始,以k/(k+1)的概率選擇該物件,以k/(k+2)的概率選擇第k+2個物件,以此類推,以k/m的概率選擇第m個物件(m>k)。如果m被選中,則隨機替換水庫中的乙個物件。最終每個物件被選中的概率均為k/n,證明如下。

證明:第m個物件被選中的概率=選擇m的概率*(其後元素不被選擇的概率+其後元素被選擇的概率*不替換第m個物件的概率),即

蓄水池抽樣問題的偽**如下:

蓄水池抽樣

題目 要求從n個元素中隨機的抽取k個元素,其中n無法確定 解法 首先選擇n中的前k個數加入 蓄水池 中,然後從第k 1個數開始,以k k i i 1,2,3.的概率選擇這個數,然後在蓄水池中隨機選擇乙個數,並將其替換,n個元素遍歷完畢後,蓄水池中的k個數就是隨機選擇的。證明 這裡即需要證明每個數出現...

蓄水池抽樣

給定乙個長度很長的資料流,在處理完成之前不知道其具體長度,如何在遍歷一遍資料流的情況下,隨機地抽出m個不重複的資料。key words 長度很長,遍歷完之前不可知 o n 複雜度 等概率地抽出m個數,每個數被抽中的概率為m n。如果接收的資料量小於m,直接放入蓄水池reservoir如果接收的數量大...

蓄水池抽樣

給定乙個資料流,資料流長度n很大,且n直到處理完所有資料之前都不可知,請問如何在只遍歷一遍資料 o n 的情況下,能夠隨機選取出m個不重複的資料。這個場景強調了3件事 資料流長度n很大且不可知,所以不能一次性存入記憶體。時間複雜度為o n 隨機選取m個數,每個數被選中的概率為m n。蓄水池抽樣演算法...