fbpx
维基百科

水塘抽樣

水塘抽樣(英語:Reservoir sampling)是一系列的隨機算法,其目的在於從包含n個項目的集合S中選取k個樣本,其中n為一很大或未知的數量,尤其適用於不能把所有n個項目都存放到内存的情況。最常見例子為Jeffrey Vitter英语Jeffrey Vitter在其論文[1]中所提及的算法R

參照Dictionary of Algorithms and Data Structures[2]所載的算法,包含以下步驟(假設数组S以0開始標示):

從S中抽取首k項放入「水塘」中 對於每一個S[j]項(j ≥ k): 隨機產生一個範圍從0到j的整數r 若 r < k 則把水塘中的第r項換成S[j]項 

實例

高德納計算機程序設計藝術中,有如下問題:

可否在一未知大小的集合中,隨機取出一元素?

例如在一很大,但未知確實行數的文字檔中抽取任意一行。如果要確保每一行抽取的機率相等,即是說如果最後發現文字檔共有N行,則每一行被抽取的機率均為1/N,則有如下算法(以Perl表示)

$line; $n = 0; srand; while(<>) { $n++; $line = $_ if (rand < (1/$n)); } 

以下Perl程序為上述程序之精簡寫法:

srand; rand($.) < 1 && ($line = $_) while <>; 

上例中,在迴圈內第n行被抽取的機率為1/n,以 表示。如果檔案共有N行,任意第n行被抽取的機率為

 

故此,各行被抽取的機率均相同。

由於上述算法不需要先把整個檔案掃描以判定總行數再作抽樣,此算法是一線上算法。

以上問題可擴展為

可否在一未知大小的集合中,隨機取出k個元素?

亦即是說,如果檔案共有 行,則每一行被抽取的機率為 ,則算法為

$k = 輸出數量; @lines; $n = 0; srand; while(<>) { $n++; if ($n <= $k) { push(@lines, $_); } else { $r = int(rand($n)); if ($r < $k) { $lines[$r] = $_; } } } 

上例中,在迴圈內第n行被抽取的機率為k/n,以 表示。如果檔案共有N行,任意第n行被抽取的機率為

 

因此,各行被抽取的機率均相同。同理,此算法亦是線上算法。

在水塘算法的定義中,並沒有要求每一項目被抽取的機率相同,然而相同機率的情況較常用。

參考文獻

  1. ^ Jeffrey Scott Vitter. Random Sampling with a Reservoir (PDF). [2020-02-09]. (原始内容 (PDF)于2020-02-28) (英语). 
  2. ^ reservoir sampling. [2020-02-09]. (原始内容于2018-10-13) (英语). 

水塘抽樣, 英語, reservoir, sampling, 是一系列的隨機算法, 其目的在於從包含n個項目的集合s中選取k個樣本, 其中n為一很大或未知的數量, 尤其適用於不能把所有n個項目都存放到内存的情況, 最常見例子為jeffrey, vitter, 英语, jeffrey, vitter, 在其論文, 中所提及的算法r, 參照dictionary, algorithms, data, structures, 所載的o, displaystyle, 算法, 包含以下步驟, 假設数组s以0開始標示, 從s中抽. 水塘抽樣 英語 Reservoir sampling 是一系列的隨機算法 其目的在於從包含n個項目的集合S中選取k個樣本 其中n為一很大或未知的數量 尤其適用於不能把所有n個項目都存放到内存的情況 最常見例子為Jeffrey Vitter 英语 Jeffrey Vitter 在其論文 1 中所提及的算法R 參照Dictionary of Algorithms and Data Structures 2 所載的O n displaystyle O n 算法 包含以下步驟 假設数组S以0開始標示 從S中抽取首k項放入 水塘 中 對於每一個S j 項 j k 隨機產生一個範圍從0到j的整數r 若 r lt k 則把水塘中的第r項換成S j 項實例 编辑在高德納的計算機程序設計藝術中 有如下問題 可否在一未知大小的集合中 隨機取出一元素 例如在一很大 但未知確實行數的文字檔中抽取任意一行 如果要確保每一行抽取的機率相等 即是說如果最後發現文字檔共有N行 則每一行被抽取的機率均為1 N 則有如下算法 以Perl表示 line n 0 srand while lt gt n line if rand lt 1 n 以下Perl程序為上述程序之精簡寫法 srand rand lt 1 amp amp line while lt gt 上例中 在迴圈內第n行被抽取的機率為1 n 以P n displaystyle P n 表示 如果檔案共有N行 任意第n行被抽取的機率為 P n k n 1 N 1 P k 1 n k n 1 N 1 1 k 1 n k n 1 N k 1 k 1 n n n 1 n 1 n 2 N 1 N 1 N displaystyle begin aligned amp P n prod k n 1 N 1 P k amp frac 1 n prod k n 1 N 1 frac 1 k amp frac 1 n prod k n 1 N frac k 1 k amp frac 1 n frac n n 1 frac n 1 n 2 cdots frac N 1 N amp frac 1 N end aligned 故此 各行被抽取的機率均相同 由於上述算法不需要先把整個檔案掃描以判定總行數再作抽樣 此算法是一線上算法 以上問題可擴展為 可否在一未知大小的集合中 隨機取出k個元素 亦即是說 如果檔案共有N k displaystyle N geq k 行 則每一行被抽取的機率為k N displaystyle frac k N 則算法為 k 輸出數量 lines n 0 srand while lt gt n if n lt k push lines else r int rand n if r lt k lines r 上例中 在迴圈內第n行被抽取的機率為k n 以P n displaystyle P n 表示 如果檔案共有N行 任意第n行被抽取的機率為 P n j n 1 N 1 P j k k n j n 1 N 1 k k j k n j n 1 N j 1 j k n n n 1 n 1 n 2 N 1 N k N displaystyle begin aligned amp P n prod j n 1 N 1 frac P j k amp frac k n prod j n 1 N 1 frac k kj amp frac k n prod j n 1 N frac j 1 j amp frac k n frac n n 1 frac n 1 n 2 cdots frac N 1 N amp frac k N end aligned 因此 各行被抽取的機率均相同 同理 此算法亦是線上算法 在水塘算法的定義中 並沒有要求每一項目被抽取的機率相同 然而相同機率的情況較常用 參考文獻 编辑 Jeffrey Scott Vitter Random Sampling with a Reservoir PDF 2020 02 09 原始内容存档 PDF 于2020 02 28 英语 reservoir sampling 2020 02 09 原始内容存档于2018 10 13 英语 取自 https zh wikipedia org w index php title 水塘抽樣 amp oldid 73939091, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。