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

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

前言 现如今,“大数据 ”已经不是什么新概念,“一千个人眼中有一千个大数据”。社交网络,智能穿戴设备,智能家居,传感器,机器人等每一个热门的词汇背后都是大量的数据。抛开各种噱头和概念,相信每个人都能看到数据的价值,且能感受到数据规模的爆炸式增长。大规模的数据本身并不产生什么价值,只有通过理解数据,发现知识,避免“Garbage In Garbage Out” 才能发挥数据的价值。

在形式多样的大数据问题中,有一类问题输入以数据流的方式提供。我们需要在有限空间内通过若干遍访问数据流(很多时候可能仅仅允许访问一遍)完成数据处理并提取有价值的信息。我们称处理这类问题的算法为“流处理算法”(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.

一些典型的例子:

  • 根据用户访问日志,统计用户来源分布?
  • 根据用户访问日志,统计新增用户数目?
  • 根据用户访问日志,统计Unique User数目?
  • 根据用户访问日志,统计某个页面访问次数?
  • ……

这些问题在数据规模并不大且事先确定的情况下,采取直接的统计方案并不难实现。但,在数据流场景下,直接的方案并不能满足实际需求。

数据流问题有以下特点:

  • 数据规模大
  • 存储空间有限。保存完整的数据集合并不现实。
  • 分发速度快。如果处理不及时,没有足够资源保存数据。
  • 允许数据遍历极少次数,一般仅支持遍历一次。
  • 空间复杂度sub-linear
  • 时间复杂度linear
  • 可以接受近似解

曾几何时,拜摩尔定律和硬件技术所赐,软件开发脱离在64k内存中扣扣索索的日子,进入没事开个大数组的印度模式时代(道听途说,如有雷同,概不负责)。软件体量一个比一个吓人。然而,面对上述特点的数据流问题时,我们再一次深刻地体会到日新月异的计算机技术背后总有一个背景音 - “New Wine In Old Bottles”。

数据库大牛Jim Gray多年前就指示我们:Tape is Dead, Disk is Tape, Flash is Disk, RAM locality is King. TalkingData的Bitmap引擎这不又在扣扣索索了嘛

这个小系列,就是跟大家一起品尝一下“新酒”, 以酒会友:-)

言归正传,针对上述数据流问题特点,流处理算法的一般模式有:

  • 采样/过滤 – 减少规模
    • 如:蓄水池采样 Reservoir Sampling
  • 随机映射(Random Projection) – 降维
    • Hash/SimHash
    • 概要 (Sketch)
  • 统计直方图(Histogram)
    • 滑动窗口

这些算法模式都是希望通过样本采样或者特征采样,使用有限数据保持原整体数据的某些特性。

后续我们计划聊聊蓄水池采样, 存在性查询,基数估计,频率估计,频繁项估计等问题的流处理方法。

蓄水池采样

蓄水池采样是一类采样算法的总称,广泛使用在从数据流中按一定需求抽样出部分样本的场景中。蓄水池,可以看作小段缓存,协助存储数据流的部分信息。

下面我们从三个具体例子看看什么是蓄水池采样。

问题1. 年度大奖将从参加年会的同事中随机选择,如何维护一个获奖者名字,不管何时老大宣布获奖者,所有参会者获奖概率一致?

假如老大宣布获奖者时,参会同事人数为N,我们需要保证每个参会者获奖概率为1/N。

蓄水池采样算法是这样的:

  • 记录第一个到达的同学到获奖者名单上 (早起的鸟儿有虫吃 :-) )
  • 当第i位同学到达年会会场的时候(i>1):
    • 以1/i的概率使用第i位同学替换获奖者名单上的同学
    • 以1-1/i的概率保持获奖者名单不变 (Yeah!守擂成功!)

看起来很简单,我们来看看是否能满足问题的需求

  • 第一个同学P_1到达时,获奖者必定是P_1。(获奖概率 1⁄1 = 100%,满足)
  • 第二个同学P_2到达时,1/2概率获奖者替换为P_2, 也1/2概率保持为P_1 (满足)
  • 当第i位同学到达时,1/i的概率获奖者替换为P_i。而的1-1/i概率保持获奖者不变,也就是P_1, P2, …, P(i-1)获奖的概率为 1/(i-1) * (1-1/i) = 1/i (满足)

综上所述,根据归纳法,蓄水池采样搞掂了。

问题2. 项目进展很好,老大很高兴,决定年度大奖有k名,如何维护一个k个获奖者名单,保证不管何时老大宣布获奖者,所有参会者获奖概率一致?

假如老大宣布获奖者时,参会同事人数为N,我们需要保证每个参会者获奖概率为k/N。

蓄水池采样算法是这样的: + 记录前k位到达的同学到获奖者名单上 (早起总没错的) + 当第i位同学到达年会会场的时候(i>k): - 以k/i的概率使用第i位同学替换获奖者名单上的随机一位同学(某位同学杯具了) - 以1-k/i的概率保持获奖者名单不变 (集体守擂成功!)

看起来跟上一个问题差不多,应该是正确的吧

  • 前k位同学到达时,获奖者必定是P_1, P_2, …, P_k。(获奖概率 k/k = 100%,满足)
  • 当第i位同学到达时( i > k)
    • [Condition 1] k/i概率获奖者替换为P_i (满足)
    • [Condition 2] 1 - k/i的概率保持获奖者名单不变
    • 对于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

综上所述,根据归纳法,蓄水池采样又搞掂了。

问题3.为了激励绩效好的同学,每个参会同学都有一个权重,如何维护一个k个获奖者名单,保证不管何时老大宣布获奖者,所有参会者获奖概率与权重成比例?

假如老大宣布获奖者时,参会同事人数为N,我们需要保证参会者(P, 绩效权重W)获奖概率为W_i/(W_1 + W_2 + … + W_N)。

蓄水池采样算法是这样的:

  • 记录前k位到达的同学到获奖者名单上 (嗯,早起永远没错的)
    • 每位同学的分值S_i = random(0, 1) ^ (1/W_i)
  • 当第i位同学到达年会会场的时候(i>k):
    • 计算第位同学的分值 S_i = random(0, 1) ^ (1/W_i)
    • 如果获奖者名单中分值最小的同学P_x的分值S_x比S_i小,P_x被S_i替换了
    • 否则,获奖者名单不变 (集体守擂成功!)

怎么证明这样可以满足要求呢?额,“这里空白太小,我写不下了” (自己看论文去吧)

年会一年也就一次,很快来了又走了。各种各样的数据流每天都在产生,这些蓄水池采样方法可以帮忙我们获得数据流的一个样本。对于小规模样本可以保持大规模数据信息的场景,蓄水池采样帮忙我们把“大数据”的“大”给去掉了。

参考文献

  1. https://en.wikipedia.org/wiki/Streaming_algorithm
  2. https://en.wikipedia.org/wiki/Reservoir_sampling
  3. Vitter, Jeffrey S. (1 March 1985). “Random sampling with a reservoir”
  4. Efraimidis, Pavlos S.; Spirakis, Paul G. (2006-03-16). “Weighted random sampling with a reservoir”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018蓝桥杯省赛---java---B---7(螺旋折线)

题目描述 标题&#xff1a;螺旋折线如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y)&#xff0c;我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y)&#xff0c;你能计算出dis…

微软的.NET Core开始支持Raspberry Pi 3

微软的 .NET Core 正在向 Raspberry Pi 3 发展&#xff0c;并且适用于 ARM 设备的官方 .NET 2.0 核心将于今年晚些时候发布。微软最近开放了 .NET 核心的编程框架&#xff0c;目前的 ARM32 版本&#xff0c;在 Github 上可用&#xff0c;是多方合作的产物。 一位微软发言人告诉…

轩辕剑之天之痕1-5java_轩辕剑游戏 轩辕剑1到5全系列下载

第 5 页 轩辕剑3外传&#xff1a;天之痕【轩辕剑3外传&#xff1a;天之痕(2000)】本作可以说是轩辕剑最有名气的作品&#xff01;&#xff01;&#xff01;没错&#xff0c;一直以来轩辕剑名声最响亮的一部作品就是《天之痕》&#xff0c;到现在电视剧也终于拍出来了&#xff0…

独占锁、共享锁、更新锁,乐观锁、悲观锁

转载自 独占锁、共享锁、更新锁&#xff0c;乐观锁、悲观锁 1、锁的两种分类方式 &#xff08;1&#xff09;从数据库系统的角度来看&#xff0c;锁分为以下三种类型&#xff1a; 独占锁&#xff08;Exclusive Lock&#xff09; 独占锁锁定的资源只允许进行锁定操作的…

2019蓝桥杯省赛---java---B---2(不同子串)

题目描述 思路分析 看到不同&#xff0c;想到set去重 截取想到String.substring() 代码实现 package com.atguigu.TEST;import java.util.HashSet; import java.util.Set;class Main{public static void main(String[] args) {String target"0100110001010001";Se…

ASP.NET Core 程序发布到Linux(Centos7)爬坑实战

前言 前阶段弄了个Linux系统想倒腾倒腾.NET Core,结果看了下网上的资料&#xff0c;大部分都是过期的&#xff0c;走了不少弯路&#xff0c;不过还好&#xff0c;今下午总算捣鼓出来了。Linux命令太多了&#xff0c;唉。血的教训&#xff1a;安装一定要看官网的流程。 开始 首先…

关于Unsafe类的一点研究

转载自 关于Unsafe类的一点研究 Unsafe类是java中非常特别的一个类。它名字就叫做“不安全”&#xff0c;提供的操作可以直接读写内存、获得地址偏移值、锁定或释放线程。 通过正常途径是无法获得Unsafe实例的&#xff0c;首先它的构造方法是私有的&#xff0c;然后&#xf…

2019蓝桥杯省赛---java---B---3(数列求值)

题目描述 思路分析 此题类似于斐波那契数列&#xff0c;但是所求20190324项的最后四位数字&#xff0c;要是单纯按照斐波那契数列的思想求下去&#xff0c; 别说long类型&#xff0c;BigInteger类型都存不了这么大的数&#xff0c;然后我们发现&#xff0c;所求20190324项的最…

Visual Studio 2017 ASP.NET Core开发

Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core 功能安装以后就可以进行ASP.NET Core开发。 新的ASP.NET Core项目为csproj &#xff0c;打开之前的xproj项目&#xff0c;会提示单向升级&#xff0c;确认以后&#x…

2019蓝桥杯省赛---java---B---4(数的分解)

题目描述 思路分析 方案一&#xff1a;不定顺序&#xff1a;要除以6. 方案二&#xff1a;人为规定&#xff1a;a < b < c 代码实现 方案一 package com.atguigu.TEST;class Main{public static void main(String[] args) {int sum0;for (int i 1; i <1999; i) {f…

最通俗易懂的乐观锁与悲观锁原理及实现

转载自 最通俗易懂的乐观锁与悲观锁原理及实现 一、乐观锁 总是认为不会产生并发问题&#xff0c;每次去取数据的时候总认为不会有其他线程对数据进行修改&#xff0c;因此不会上锁&#xff0c;但是在更新时会判断其他线程在这之前有没有对数据进行修改&#xff0c;一般会使用…

mysql update field_mysql-更新表与另一个选择,但字段是SUM(someField)

基本上我有这样的事情&#xff1a;UPDATETableSETTable.col1 other_table.col1,FROMTableINNER JOINother_tableONTable.id other_table.id问题是我想用如下选择来更新col1&#xff1a;SELECT SUM(col1) FROM other_table WHERE Table.id other_table.id AND period > 20…

分布式一致性算法:Raft 算法

由于微信字数的限制&#xff0c;此处给出的并非全文&#xff0c;请拉到页面最下方点击阅读原文查看完整版。 Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法&#xff0c;而且 raft 算法比 Paxos 算法更易懂且更容易实现。本文对 raft 论文进行翻译&#xff0c;希望能有…

聚集索引、辅助索引、覆盖索引、联合索引

转载自 聚集索引、辅助索引、覆盖索引、联合索引 聚集索引&#xff08;Clustered Index&#xff09; 聚集索引就是按照每张表的主键构造一棵B树&#xff0c;同时叶子节点中存放的即为整张表的行记录数据。 举个例子&#xff0c;直观感受下聚集索引。 创建表t&#xff0c;…

2019蓝桥杯省赛---java---B---6(特别数的和)

题目描述 时间限制: 1.0s 内存限制: 512.0MB 本题总分&#xff1a;15 分【问题描述】小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他…

java谓词_在Java中谓词

我假设你正在谈论来自Guava的com.google.common.base.Predicate 。从API&#xff1a;确定给定input的true值或false值。 例如&#xff0c;一个RegexPredicate可能实现了Predicate &#xff0c;并且对任何匹配给定正则expression式的string返回true。这本质上是一个booleantesti…

.NET Core项目部署到linux(Centos7)

1.开篇说明 a 上篇博客简单的说明了一下 使用.NET Core开发的一个总结&#xff08;.NET Core跨平台&#xff1a;使用.NET Core开发一个初心源商城总括)&#xff0c;那么这篇博客我们就在上一篇博客的基础上对其代码进行部署&#xff0c;将其部署在Linux Centos7下。 b 这周周二…

2020蓝桥杯省赛---java---B---1(指数计算)

题目描述 代码实现 解法一 计算器 解法二 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int a1,b1921,c7;for (int i 0; i < 2020; i) {aa*7;if(a>1…

java安装显示更改_java 安装与配置

到java.sun.com下载自解压安装包jdk-1_5_0_06-nb-4_1-linux-ml.bin安装&#xff1a;[rootRHEL4 JDK-1.5.0.06]# chmod x jdk-1_5_0_06-nb-4_1-linux-ml.bin[rootRHEL4 JDK-1.5.0.06]# ./jdk-1_5_0_06-nb-4_1-linux-ml.bin选择安装位置&#xff0c;NetBeans安装目录&#xff1a;…

dayjs​​​​​​​文档

转载自 dayjs API Dayjs 并没有改变或覆盖 Javascript 原生的 Date.prototype&#xff0c; 而是创造了一个全新的包含 Javascript Date 对象的 Dayjs的对象。 Dayjs 对象是不可变的, 所有的 API 操作都将返回一个新的 Dayjs 对象。 解析 当前时间时间字符串Unix 时间戳 (…