日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈流处理算法 (1) – 蓄水池采样

發(fā)布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈流处理算法 (1) – 蓄水池采样 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??淺談流處理算法 (1) – 蓄水池采樣

前言 現(xiàn)如今,“大數(shù)據(jù) ”已經(jīng)不是什么新概念,“一千個人眼中有一千個大數(shù)據(jù)”。社交網(wǎng)絡(luò),智能穿戴設(shè)備,智能家居,傳感器,機器人等每一個熱門的詞匯背后都是大量的數(shù)據(jù)。拋開各種噱頭和概念,相信每個人都能看到數(shù)據(jù)的價值,且能感受到數(shù)據(jù)規(guī)模的爆炸式增長。大規(guī)模的數(shù)據(jù)本身并不產(chǎn)生什么價值,只有通過理解數(shù)據(jù),發(fā)現(xiàn)知識,避免“Garbage In Garbage Out” 才能發(fā)揮數(shù)據(jù)的價值。

在形式多樣的大數(shù)據(jù)問題中,有一類問題輸入以數(shù)據(jù)流的方式提供。我們需要在有限空間內(nèi)通過若干遍訪問數(shù)據(jù)流(很多時候可能僅僅允許訪問一遍)完成數(shù)據(jù)處理并提取有價值的信息。我們稱處理這類問題的算法為“流處理算法”(Streaming Algorithm)

Wikipedia定義: In computer science, streaming algorithms are algorithms for processing data streams in which the input is presented as a sequence of items and can be examined in only a few passes (typically just one). These algorithms have limited memory available to them (much less than the input size) and also limited processing time per item.

一些典型的例子:

  • 根據(jù)用戶訪問日志,統(tǒng)計用戶來源分布?
  • 根據(jù)用戶訪問日志,統(tǒng)計新增用戶數(shù)目?
  • 根據(jù)用戶訪問日志,統(tǒng)計Unique User數(shù)目?
  • 根據(jù)用戶訪問日志,統(tǒng)計某個頁面訪問次數(shù)?
  • ……

這些問題在數(shù)據(jù)規(guī)模并不大且事先確定的情況下,采取直接的統(tǒng)計方案并不難實現(xiàn)。但,在數(shù)據(jù)流場景下,直接的方案并不能滿足實際需求。

數(shù)據(jù)流問題有以下特點:

  • 數(shù)據(jù)規(guī)模大
  • 存儲空間有限。保存完整的數(shù)據(jù)集合并不現(xiàn)實。
  • 分發(fā)速度快。如果處理不及時,沒有足夠資源保存數(shù)據(jù)。
  • 允許數(shù)據(jù)遍歷極少次數(shù),一般僅支持遍歷一次。
  • 空間復雜度sub-linear
  • 時間復雜度linear
  • 可以接受近似解

曾幾何時,拜摩爾定律和硬件技術(shù)所賜,軟件開發(fā)脫離在64k內(nèi)存中扣扣索索的日子,進入沒事開個大數(shù)組的印度模式時代(道聽途說,如有雷同,概不負責)。軟件體量一個比一個嚇人。然而,面對上述特點的數(shù)據(jù)流問題時,我們再一次深刻地體會到日新月異的計算機技術(shù)背后總有一個背景音 - “New Wine In Old Bottles”。

數(shù)據(jù)庫大牛Jim Gray多年前就指示我們:Tape is Dead, Disk is Tape, Flash is Disk, RAM locality is King. TalkingData的Bitmap引擎這不又在扣扣索索了嘛

這個小系列,就是跟大家一起品嘗一下“新酒”, 以酒會友:-)

言歸正傳,針對上述數(shù)據(jù)流問題特點,流處理算法的一般模式有:

  • 采樣/過濾 – 減少規(guī)模
    • 如:蓄水池采樣 Reservoir Sampling
  • 隨機映射(Random Projection) – 降維
    • Hash/SimHash
    • 概要 (Sketch)
  • 統(tǒng)計直方圖(Histogram)
    • 滑動窗口

這些算法模式都是希望通過樣本采樣或者特征采樣,使用有限數(shù)據(jù)保持原整體數(shù)據(jù)的某些特性。

后續(xù)我們計劃聊聊蓄水池采樣, 存在性查詢,基數(shù)估計,頻率估計,頻繁項估計等問題的流處理方法。

蓄水池采樣

蓄水池采樣是一類采樣算法的總稱,廣泛使用在從數(shù)據(jù)流中按一定需求抽樣出部分樣本的場景中。蓄水池,可以看作小段緩存,協(xié)助存儲數(shù)據(jù)流的部分信息。

下面我們從三個具體例子看看什么是蓄水池采樣。

問題1. 年度大獎將從參加年會的同事中隨機選擇,如何維護一個獲獎?wù)呙?#xff0c;不管何時老大宣布獲獎?wù)?#xff0c;所有參會者獲獎概率一致?

假如老大宣布獲獎?wù)邥r,參會同事人數(shù)為N,我們需要保證每個參會者獲獎概率為1/N。

蓄水池采樣算法是這樣的:

  • 記錄第一個到達的同學到獲獎?wù)呙麊紊?(早起的鳥兒有蟲吃 :-) )
  • 當?shù)趇位同學到達年會會場的時候(i>1):
    • 以1/i的概率使用第i位同學替換獲獎?wù)呙麊紊系耐瑢W
    • 以1-1/i的概率保持獲獎?wù)呙麊尾蛔?(Yeah!守擂成功!)

看起來很簡單,我們來看看是否能滿足問題的需求

  • 第一個同學P_1到達時,獲獎?wù)弑囟ㄊ荘_1。(獲獎概率?1?1?= 100%,滿足)
  • 第二個同學P_2到達時,1/2概率獲獎?wù)咛鎿Q為P_2, 也1/2概率保持為P_1 (滿足)
  • 當?shù)趇位同學到達時,1/i的概率獲獎?wù)咛鎿Q為P_i。而的1-1/i概率保持獲獎?wù)卟蛔?#xff0c;也就是P_1, P2, …, P(i-1)獲獎的概率為 1/(i-1) * (1-1/i) = 1/i (滿足)

綜上所述,根據(jù)歸納法,蓄水池采樣搞掂了。

問題2. 項目進展很好,老大很高興,決定年度大獎有k名,如何維護一個k個獲獎?wù)呙麊?#xff0c;保證不管何時老大宣布獲獎?wù)?#xff0c;所有參會者獲獎概率一致?

假如老大宣布獲獎?wù)邥r,參會同事人數(shù)為N,我們需要保證每個參會者獲獎概率為k/N。

蓄水池采樣算法是這樣的: + 記錄前k位到達的同學到獲獎?wù)呙麊紊?(早起總沒錯的) + 當?shù)趇位同學到達年會會場的時候(i>k): - 以k/i的概率使用第i位同學替換獲獎?wù)呙麊紊系碾S機一位同學(某位同學杯具了) - 以1-k/i的概率保持獲獎?wù)呙麊尾蛔?(集體守擂成功!)

看起來跟上一個問題差不多,應該是正確的吧

  • 前k位同學到達時,獲獎?wù)弑囟ㄊ荘_1, P_2, …, P_k。(獲獎概率 k/k = 100%,滿足)
  • 當?shù)趇位同學到達時( i > k)
    • [Condition 1] k/i概率獲獎?wù)咛鎿Q為P_i (滿足)
    • [Condition 2] 1 - k/i的概率保持獲獎?wù)呙麊尾蛔?/li>
    • 對于P_x (x < i), 在第i位同學尚未到達時獲獎概率為k/(i-1)。她能保留在獲獎名單中的概率由兩部分組成 k/(i-1) * [k/i * (1 - 1/k) + 1 - k/i] = k/i(滿足)
      • [Condition 1]沒有被P_i踢掉 k/i * (1 - 1/k)
      • [Condition 2]P_i直接出局了1 - k/i

綜上所述,根據(jù)歸納法,蓄水池采樣又搞掂了。

問題3.為了激勵績效好的同學,每個參會同學都有一個權(quán)重,如何維護一個k個獲獎?wù)呙麊?#xff0c;保證不管何時老大宣布獲獎?wù)?#xff0c;所有參會者獲獎概率與權(quán)重成比例?

假如老大宣布獲獎?wù)邥r,參會同事人數(shù)為N,我們需要保證參會者(P, 績效權(quán)重W)獲獎概率為W_i/(W_1 + W_2 + … + W_N)。

蓄水池采樣算法是這樣的:

  • 記錄前k位到達的同學到獲獎?wù)呙麊紊?(嗯,早起永遠沒錯的)
    • 每位同學的分值S_i = random(0, 1) ^ (1/W_i)
  • 當?shù)趇位同學到達年會會場的時候(i>k):
    • 計算第位同學的分值 S_i = random(0, 1) ^ (1/W_i)
    • 如果獲獎?wù)呙麊沃蟹种底钚〉耐瑢WP_x的分值S_x比S_i小,P_x被S_i替換了
    • 否則,獲獎?wù)呙麊尾蛔?(集體守擂成功!)

怎么證明這樣可以滿足要求呢?額,“這里空白太小,我寫不下了” (自己看論文去吧)

年會一年也就一次,很快來了又走了。各種各樣的數(shù)據(jù)流每天都在產(chǎn)生,這些蓄水池采樣方法可以幫忙我們獲得數(shù)據(jù)流的一個樣本。對于小規(guī)模樣本可以保持大規(guī)模數(shù)據(jù)信息的場景,蓄水池采樣幫忙我們把“大數(shù)據(jù)”的“大”給去掉了。

參考文獻

  • https://en.wikipedia.org/wiki/Streaming_algorithm
  • https://en.wikipedia.org/wiki/Reservoir_sampling
  • Vitter, Jeffrey S. (1 March 1985). “Random sampling with a reservoir”
  • Efraimidis, Pavlos S.; Spirakis, Paul G. (2006-03-16). “Weighted random sampling with a reservoir”
  • 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的浅谈流处理算法 (1) – 蓄水池采样的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。