1. 程式人生 > >亞線性演算法-水庫抽樣(Reservoir Sampling)演算法

亞線性演算法-水庫抽樣(Reservoir Sampling)演算法

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

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

問題描述:

輸入:一組資料,大小未知

輸出:這組資料的K個均勻抽取

要求:僅掃描一次

總體要求:從N個元素中隨機的抽取k個元素,其中N無法確定,保證每個元素抽到的概率相同

問題可以理解為:蓄水池(水庫)的容量為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])

證明:當接收到第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個元素最終被保留在水庫抽樣當中的概率,就是這些事件的概率的乘積,即

                  

數學歸納證明方法:

假設:當第n個元素以k/n,前n-1個元素也被選中的概率也為k/n

    1)當n<=k時,出現在A中的每個元素概率都是相同的,都為1 
    2)當n=k+1時,計算前k個元素在A的概率 
    ==a==.前k個元素在A中的元素概率都為1 
    ==b==.由假設得,第k+1個元素被選中的概率為:k/(k+1),A任意元素被替換的概率為(k/(k+1))*(1/k)=1/(k+1),沒被替換(即選中)的概率為1-1/(k+1)=k/(k+1). 
    由a*b=1*k/(k+1)=k/(k+1),前k個元素和k+1元素被選中的概率都為k/k+1。

    3)當n>k+1時,計算前n-1個元素在A的概率 
    ==a==.前n-1個元素在Al中被選擇的的概率為k/(n-1) 
    ==b==.由假設得,第n個元素被選中的概率為:k/n,A任意元素被替換的概率為(k/n)*(1/k)=1/n,沒被替換(即選中)的概率為1-1/n=(n-1/)n。 
    由a*b=(k/(n-1))*((n-1)/n)=k/n,前k個元素和k+1元素被選中的概率都為k/n。

因為假設成立,所以到資料結束時,所有元素的抽到的概率都為k/n