HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm
HyperLogLog参考下面这篇blog,
http://blog.codinglabs.org/articles/algorithms-for-cardinality-estimation-part-iv.html
为何LLC在基数不大的时候会误差比较大?
直观上,由于基数不大时,会有很多空桶,而最终结果是求平均值,这个值对离群值(这里的0)非常敏感
那么重理论上看,为何误差比较大?
LLC的渐近标准误差为 ,看上去只是和桶数m有关,为何还和基数大小有关?
关键就是理解渐近标准误差,
标准误差,(个人理解)
对于估计,真实值和预测值之间一定有误差的,这种误差往往符合高斯分布(根据中心极限定理)
而高斯分布的参数 ,就是表示标准误差,因为这个参数表示高斯分布的宽窄,所以
越小,表示高斯分布越收拢,即越多的预测值会更接近均值
所以标准误差是可以用来衡量模型预测质量好坏的,所以如果LLC的标准误差为,那么该算法的误差只和桶数m相关
但是这里“渐近”两个字,表示只有当基数n趋向于无穷大,标准差才趋向于
这就解释了前面的问题
所以解决这个问题两个改进算法,
Adaptive Counting,简单的想法,在n比较小的时候使用linear counting,n比较大的时候用LLC
HyperLogLog Counting,比较复杂的方法,参考“HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm”
基本的改进是使用调和平均数替代几何平均数,以减少对离群值的敏感性
---------------------------------------------------------------------------------------------------------------------------------------------------------------
传统的cardinality统计的方法过于耗费内存, 所以有很多近似的方法以比较低的资源耗费来解决这个问题
在Goolge,每天都会有如下数据分析系统需要对非常大的数据集做cardinality估计,所以google对HyperLogLog做了一系列的improvement。
At Google, various data analysis systems such as Sawzall [15], Dremel [13] and PowerDrill [9] estimate the cardinality of very large data sets every day, for example to determine the number of distinct search queries on google.com over a time period.
Google做了一系列的实验对比,从准确率上来看,Linear counting是最好的,所以当数据量不大的时候首选
但是当基数的取值很大的时候,空间效率上看是有问题的,所以还是选择准确率稍差的HLLC
算法设计的Goal是,
Therefore, the key requirements for a cardinality estimation algorithm can be summarized as follows:
• Accuracy.
For a fixed amount of memory, the algorithm should provide as accurate an estimate as possible. Especially for small cardinalities, the results
should be near exact.
• Memory efficiency.
The algorithm should use the available memory efficiently and adapt its memory usage to the cardinality. That is, the algorithm should use less
than the user-specified maximum amount of memory if the cardinality to be estimated is very small.
• Estimate large cardinalities.
Multisets with cardinalities well beyond 1 billion occur on a daily basis, and it is important that such large cardinalities can be estimated with reasonable accuracy.
• Practicality.
The algorithm should be implementable and maintainable.
HLLC算法
相对于LLC的n的公式,
HLLC前面的步骤都是一样,只是最后的计算公式,用调和平均数
,其中
并且在实现的时候做了如下的优化,主要是指n很小和很大时,做些特殊化处理
1. Initialization of registers.
The registers are initialized to 0 instead of to avoid the result 0 for n << mlogm where n is the cardinality of the data stream (i.e., the value we are trying to estimate).
2. Small range correction.
Simulations by Flajolet et. al. show that for nonlinear distortions appear that need to be corrected.
Thus, for this range LinearCounting [16] is used.
3. Large range corrections.
When n starts to approach , hash collisions become more and more likely (due to the 32 bit hash function). To account for this, a correction is used.
Google对HLLC的提高
1. Using a 64 Bit Hash Function
这个很容易理解,google需要处理的cardinalities beyond 1 billion,所以原来的32bit不够
2.Estimating Small Cardinalities
对于很小的cardinalities,之前的处理是,当就使用Linear counting
这里提出一种bias-corrected的方法,文章中实验如下,
Our experiments show that at the latest for n > 5m the correction does no longer reduce the error significantly.
所以在n> 5m的时候,直接用HLLC就ok
但是当n<5m时,文章中试图用他们的实验数据去把bias修正掉
再次测试结果是,尽管这样,在n很小的情况下,仍然是Linear counting的效果比较好
所以最终的逻辑是
当n<5m时,会优先使用bias-corrected的方法, 只有当出现空桶,即n很小的情况下,才使用linear counting
3.Sparse Representation
这组优化关键就是更加节省空间,其实HLLC对空间的耗费本身就不高,但是由于google的基数实在太大导致桶数也非常大, 所以再小的值乘上个超大的基数也扛不住
优化都比较简单,
1. 当n<<m,情况下,即有很多空桶,那不用记录每个桶的情况,只需要记录有数据的桶,就是稀疏表示,
2. 在稀疏表示的情况下,可以使用更多位数来表示 ,以达到更高的precision
3. 进一步压缩稀疏表示
4. 在linear counting的情况下,其实不需要记录
最终HLLC和google的HLLC++的数据对比
HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm的更多相关文章
- Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- 翻新并行程序设计的认知整理版(state of the art parallel)
近几年,业内对并行和并发积累了丰富的经验.有了较深刻的理解.但之前积累的大量教材,在当今的软硬件体系下.反而都成了负面教材.所以,有必要加强宣传,翻新大家的认知. 首先.天地倒悬,结论先行:当你须要并 ...
- 大数据下的Distinct Count(一):序
在数据库中,常常会有Distinct Count的操作,比如,查看每一选修课程的人数: select course, count(distinct sid) from stu_table group ...
- 资源list:Github上关于大数据的开源项目、论文等合集
Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...
- Awesome Big Data List
https://github.com/onurakpolat/awesome-bigdata A curated list of awesome big data frameworks, resour ...
- Redis数据结构之HperLogLog
一.HyperLogLog HyperLogLog是用来做基数统计的. 其可以非常省内存的去统计各种计数,比如注册ip数.每日访问IP数.页面实时UV(PV肯定字符串就搞定了).在线用户数等在对准确性 ...
- 【原创】大叔算法分享(4)Cardinality Estimate 基数计数概率算法
读过<编程珠玑>(<Programming Pearls>)的人应该还对开篇的Case记忆犹新,大概的场景是: 作者的一位在电话公司工作的朋友想要统计一段时间内不同的电话号码的 ...
- HyperLogLog
数据量一大,连统计基数也成了一个麻烦事.在使用kylin的时候,遇到对度量值进行基数统计,使用的是Hyperloglog算法,占用内存小,误差小,实乃不错的方法,但查阅网上的资料与内容,感觉未能理解的 ...
- Reids(4)——神奇的HyperLoglog解决统计问题
一.HyperLogLog 简介 HyperLogLog 是最早由 Flajolet 及其同事在 2007 年提出的一种 估算基数的近似最优算法.但跟原版论文不同的是,好像很多书包括 Redis 作者 ...
随机推荐
- c++ 转化
atof(将字符串转换成浮点型数)相关函数atoi,atol,strtod,strtol,strtoul表头文件#include定义函数double atof(const char *nptr);函数 ...
- 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力
可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...
- 设置MySQL的字符编码
前言 这里我已经将MySQL的数据库编码设置为UTF-8,所以下面现实的都是UTF-8. 设置MySQL数据库的编码方式有三种,分别是基于session会话的.基于全局gloable的.永久性改变的. ...
- C++预处理和头文件保护符
一预处理 1.常见的预处理功能 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译.布局控制和宏替换4种.文件包含:#include 是一种最为常 ...
- vuejs开发环境搭建
前言:现在前端最火的是3个框架:react,vue,angular.可以说着是哪个框架大大改变了前端的地位.相对于angular来说.vue同样拥有丰富的指令,并且都是典型的MVC框架,但是vue比较 ...
- php学习一:语法规则
1.书写规则 在html中嵌入php的时候,需要有结束语,即<?php ...?>,在靠近结束符号的最后一个语句可以不用写分号: 但是在单独的php中,最后可以不用以?>来结尾; 2 ...
- iPhone较为基础的代码片段
Iphone代码片段导航 1.给UITableViewController添加ToolBar. self.navigationController.toolbarHidden = NO; //默认是隐 ...
- Mybatis返回map集合
<resultMap id="pieMap" type="HashMap"> <result property="value&quo ...
- poj_3321 线段树/树状数组
题目大意 一个果树(每个节点的分叉数目不固定)上有N个分叉点(包括最末的叶节点),则有N-1条边,将分叉点进行从1到N编号,每个分叉点上均可以结水果.开始的时候,每个分叉点都有一个水果,之后进行一系列 ...
- linux 下配置vncserver
vncserver是使用非常方便和广泛的远程桌面服务,配置也相对简单. 下面记录了在centos系统上进行配置vncserver的过程. 安装 查看centos下是否已经安装了vncserver rp ...