HyperLogLog介绍
给定一批设备id集,通过一定流程提取这批id集的特征,用很少的一批数字表示(提前存下来),把这批数字带入特定公式,即可快速预估出这批id集的数量(存在较小误差)。可用在用户画像项目中的标签圈选人群数量预估上(支持多标签交集并集预估,速度1s以下。由于各个标签组合取值枚举海量,不可能提前求出所有情况的数量。RoaringBitmap计算速度在5s左右,用户体验差)。
此算法流程简单,但理论证明复杂,如无必要,可只关注流程。
HyperLogLog流程
原理1
01010101... // 最左侧1的位置是2
10111000... // 最左侧1的位置是1
00001000... // 最左侧1的位置是5
……
上面n个数,假定最左侧1的位置的最大值是10,那么n值接近2^10,
为了提高预估准确率,乘一个调整参数α,即最终预估n=α*(2^10)
原理2
// 思想
原理2对原理1改进,利用分组实验求平均值的思想,减少误差
// 流程
n个数分成m组(m=2^bits,bits由程序员指定),第j组最左侧1位置的最大值记为M[j],
那么预估n=α*m*(各组预估值即2^M[j]的调和平均值),α取值跟bits有关(理论证明给出对应固定值)
// 例子
假定bits=3,则用高3位数值+1为组号,分成2^3个组,剩余的位求最左侧1位置
010 10101... // 组号为2+1,最左侧1的位置是1
101 11000... // 组号为5+1,最左侧1的位置是1
000 01000... // 组号为0+1,最左侧1的位置是2
……
HyperLogLog算法核心存储类HLL存储的就是M数组
原理3
HLL并集交集差集预估
// 并集
数据集A的HLL存储M1,数据集B的HLL存储M2,AUB的HLL存储的M求法是M[i]=max{M1[i], M2[i]}
// 交集
|A∩B| = |A| + |B| - |AUB|
// 差集
A - B = A - A ∩ B
Reference
[1] HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm