1. 程式人生 > >水庫抽樣Reservoir Sampling(蓄水池問題)

水庫抽樣Reservoir Sampling(蓄水池問題)

數據流 再計算 tle art 為知 情況下 http dom mod

知識復習

空間亞線性算法:由於大數據算法中涉及到的數據是海量的,數據難以放入內存計算,所以一種常用的處理辦法是不對全部數據進行計算,而只向內存裏放入小部分數據,僅使用內存中的小部分數據,就可以得到一個有質量保證的結果。

數據流算法:是指數據源源不斷地到來,根據到來的數據返回相應的部分結果。適用於兩種情況:第一、數據量非常大僅能掃描一次時,可以把數據看成數據流,把掃描看成數據到來。第二、數據更新非常快,不能把所有數據都保存下來再計算結果,此時可以把數據看成是一個數據流。

在一些情況下,空間亞線性算法也叫數據流算法。


水庫抽樣(海量數據隨機抽樣問題)(蓄水池問題)

輸入:一組數據,其大小未知

輸出:這組數據的k個均勻抽樣

要求:
僅掃描數據一次。
空間復雜度為O(K)。空間復雜度與整個數據量無關,只與抽樣大小有關。
掃描到數據的前n 個數據時(n>k),保存當前已掃描數據的k個均勻抽樣。

問題可以理解為:蓄水池(水庫)的容量為k,對於n(n>k)個元素,如果第i個元素(i從1逐漸遞增至n)以k/i的概率決定是否將它放入蓄水池,當i=n時,蓄水池中存放的是n個元素的均勻抽樣,每個數字最終被存在數組中的概率相等,為k/n。見下面的證明

水庫抽樣算法描述

1、申請一個長度為k的數組A保存抽樣。
2、保存首先接收到的k個元素
3、當接收到第i個新元素t時,以k/i的概率隨機替換A中的元素(即生成[1,i]間隨機數j,若j<=k,則以t替換A[j])

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 

  

證明一

當接收到第i個新元素t時,以k/i的概率保存在水庫中,所以在接收第i+1個數時,第i個數還能保存在水庫當中的概率是1-1/(i+1),因為在接收到第i+1個數時要以k/(i+1)的概率隨機替換,而第i個數被選中的概率是1/k,它們相乘即為1/(i+1)。1/(i+1)為第i個元素被換出水庫的概率,所以1-1/(i+1)就是在接收第i+1個元素時第i個元素在數組中的概率。同理,在接收第i+2個元素時,第i個元素讓然保留在水庫中的概率為1-1/(i+2)。以此類推,當接收第n個元素時,第i個元素保存在水庫中的概率為1-1/n。只有這些事件都放生了,最終第i個元素才能保留在水庫當中。因此第i個元素最終被保留在水庫抽樣當中的概率,就是這些事件的概率的乘積,即

技術分享圖片

證明二

(1)第一步初始化。出現在水庫中的前k個元素,直接保存在數組A中。前k個數被選中的概率都是一致的,都是1。

(2)第二步。在處理第k+1個元素時分兩種情況:

情況1:第k+1個元素未被選中,數組中沒有元素被替換;此時,數組中每個元素的出現概率肯定是一樣的,這很顯然。但具體是多少呢?就是第k+1個元素未被選中的概率:1-P(第k+1個元素被選中)=1-k/(k+1)=1/(k+1)。(由於第k+1個元素被選中的概率是k/(k+1)(根據公式k/i))

情況2:第k+1個元素被選中,數組中某個元素被第k+1個元素替換掉。第k+1個元素被選中的概率是k/(k+1)(根據公式k/i),所以這個新元素在水庫中出現的概率就一定是k/(k+1)(不管它替換掉哪個元素)。下面來看水庫中原有元素最終還能留在水庫中的概率,水庫中原有數據被替換的幾率都相等為1/k。水庫中任意一個元素被替換掉的概率是:(k/k+1)*(1/k)=1/(k+1),意即首先要第k+1個元素被選中,然後該元素在k個元素中被選中。那它未被替換的概率就是1-1/(k+1)=k/(k+1)。可以看出來,舊元素和新元素出現的概率是相等的。

(3)第k+1之後面每個元素都重復第二步,即第i (i>k+1)個元素以k/i的概率決定是否將它放入蓄水池,最終所有元素出現在水庫中的概率相等。 來源: https://blog.csdn.net/so_geili/article/details/52937212

來自為知筆記(Wiz)



水庫抽樣Reservoir Sampling(蓄水池問題)