隨機(jī)抽取樣本問(wèn)題&蓄水池算法&按權(quán)重抽取問(wèn)題

面試被問(wèn)到的一個(gè)問(wèn)題:從N個(gè)樣本中隨機(jī)抽取m個(gè)樣本帽蝶,要求每個(gè)樣本被抽取的概率一致蓝牲。升級(jí)1:要求精準(zhǔn)抽到m個(gè)巡莹;升級(jí)2:對(duì)每個(gè)樣本添加權(quán)重,要求抽取概率按照權(quán)重分配冰抢。

基礎(chǔ)問(wèn)題

問(wèn)題描述:從N個(gè)樣本中隨機(jī)抽取m個(gè)樣本松嘶,要求每個(gè)樣本被抽取的概率一致,求怎么樣抽瓤嫒拧喘蟆?數(shù)據(jù)量為百萬(wàn)級(jí)。
看到這個(gè)問(wèn)題鼓鲁,最先想到的方法是,依次遍歷每個(gè)樣本港谊,以\frac{m}{n}的概率抽中當(dāng)前樣本作為最后m中的一個(gè)骇吭,具體操作可以是:
1、每遍歷一個(gè)樣本歧寺,生成一個(gè)0\sim N之間的隨機(jī)數(shù)x燥狰,對(duì)比xm的大小斜筐;
2龙致、若x大于m,說(shuō)明屬于\frac{1-m}{n}概率內(nèi)顷链,不抽目代;若x小于等于m,說(shuō)明屬于\frac{m}{n}概率內(nèi)嗤练,抽它榛了;
3、直到所有樣本遍歷結(jié)束煞抬。

還可以從另一個(gè)角度證明這個(gè)算法的公平性霜大,對(duì)每個(gè)抽中的樣本來(lái)說(shuō),它應(yīng)該是被抽中的第i個(gè)樣本革答,那么它被抽中的概率是:第一次就被抽中的概率+第一次沒(méi)抽中第二次被抽中的概率+...+前m-1次都沒(méi)抽中最后一次抽中的概率战坤,用式子表示就是:

\begin{align} P_{樣本被抽中}&=\frac{1}{n}+\frac{n-1}{n}*\frac{1}{n-1}+...+\frac{n-1}{n}*\frac{n-2}{n-1}*...*\frac{1}{n-m+1} \\&=\frac{1}{n}+\frac{1}{n}+...+\frac{1}{n} \\&=\frac{m}{n} \end{align}

不考慮調(diào)用隨機(jī)數(shù)生成函數(shù)的耗時(shí)的話(huà),這樣做還有個(gè)問(wèn)題残拐,那就是最后抽中的數(shù)不一定正好是m個(gè)途茫,因?yàn)橐淮伪闅v只保證了每個(gè)樣本等概率被抽中,沒(méi)法保證抽到的樣本量溪食。這時(shí)又想到慈省,在遍歷過(guò)程中要是抽滿(mǎn)了m個(gè),就退出循環(huán)停止遍歷,可是當(dāng)遍歷完都沒(méi)有抽滿(mǎn)m個(gè)該怎么辦呢边败?選擇再遍歷一次的話(huà)復(fù)雜度會(huì)很高袱衷,也可能出現(xiàn)遍歷了很多次都沒(méi)抽滿(mǎn)的情況。

升級(jí)問(wèn)題1

問(wèn)題描述:從N個(gè)樣本中隨機(jī)抽取m個(gè)樣本笑窜,要求每個(gè)樣本被抽取的概率一致致燥,而且保證最后正好抽到m個(gè)數(shù)。

其實(shí)不算是升級(jí)問(wèn)題排截,因?yàn)樵谏蟼€(gè)問(wèn)題中其實(shí)已經(jīng)規(guī)定了要抽取m個(gè)嫌蚤,只是因?yàn)閮?yōu)先想到的解法出現(xiàn)了bug,所以不得不再重新思考断傲。

解法1

蓄水池算法可以很好地解決這個(gè)問(wèn)題脱吱,但這里先不介紹它,先介紹另一種同樣能實(shí)現(xiàn)的方式:i個(gè)樣本认罩,被抽中的概率是\frac {m-k}{n-i+1}箱蝠,k是已經(jīng)抽中的樣本個(gè)數(shù)
1垦垂、第一個(gè)樣本以概率\frac{m}{n}抽取就好宦搬;
2、若第一個(gè)樣本沒(méi)抽中劫拗,則第二個(gè)樣本抽中概率為(1-\frac{m}{n})*\frac{m}{n-1}间校;若第一個(gè)樣本被抽中了,那么第二個(gè)樣本抽中的概率為\frac{m}{n}*\frac{m-1}{n-1}页慷,兩種情況加起來(lái)憔足,第二個(gè)樣本被抽中的概率為(1-\frac{m}{n})*\frac{m}{n-1}+\frac{m}{n}*\frac{m-1}{n-1}=\frac{m}{n}
3酒繁、后面的樣本依次類(lèi)推四瘫,抽中概率和當(dāng)前樣本序號(hào)i和已經(jīng)抽中的樣本數(shù)k有關(guān),最后可以得到每個(gè)樣本被抽中的概率都是\frac{m}{n}欲逃。

這個(gè)算法能夠保證每個(gè)樣本被抽到的概率都為\frac{m}{n}找蜜,并且最后抽到的樣本為m個(gè)。關(guān)鍵在于稳析,每遍歷或抽到一個(gè)樣本之后洗做,都要對(duì)接下來(lái)抽取的概率做調(diào)整,當(dāng)抽取的很快時(shí)彰居,概率的分子項(xiàng)會(huì)變小诚纸,后面樣本越來(lái)越難被抽到;當(dāng)抽取的比較慢陈惰,概率分子項(xiàng)會(huì)變大畦徘,后面樣本被抽到的概率也會(huì)變大。而且當(dāng)抽滿(mǎn)m個(gè)之后,后面樣本被抽到的概率就為0了井辆;當(dāng)前面的遍歷一直沒(méi)抽滿(mǎn)值关筒,N中只剩下m個(gè)樣本時(shí),每個(gè)樣本被抽中的概率變?yōu)?杯缺,所以怎么樣都能滿(mǎn)足條件蒸播。

解法2

接下來(lái)再看蓄水池算法,該算法是針對(duì)從一個(gè)長(zhǎng)度為N的序列中隨機(jī)抽取不重復(fù)的m個(gè)數(shù)萍肆,保證每個(gè)數(shù)被抽取到的概率為\frac{m}{n}這個(gè)問(wèn)題而構(gòu)建的袍榆,算法步驟為:
1、構(gòu)建一個(gè)可放m個(gè)元素的蓄水池塘揣,將序列的前m個(gè)元素放入蓄水池中包雀;
2、從第m+1個(gè)元素開(kāi)始亲铡,以\frac{m}{n}的概率來(lái)決定該元素是否被替換到池子中才写;
3、當(dāng)遍歷完所有元素之后奴愉,蓄水池中的就是隨機(jī)挑選出的m個(gè)元素。

算法偽代碼為:

for i= m+1 to N
    k=random(1, i);
    if( k < m)
        SWAP the kth value and ith value
end for

上述算法的證明:

  • 對(duì)于蓄水池中的前m個(gè)樣本铁孵,最開(kāi)始被選中的概率為1锭硼,然后每個(gè)樣本留到最后的概率=(m+1到n的遍歷中,每次替換都抽不到自己的概率)蜕劝,寫(xiě)成公式是P=1*\frac{m}{m+1}*\frac{m+1}{m+2}*...*\frac{n-1}{n}=\frac{m}{n}檀头;
  • 對(duì)于蓄水池之外的樣本,從第m+1個(gè)開(kāi)始岖沛,設(shè)序號(hào)為j暑始,它們最終能被換到蓄水池中的概率=遍歷到自己的時(shí)候被換進(jìn)去的概率*被換進(jìn)去之后不再被換出來(lái)的概率,寫(xiě)成公式是P=\frac{m}{j}*\frac{j}{j+1}*\frac{j+1}{j+2}*...*\frac{n-1}{n}=\frac{m}{n}

因此婴削,不論剛開(kāi)始是在蓄水池內(nèi)還是在外廊镜,最后留在蓄水池內(nèi)的概率都是一樣的,而且這個(gè)算法一定保證了能選出m個(gè)樣本來(lái)唉俗,因?yàn)橐婚_(kāi)始就是基于替換的思路嗤朴。

升級(jí)問(wèn)題2

問(wèn)題描述:從N個(gè)樣本中隨機(jī)抽取m個(gè)樣本,要求每個(gè)樣本被抽取的概率一致虫溜。在此基礎(chǔ)上雹姊,為每個(gè)樣本分配一個(gè)權(quán)重值w,范圍為[1,k]衡楞,表示權(quán)值為k的樣本被抽中的概率是權(quán)值為1的樣本概率的k倍吱雏。

解法很簡(jiǎn)單,在上面解法1的步驟中添加一個(gè)權(quán)重概率就好了:i個(gè)樣本,被抽中的概率是\frac{w_i}{\sum_{i=1}^{i=N}w_i}*\frac {m-k}{n-i+1}歧杏,k是已經(jīng)抽中的樣本個(gè)數(shù),w_i表示第i個(gè)樣本的權(quán)重镰惦。
1、第一個(gè)樣本以概率\frac{w_1}{\sum_{i=1}^{i=N}w_i}*\frac{m}{n}抽取就好得滤;
2陨献、若第一個(gè)樣本沒(méi)抽中,則第二個(gè)樣本抽中概率為(1-\frac{m}{n})*\frac{w_2}{\sum_{i=1}^{i=N}w_i}*\frac{m}{n-1}懂更;若第一個(gè)樣本被抽中了眨业,那么第二個(gè)樣本抽中的概率為\frac{m}{n}*\frac{w_2}{\sum_{i=1}^{i=N}w_i}*\frac{m-1}{n-1},兩種情況加起來(lái)沮协,第二個(gè)樣本被抽中的概率為(1-\frac{m}{n})*\frac{w_2}{\sum_{i=1}^{i=N}w_i}*\frac{m}{n-1}+\frac{m}{n}*\frac{w_2}{\sum_{i=1}^{i=N}w_i}*\frac{m-1}{n-1}=\frac{w_2}{\sum_{i=1}^{i=N}w_i}*\frac{m}{n}龄捡;
3、后面的樣本依次類(lèi)推慷暂,抽中概率和當(dāng)前樣本序號(hào)i和已經(jīng)抽中的樣本數(shù)k聘殖,以及當(dāng)前樣本權(quán)重有關(guān),最后可以得到每個(gè)樣本被抽中的概率都是\frac{w_i}{\sum_{i=1}^{i=N}w_i}*\frac{m}{n}行瑞。

在保證每個(gè)樣本等概率被抽中的基礎(chǔ)上奸腺,再加入權(quán)重的影響,就能實(shí)現(xiàn)有概率差別地抽中血久。

但這里有個(gè)問(wèn)題沒(méi)想明白突照,為什么乘上去的權(quán)重概率要除以所有權(quán)重的和,直接乘以當(dāng)前樣本的權(quán)重w_i會(huì)出現(xiàn)什么問(wèn)題氧吐?

參考文章

1讹蘑、https://blog.csdn.net/bitcarmanlee/article/details/83016377
2、https://www.cnblogs.com/ywl925/p/3793003.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筑舅,一起剝皮案震驚了整個(gè)濱河市座慰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠拣,老刑警劉巖版仔,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異误墓,居然都是意外死亡邦尊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)蝉揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畦娄,“玉大人弊仪,你說(shuō)我怎么就攤上這事励饵』迹” “怎么了表窘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵乐严,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捂敌,道長(zhǎng)既琴,這世上最難降的妖魔是什么甫恩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纹腌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莱褒。我一直安慰自己广凸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扭吁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溉贿。 梳的紋絲不亂的頭發(fā)上浦旱,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天颁湖,我揣著相機(jī)與錄音爷狈,去河邊找鬼。 笑死思币,一個(gè)胖子當(dāng)著我的面吹牛羡微,可吹牛的內(nèi)容都是我干的妈倔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捧挺!你這毒婦竟也來(lái)了闽烙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎很魂,沒(méi)想到半個(gè)月后遏匆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體骤铃,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惰爬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年撕瞧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狞尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偏序。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡研儒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出好芭,到底是詐尸還是另有隱情冲呢,我是刑警寧澤敬拓,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布乘凸,位于F島的核電站,受9級(jí)特大地震影響木人,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渔嚷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一客年、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧司恳,春花似錦绍傲、人聲如沸烫饼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铝量。三九已至银亲,卻和暖如春群凶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赠尾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寸宵,地道東北人元咙。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓甲棍,卻偏偏與公主長(zhǎng)得像赶掖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陪白,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354