海量数据随机抽样问题(蓄水池问题)
生活随笔
收集整理的這篇文章主要介紹了
海量数据随机抽样问题(蓄水池问题)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
隨機(jī)抽樣問題表示如下:
要求從N個(gè)元素中隨機(jī)的抽取k個(gè)元素,其中N無法確定。
這種應(yīng)用的場(chǎng)景一般是數(shù)據(jù)流的情況下,由于數(shù)據(jù)只能被讀取一次,而且數(shù)據(jù)量很大,并不能全部保存,因此數(shù)據(jù)量N是無法在抽樣開始時(shí)確定的;但又要保持隨機(jī)性,于是有了這個(gè)問題。所以搜索網(wǎng)站有時(shí)候會(huì)問這樣的問題。
這里的核心問題就是“隨機(jī)”,怎么才能是隨機(jī)的抽取元素呢?我們?cè)O(shè)想,買彩票的時(shí)候,由于所有彩票的中獎(jiǎng)概率都是一樣的,所以我們才是“隨機(jī)的”買彩票。那么要使抽取數(shù)據(jù)也隨機(jī),必須使每一個(gè)數(shù)據(jù)被抽樣出來的概率都一樣。
【解決】
解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持一個(gè)集合(這個(gè)集合中的每個(gè)數(shù)字出現(xiàn)),作為蓄水池,依次遍歷所有數(shù)據(jù)的時(shí)候以一定概率替換這個(gè)蓄水池中的數(shù)字。
其偽代碼如下:
Init : a reservoir with the size: kfor i= k+1 to NM=random(1, i);if( M < k)SWAP the Mth value and ith valueend for?解釋一下:程序的開始就是把前k個(gè)元素都放到水庫中,然后對(duì)之后的第i個(gè)元素,以k/i的概率替換掉這個(gè)水庫中的某一個(gè)元素。
下面來具體證明一下:每個(gè)水庫中的元素出現(xiàn)概率都是相等的。
【證明】
(1)初始情況。出現(xiàn)在水庫中的k個(gè)元素的出現(xiàn)概率都是一致的,都是1。這個(gè)很顯然。
(2)第一步。第一步就是指,處理第k+1個(gè)元素的情況。分兩種情況:元素全部都沒有被替換;其中某個(gè)元素被第k+1個(gè)元素替換掉。
我們先看情況2:第k+1個(gè)元素被選中的概率是k/(k+1)(根據(jù)公式k/i),所以這個(gè)新元素在水庫中出現(xiàn)的概率就一定是k/(k+1)(不管它替換掉哪個(gè)元素,反正肯定它是以這個(gè)概率出現(xiàn)在水庫中)。下面來看水庫中剩余的元素出現(xiàn)的概率,也就是1-P(這個(gè)元素被替換掉的概率)。水庫中任意一個(gè)元素被替換掉的概率是:(k/k+1)*(1/k)=1/(k+1),意即首先要第k+1個(gè)元素被選中,然后自己在集合的k個(gè)元素中被選中。那它出現(xiàn)的概率就是1-1/(k+1)=k/(k+1)??梢钥闯鰜?#xff0c;舊元素和新元素出現(xiàn)的概率是相等的。
情況1:當(dāng)元素全部都沒有替換掉的時(shí)候,每個(gè)元素的出現(xiàn)概率肯定是一樣的,這很顯然。但具體是多少呢?就是1-P(第k+1個(gè)元素被選中)=1-k/(k+1)=1/(k+1)。
(3)歸納法:重復(fù)上面的過程,只要證明第i步到第i+1步,所有元素出現(xiàn)的概率是相等的即可。
看到一個(gè)問題:怎樣隨機(jī)從N個(gè)元素中選擇一個(gè)元素,你依次遍歷每個(gè)元素,但不知道N多大。
將N個(gè)元素用[1、2、...、N]編號(hào)。如果在知道N的大小,我們可以從[1、N]中隨機(jī)選擇一個(gè)數(shù)作為選擇對(duì)象。
但是現(xiàn)在不知道N的大小,要使每一個(gè)元素被取的概率相等(隨機(jī))。這個(gè)概念叫蓄水池抽樣。
Solution:以1/i的概率取第i個(gè)元素。
證明:數(shù)學(xué)歸納法。當(dāng)i=1時(shí):第1個(gè)元素以1/1=1的概率被取,符合條件。
設(shè)i=k時(shí)符合條件,即前k個(gè)元素都以1/k的概率被取。
則i=k+1時(shí):對(duì)于第k+1個(gè)元素,被取概率為1/(k+1),符合條件。
對(duì)于前k個(gè)元素,每個(gè)元素被取的概率=被取并且沒被第k+1個(gè)元素替換的概率=(1/k)*(1?1/(k+1))=1/(k+1)符合條件。
綜上所述:得證。
將問題擴(kuò)展:給你一個(gè)長(zhǎng)度為N的鏈表。N很大,但你不知道N有多大。你的任務(wù)是從這N個(gè)元素中隨機(jī)取出k個(gè)元素。你只能遍歷這個(gè)鏈表一次。你的算法必須保證取出的元素恰好有k個(gè),且它們是完全隨機(jī)的(出現(xiàn)概率均等)。
這次與上面唯一的不同是:總共需要取k個(gè)元素。仿照即可得出解決方案。
Solution:以1的概率取前k個(gè)元素,從i=k+1開始,以k/i的概率取第i個(gè)元素,若被取,以均等的概率替換先前被取的k個(gè)元素。
證明:同樣數(shù)學(xué)歸納法。當(dāng)i=k+1時(shí):第k+1個(gè)元素以k/k+1概率被取,前k個(gè)元素被取的概率=1 - 被第k+1個(gè)元素替換的概率=1?k/(k+1)*1/k=k/(k+1) 符合條件。
設(shè)i=p時(shí)符合條件,即前p個(gè)元素都以k/p的概率被取。
則i=p+1時(shí):對(duì)第p+1個(gè)元素,被取概率為k/(p+1)符合條件。
對(duì)于前p個(gè)元素,每個(gè)元素被取的概率=被取并且沒有被第p+1個(gè)元素替換的概率=
k/p*((1?k/(p+1))+k/(p+1)*(1?1/k))=k/p+1同樣符合條件。
綜上所述:得證。
另外還有一種方法:給每個(gè)元素隨機(jī)生成一個(gè)固定區(qū)間(如[0,1])的權(quán)重。用一個(gè)大小為k的堆來選取權(quán)重較大的k個(gè)元素。仿照也可解決最開始的取1個(gè)的問題。
要求從N個(gè)元素中隨機(jī)的抽取k個(gè)元素,其中N無法確定。
這種應(yīng)用的場(chǎng)景一般是數(shù)據(jù)流的情況下,由于數(shù)據(jù)只能被讀取一次,而且數(shù)據(jù)量很大,并不能全部保存,因此數(shù)據(jù)量N是無法在抽樣開始時(shí)確定的;但又要保持隨機(jī)性,于是有了這個(gè)問題。所以搜索網(wǎng)站有時(shí)候會(huì)問這樣的問題。
這里的核心問題就是“隨機(jī)”,怎么才能是隨機(jī)的抽取元素呢?我們?cè)O(shè)想,買彩票的時(shí)候,由于所有彩票的中獎(jiǎng)概率都是一樣的,所以我們才是“隨機(jī)的”買彩票。那么要使抽取數(shù)據(jù)也隨機(jī),必須使每一個(gè)數(shù)據(jù)被抽樣出來的概率都一樣。
【解決】
解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持一個(gè)集合(這個(gè)集合中的每個(gè)數(shù)字出現(xiàn)),作為蓄水池,依次遍歷所有數(shù)據(jù)的時(shí)候以一定概率替換這個(gè)蓄水池中的數(shù)字。
其偽代碼如下:
Init : a reservoir with the size: kfor i= k+1 to NM=random(1, i);if( M < k)SWAP the Mth value and ith valueend for?解釋一下:程序的開始就是把前k個(gè)元素都放到水庫中,然后對(duì)之后的第i個(gè)元素,以k/i的概率替換掉這個(gè)水庫中的某一個(gè)元素。
下面來具體證明一下:每個(gè)水庫中的元素出現(xiàn)概率都是相等的。
【證明】
(1)初始情況。出現(xiàn)在水庫中的k個(gè)元素的出現(xiàn)概率都是一致的,都是1。這個(gè)很顯然。
(2)第一步。第一步就是指,處理第k+1個(gè)元素的情況。分兩種情況:元素全部都沒有被替換;其中某個(gè)元素被第k+1個(gè)元素替換掉。
我們先看情況2:第k+1個(gè)元素被選中的概率是k/(k+1)(根據(jù)公式k/i),所以這個(gè)新元素在水庫中出現(xiàn)的概率就一定是k/(k+1)(不管它替換掉哪個(gè)元素,反正肯定它是以這個(gè)概率出現(xiàn)在水庫中)。下面來看水庫中剩余的元素出現(xiàn)的概率,也就是1-P(這個(gè)元素被替換掉的概率)。水庫中任意一個(gè)元素被替換掉的概率是:(k/k+1)*(1/k)=1/(k+1),意即首先要第k+1個(gè)元素被選中,然后自己在集合的k個(gè)元素中被選中。那它出現(xiàn)的概率就是1-1/(k+1)=k/(k+1)??梢钥闯鰜?#xff0c;舊元素和新元素出現(xiàn)的概率是相等的。
情況1:當(dāng)元素全部都沒有替換掉的時(shí)候,每個(gè)元素的出現(xiàn)概率肯定是一樣的,這很顯然。但具體是多少呢?就是1-P(第k+1個(gè)元素被選中)=1-k/(k+1)=1/(k+1)。
(3)歸納法:重復(fù)上面的過程,只要證明第i步到第i+1步,所有元素出現(xiàn)的概率是相等的即可。
看到一個(gè)問題:怎樣隨機(jī)從N個(gè)元素中選擇一個(gè)元素,你依次遍歷每個(gè)元素,但不知道N多大。
將N個(gè)元素用[1、2、...、N]編號(hào)。如果在知道N的大小,我們可以從[1、N]中隨機(jī)選擇一個(gè)數(shù)作為選擇對(duì)象。
但是現(xiàn)在不知道N的大小,要使每一個(gè)元素被取的概率相等(隨機(jī))。這個(gè)概念叫蓄水池抽樣。
Solution:以1/i的概率取第i個(gè)元素。
證明:數(shù)學(xué)歸納法。當(dāng)i=1時(shí):第1個(gè)元素以1/1=1的概率被取,符合條件。
設(shè)i=k時(shí)符合條件,即前k個(gè)元素都以1/k的概率被取。
則i=k+1時(shí):對(duì)于第k+1個(gè)元素,被取概率為1/(k+1),符合條件。
對(duì)于前k個(gè)元素,每個(gè)元素被取的概率=被取并且沒被第k+1個(gè)元素替換的概率=(1/k)*(1?1/(k+1))=1/(k+1)符合條件。
綜上所述:得證。
將問題擴(kuò)展:給你一個(gè)長(zhǎng)度為N的鏈表。N很大,但你不知道N有多大。你的任務(wù)是從這N個(gè)元素中隨機(jī)取出k個(gè)元素。你只能遍歷這個(gè)鏈表一次。你的算法必須保證取出的元素恰好有k個(gè),且它們是完全隨機(jī)的(出現(xiàn)概率均等)。
這次與上面唯一的不同是:總共需要取k個(gè)元素。仿照即可得出解決方案。
Solution:以1的概率取前k個(gè)元素,從i=k+1開始,以k/i的概率取第i個(gè)元素,若被取,以均等的概率替換先前被取的k個(gè)元素。
證明:同樣數(shù)學(xué)歸納法。當(dāng)i=k+1時(shí):第k+1個(gè)元素以k/k+1概率被取,前k個(gè)元素被取的概率=1 - 被第k+1個(gè)元素替換的概率=1?k/(k+1)*1/k=k/(k+1) 符合條件。
設(shè)i=p時(shí)符合條件,即前p個(gè)元素都以k/p的概率被取。
則i=p+1時(shí):對(duì)第p+1個(gè)元素,被取概率為k/(p+1)符合條件。
對(duì)于前p個(gè)元素,每個(gè)元素被取的概率=被取并且沒有被第p+1個(gè)元素替換的概率=
k/p*((1?k/(p+1))+k/(p+1)*(1?1/k))=k/p+1同樣符合條件。
綜上所述:得證。
另外還有一種方法:給每個(gè)元素隨機(jī)生成一個(gè)固定區(qū)間(如[0,1])的權(quán)重。用一個(gè)大小為k的堆來選取權(quán)重較大的k個(gè)元素。仿照也可解決最開始的取1個(gè)的問題。
總結(jié)
以上是生活随笔為你收集整理的海量数据随机抽样问题(蓄水池问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后缀数组求最长重复子串
- 下一篇: 搜狐2012.9.15校园招聘会笔试题