《Mining of Massive Datasets》 第四章(Mining Data Streams )知識點提要
本章 pdf 下載鏈接:http://infolab.stanford.edu/~ullman/mmds/ch4.pdf
本書資料鏈接:http://mmds.org
前言
- 流數據處理的若干限制
- 數據以一個或多個流的方式到來,流元素分發速度快,必須對數據及時處理
- 通常來說數據量十分大,無法存儲整個數據流
- 流處理算法通常在內存中執行,一般不會或者極少訪問二級存儲器
- 數據流處理的每個算法都在某個程度上包含流的匯總過程
- 核心問題:How to make critical calculations about the stream using a limited amount of memory?
- 流處理算法的原則:通常情況下,獲得問題的近似解比精確解要高效得多。
1. 流處理模型
1.1 數據流管理系統
-
類比數據庫管理系統,流處理器實際上也可以看成是一個數據管理系統
數據流管理系統
若干個流進入系統,每個流的數據流、數據類型不必相同,流元素到達速率不受系統控制,對流數據,不及時處理會永久丟失。
- 歸檔存儲器容量大,速度慢,通常進行歸檔處理,無法滿足快速應答查詢,但是同樣不能存儲整個數據流
- 有限工作存儲器容量小,速度快,可存儲部分流數據,用于快速應答查詢
- ad-hoc 查詢:用戶根據自己的需求,靈活的選擇查詢條件,系統能夠根據用戶的選擇生成相應的統計報表,用戶無需對 SQL 和數據庫架構有了解
1.2 流查詢
流查詢主要有兩種方式:固定查詢(standing query)和 ad hoc 查詢。
固定查詢
固定查詢永遠不變地執行并在適當的時候產生輸出結果,如查詢傳感器的最高溫。
ad hoc 查詢
- 通過存儲數據流的合適部分或者流概要信息來為查詢的應答做準備
- 可以在工作存儲器上保存每個流的滑動窗口,將窗口看成是關系數據庫而在其上執行任意的 SQL 查詢
2. 數據抽樣
2.1 固定比例抽樣
樣本的規模會隨著流的增長而增長
假定搜索引擎收到查詢流,流由三元組(user,query,time)組成
Question:在過去一個月用戶所提交的重復查詢的比率是多少?假設只能存儲 1/10 的流元素
顯然的做法是對每個查詢產生一個 0~9 的隨機數,當且僅當隨機數為0時才存儲該元組。大數定律會保證大部分用戶所存儲的查詢比例接近 1/10。
但是,如果問題變成求用戶提交的平均重復查詢數目,上述抽樣機制會帶來錯誤。
- 假設某用戶有 x 個搜索查詢提交了一次, d 個搜索查詢提交了兩次,不存在超過 2 次的其他查詢。
- 顯然該問題的正確答案時:d/(x+d)
但是,如果采用上述 1/10 的抽樣機制,得到的結果會是 d/( 10x+19d )
- 對于原本 d 個提交 2 次的搜索查詢,只有 d/100 會在樣本中再重復 2 次(1/10 * 1/10 * d)
而原本 d 個提交 2 次的搜索查詢樣本中只出現一次的概率是:1/10 * 9/10 + 9/10 * 1/10 = 18/100
因此,平均重復查詢數目:
代表性樣本采樣
- 挑選1/10 的用戶并將他們所有的搜索查詢放入樣本中,不考慮其他用戶的搜索查詢
- 使用哈希函數將用戶名或用戶 ID 哈希到桶中,提取一個桶的用戶。
- 更一般的,若想得到 a/b 比例的用戶,可以哈希到 b 個桶中,提取前 a 個桶。
選擇哪些用戶作為代表性用戶至關重要
樣本規模的變化
- 哈希函數 h,元組鍵值 K,閾值 t
- 樣本由滿足 h(K) <= t 的元組組成
- 調整樣本空間大小:降低閾值 t 為 t-1,刪除樣本空間中 h(K) = t 的元組
2.2 固定窗口大小抽樣
樣本空間大小固定,不會隨著流規模的擴大而增長
- 樣本空間 S,能容納 s 個樣本
- 任何時候都盡可能保持足夠多的元組,并且樣本空間已滿時,隨著流增長會丟棄某些元組,丟棄元組會被新元組取代。
- 保證任何時候選擇選擇某一任意位置的概率和選擇其他位置的概率相等。可用歸納法證明,n 個元素時概率是 s/n,第 n+1 個元素到達時是 s/n+1。
3. 流過濾
即只接受流中滿足某個準則的元組集合。
布隆過濾器
一個布隆過濾器由以下幾部分組成
- n 個位組成的數組(視為 n 個桶),每個位的初始值為0。
- 一系列哈希函數 h1,h2 ... hk。每個哈希函數將流元組鍵值映射到上述 n 個桶中。
- m 個鍵值組成的集合 S(樣本準則)。
- 對于流中的元組,若鍵值在集合 S 中,則通過過濾器。
- 對于集合 S 中所有鍵值,利用每個哈希函數進行處理,將在數組的對應位置為1。
- 當鍵值K的流元素到達時,檢查所有的哈希函數h對應為是否為1,如果是則允許通過。
假陽率
所有真正的負例當中被判為正例的比例,即本來不能通過的流元素卻通過過濾的比例
使用飛鏢投擲模型來模擬布隆過濾。假設 y 支飛鏢和 x 個靶位,預計給定靶位至少被投中一次的概率。
- 給定飛鏢不能投中給定靶位概率 (x-1)/x
- y 支飛鏢全部沒有命中給定靶位的概率 [(x-1)/x]^y,即
- 根據重要極限公式
y 支飛鏢全部沒有命中給定靶位的概率為 e^(-y/x),故假陽率位 1- e^(-y/x)
故對于有 k 個哈希函數的布隆過濾器,假陽率為
4. 流中獨立元素的數目統計
使用若干不同的哈希算法和隨機算法,在每個流空間開銷較小的情況下得到近似結果
FM(Flajolet-Martin)算法
- 基本思想:如果流中看到的不同元素越多,那么不同的哈希值也會越多,同時,也越可能看到其中一個值變得“異常”。具體的異常性質是該值后多個0結束。
- 任何流元素 a 應用哈希函數 h 時,位串 h(a) 的尾部將以 0 結束(可能沒有),尾部 0 的數目稱為尾長,流中所有元素的最大尾長為 R。
- 用 2^R 來估計目前為止流中獨立元素數目。
流元素 a 的哈希值 h(a) 末尾至少有 r 個 0 的概率為 2^(-r)。
假定流中有 m 個獨立元素,那么任何元素的哈希值末尾不滿足至少有 r 個 0 的概率為
即
可改寫為
- 結論
- 如果 m 遠大于 2^r,那么發現一個尾長長度至少為 r 的概率接近1;
- 如果 m 遠小于 2^r,那么發現一個尾長長度至少為 r 的概率接近0。
組合估計
- 平均值
假定在每個哈希函數上得到不同的 2^R,然后求平均值
- 會受到偶然極大值得影響,即某個哈希函數得到的 2^R 過大。( 2^R 是以指數成倍增長的)
- 中位數
取每個哈希函數得到不同的 2^R 的中位數。
- 得到的值永遠都是 2 的冪,不可能得到非常近似的估值
- 平均值和中位數組合
先將哈希函數分成若干組,組內取平均值,組外取中位數
或
將哈希函數分成若干組,組內取中位數,組外取平均值
5. 矩估計
流的 k 階矩:流中至少出現一次的元素出現次數的 k 次方之和
- 0 階矩表示流中獨立元素個數
- 1 階矩表示整個流的長度,也就是元素個數
- 2 階矩度量流中元素分布的非均勻性。越小越均勻。