摘要:最近發現兩個比較有意思的隨機抽樣算法,分享一下隨機抽樣且保持有序需求一家公司購買了他們的第一批電腦,該公司的業務主要是民意調查,現在要開發一個程序程序的輸入是選區名列表以及整數,輸出是隨機選擇的個選區名列表。
最近發現兩個比較有意思的隨機抽樣算法,分享一下
1. 隨機抽樣且保持有序需求:
一家公司購買了他們的第一批電腦,該公司的業務主要是民意調查,現在要開發一個程序:程序的輸入是選區名列表以及整數 m,輸出是隨機選擇的 m 個選區名列表。通常選區名有幾百個,m 通常在 20 ~ 40。
程序描述:
程序的輸入包含兩個整數 m 和 n,其中 m簡單點來說,就是有 n 個數, 隨機取 m 個,并保持有序。
解法:
我們知道了 n 和 m,輪流判斷 n 個數組成的列表中每個數的概率(m/n),每次判斷后n=n-1,若當前被判斷的數被選擇,則m=m-1,否則 m 不變。
假設 5 個數選 2 個,那么意味著每個數的概率都是 2/5 。我們以 2/5 的概率去判斷第 1 個數,那么結果有兩種,選擇1,不選擇。當判斷第 2 個的時候,在以選擇了第 1 個數的情況下,選擇 2 的概率是 (2-1)/(5-1)=1/4,在以沒選擇第 1 個數的情況下,選中 2 的概率是 2/(5-1)=2/4,所以第二個數的概率:(2/5)*(1/4) + (3/5)*(2/4) = 2/5。第二個數的概率和第一個數的概率相等。
證明:
實現:
# Python import random # 抽樣,從n個中抽m個 def sampling(lists, m, n=None): selected = [] if n is None: n = len(lists) remaining = n-1 for i in range(n): # random.random()返回 0 ~ 1的隨機數 if random.random() * remaining < m: selected.append(lists[i]) m -= 1 remaining -= 1 return selected # test lists = [i for i in range(10)] print sampling(lists, 3) # 結果 >>>[4, 5, 7]2. 在不知道總數的情況下隨機選一個如何從 n 個對象(可以依次看到這 n 個對象,但事先不知道 n 的值)中隨機選取一個?例如,如何在事先不知道文本行數的情況下讀取該文件,從中隨機選擇并輸出一行?解法:
我們先設一個變量叫selected,選擇第 1 行賦值給 selected,并以 1/2 的概率選擇第 2 行并重新賦值給selected, 以 1/3 的概率選擇第 3 行并重新賦值給selected。在這以過程結束時, 每一行的選中概率都是相等的(都是 1/n, 其中 n 是文件的總行數)
要證明這個概率可以從最后一行算起,設最后一行的概率為P(n)=1/n, 倒數第二行的概率為P(n-1)=(1-P(n))*(1/(n-1)) = 1/n,倒數第m-1行概率為:
代碼:
# Python import random def getRandLine(text): i = 1 selected = "" for line in text.splitlines(): if (random.random() < (1.0/i)): selected = line i += 1 return selected # test text = """ line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 """ print getRandLine(text) # 結果 >>>line9參考: 編程珠璣
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42828.html
摘要:輸出的結果如下上面輸出了每個數字被取樣到的次數,通過圖表可以清晰的看到分布情況可以看出蓄水池算法對于隨機抽樣還是非常適合的,每個元素的抽樣概率都相同。 showImg(https://segmentfault.com/img/remote/1460000015901186); 現在有一組數,不知道這組數的總量有多少,請描述一種算法能夠在這組數據中隨機抽取k個數,使得每個數被取出來的概率...
摘要:相反,這些數來源于統計抽樣,統計抽樣通過抽樣小部分群體來獲得更大群體的特征。但調查機構的報告與統計也經常帶有所謂的置信區間,也稱為偏差。在進行一個多變量測試時,消息推送的目標是測試全體,但是同一細分中的其他用戶不會收到該條消息。 摘要:Appboy 正在過手機等新興渠道嘗試一種新的方法,讓機構可以與顧客建立更好的關系,可以說是市場自動化產業的一個前沿探索者。在移動端探索上,該公司已經取...
摘要:在每一層學習到的結果表示作為下一層的輸入用監督訓練來調整所有層加上一個或者更多的用于產生預測的附加層當前,國外在這方面的研究就是三分天下的局面,的與微軟合作,的和合作,以及的計算機科學家和。深度學習的入門材料。 轉載自:http://doctorimage.cn/2013/01/04/%e5%85%b3%e4%ba%8e%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0...
閱讀 2283·2021-09-30 09:47
閱讀 2210·2021-09-26 09:55
閱讀 2938·2021-09-24 10:27
閱讀 1535·2019-08-27 10:54
閱讀 960·2019-08-26 13:40
閱讀 2486·2019-08-26 13:24
閱讀 2411·2019-08-26 13:22
閱讀 1720·2019-08-23 18:38