[英]Iterative or Lazy Reservoir Sampling
我非常熟悉使用 Reservoir Sampling 從一組未確定長度的數據中一次性采樣。 在我看來,這種方法的一個限制是它仍然需要遍歷整個數據集才能返回任何結果。 從概念上講,這是有道理的,因為必須允許整個序列中的項目有機會替換以前遇到的項目以實現統一樣本。
有沒有辦法在評估整個序列之前產生一些隨機結果? 我正在考慮那種很適合 python 偉大的 itertools 庫的懶惰方法。 也許這可以在給定的容錯范圍內完成? 我很感激關於這個想法的任何反饋!
只是為了稍微澄清一下這個問題,這張圖總結了我對不同采樣技術的內存中與流媒體權衡的理解。 我想要的是屬於Stream Sampling類別的東西,我們事先不知道人口的長度。
顯然,在不知道先驗長度的情況下仍然得到一個統一的樣本似乎是矛盾的,因為我們很可能會將樣本偏向於總體的開始。 有沒有辦法量化這種偏見? 是否需要進行權衡? 有沒有人有一個聰明的算法來解決這個問題?
如果您事先知道可迭代population
將產生的項目population
,則有可能在您到達時(不僅是在到達結束后)產生population
樣本的項目。 如果您事先不知道總體規模,這是不可能的(因為無法計算任何項目出現在樣本中的概率)。
這是一個執行此操作的快速生成器:
def sample_given_size(population, population_size, sample_size):
for item in population:
if random.random() < sample_size / population_size:
yield item
sample_size -= 1
population_size -= 1
請注意,生成器按照它們在總體中出現的順序生成項目(不是隨機順序,如random.sample
或大多數水庫采樣代碼),因此樣本的一部分不會是隨機子樣本!
如果事先知道人口規模,你不能只生成 sample_size 隨機“指數”(在流中)並使用它來做一個懶惰的產量嗎? 您不必閱讀整個流。
例如,如果population_size 為100,sample_size 為3,則生成從1 到100 的隨機整數集,假設您得到10、67 和72。
現在您生成流的第 10、62 和 72 個元素並忽略其余元素。
我想我不明白這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.