您的位置:首页 > 其它

流挖掘算法介绍00:序——背景,流数据模型,近似算法评估,2-Universal 哈希

2013-02-14 10:38 369 查看

背景

假如(假如。。。)我是Facebook,Twitter,或者是Weibo的工程师(额,,,);
每天有上亿用户在这个平台上发牢骚,晒经历,秀恩爱,炫富什么的,记得有每天有上亿条消息,

我们就想知道,下面这些问题:

最近一天(小时,分钟)大概有多少个不同的人在发牢骚?
最近一天(小时,分钟)秀恩爱次数排名前10(100,1000)的用户大概有哪些?
假设每个人每天的发推的数量是正态分布,找出发推数异常高的用户?
这些问题在数据量小的时候很容易解决,哈希,或者堆什么的记录一下就行了,最后再扫描一遍。
但是当数据量大到100G左右的时候,一台机器都没法放下这么大的哈希表;而且老大也不想加机器去做这么无聊的功能;更不想用Hadoop工具栈的分布式什么的把系统搞得很庞大,工程师人手也不足(话说两百个不到的工程师要支撑几亿用户也很那个啥)。

总的来说现有算法在大数据上有这些缺点

需要扫多次数据;这就需要把数据库库存到硬盘上,又把它读出来,对大数据凡是遇到硬盘都是比较蛋疼的事情;(因为硬盘不够多,读写速度又慢)
处理的时间没有受限;
内存使用通常为数据量相当,或者是平方;(额,,,问题是这里有100G的数据,当然垂直切割是比较好的方法,不过比较暴力,且又把网络给牵连进来了,对于大数据,网络是第二个比较蛋疼的事情)
且一部分算法并不支持分布式或者是垂直切割的合并结果(例如找到最近1小时发推的不同用户数)

不过我们的要求又是:

只扫一遍数据
希望能实时的处理数据,希望每天处理上亿个推

不要用掉等于数据量的内存,最好是 log n 的内存
最好支持分布式的计算
只需要近似的一个答案

本系列将要介绍的方法,就是用数学上的一些概率算法,在理论上保证一些准确性的情况下来计算。

流数据模型

简单说,就是每次从流中读到一个数据,就再也无法读到这个数据了,

可以在处理每次读到的数据后,在内存中保存一定量的数据,但是不能太多。

近似算法评估

我们是近似算法是A,正确算法是Φ,一个 (ε, δ) 近似算法满足:



直观理解就是A算法偏差超过 ±ε 的概率不超过 δ  。

因为 Φ 可能为0,所以也常常用另外一种方法来评估:



2-Universal 哈希

两个集合X,Y;我们要把X的元素映射到Y中;通常|X| > |Y|,定义 “2-Universal 哈希” 需满足:



大概的理解就是,把空间X,映射到Y,这个hash是完全随机均匀分布的,得到任何的哈希结果都是相同概率。

这里取了两对 (x, y) 是为了说明两次hash事件是独立的;
取量词“任意“是为了说明哈希的结果是随机的;
取1/|Y|^2作为概率是为了说明均匀分布。

这里只是一个数学上严格的概念,用于理论推导冲突的概率等;

为了避免王垠附体,在遇到特例之前我并不去深究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐