HyperLogLog概率统计

HyperLogLog概率统计

在这里插入图片描述
由于使用了概率统计,我们必须首先谈谈收益。我们都喜欢丰厚的回报。

先来看一下比较高级的 bitmap。

bitmap 通过位数据存储特定数据的数据结构。每个位的位置可以独立地包含信息,位数据的最小存储单元,因此可以节省很多空间,并且整个位数据也可以加载到内存计算中。

比如:
在这里插入图片描述
在这里插入图片描述

每一位使用0或1表示是否包含它。

多个统计结果可以轻松合并,只需要对多个结果进行XOR,也可以大大减少存储空间。

即使这样,内存使用率仍然很高,有些我们必须计算10亿条数据。1000000000/8/1024/1024 ≈ 120 M ,如果有1,000个对象,则最多需要 120 000 M money(内存)。

接下来我们看一下 HyperLogLog

由于它是通过简单的抛硬币实验指导的,因此我们首先来看一下抛硬币的过程。

第一次抛硬币,抛了1次,就出现正面。

k 1 \mathop {k}_{1} k1=1,n=1
第一次伯努利过程。

第二次抛硬币,抛了3次,就出现正面。

k 2 \mathop {k}_{2} k2=3,n=2
第二次伯努利过程。

第三次抛硬币,抛了6次,就出现正面。

k 3 \mathop {k}_{3} k3=6,n=3
第三次伯努利过程。

第n次抛硬币,抛了12次,就出现正面。

k n \mathop {k}_{n} kn=12
第n次伯努利过程。
我们可以估计 n=2^12

可以发现此时的误差很大,下面让我们减少误差。

以下是摘自 HyperLogLog: the analysis of a near-optimal
cardinality estimation algorithm
的公式

在这里插入图片描述

基本步骤:

  1. 获取值。
  2. 将获取的值转为hash值。
  3. 把hash值转为二进制数。
  4. 创建m个桶,并初始化桶的值。
  5. 二进制数末尾取s位作为索引值.
  6. 剩余数从低位到高位寻找第一个1出现位置j。
  7. 在j桶的位置放入转化为十进制s位的索引值(如果比原有的值小,则保留原有的最大值)。
  8. 取每个桶的调和平均值。
  9. 求出基数值。

假设我们有一个值:14,262,337

转化为hash值为:3,838,145,797

转化为二进制数为:1110 0100 1100 0101 0111 0101 0000 0101(是不是和抛硬币正反面差不多)

创建64个桶并初始化:m=64

在这里插入图片描述

将后6位作为索引值:000101(十进制:5)

在这里插入图片描述
在剩余数从低位到高位找出第一个1出现的位置。

在这里插入图片描述
在第5个桶放入3。

如果此时第5个桶内已经包含6,3<6,则第5个桶内的值不做改变,依旧为6.

在这里插入图片描述
取调和平均值:将所有数值取倒数并求其算术平均数后,再将此算术平均数取倒数而得,其结果等于数值的个数除以数值倒数的总和。

比如: x 1 \mathop {x}_{1} x1=3; x 2 \mathop {x}_{2} x2=6; n=2;

则:

在这里插入图片描述

在这里插入图片描述

求基数值:

在这里插入图片描述

其中:

在这里插入图片描述

我们使用了64个桶,所以我们这里使用 0.709.

在这里插入图片描述
带入公式,偏差依旧很大。我们需要对数据进行微调。

摘自HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm

在这里插入图片描述

将 E 值进行调整,情况分成三种:

  • 小范围
  • 中等范围
  • 大范围

当 E ≤ \le 5m/2:

使用:

在这里插入图片描述

中等范围:

值不变

大范围:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HyperLogLog是一种概率性数据结构,主要用于进行基数(distinct count)的近似计数。它可以用来统计集合中元素的数量,而不需要存储每个元素本身。 HyperLogLog的原理是通过一定的算法和数据结构,在较小的内存占用下,对大数据集的基数进行近似计数。在实际应用中,HyperLogLog通常与Redis等数据存储系统配合使用。 HyperLogLog的使用语法主要包括pfadd和pfcount两个命令。pfadd用于添加数据到HyperLogLog中,而pfcount用于对HyperLogLog进行基数的统计。虽然算法比较复杂,但是使用起来相对容易掌握。 在HyperLogLog中,使用pfadd命令添加数据时,并不会一次性分配大量内存,而是随着基数的增加逐渐增加内存分配。而pfmerge命令用于将不同的HyperLogLog合并到一个12k大小的key中。这是因为在HyperLogLog的合并操作中,需要单独比较每个桶的值。 HyperLogLog算法最初是为了处理大数据量的统计而被发明的。因此,它非常适合那些对精确度要求不高,但对性能和存储空间要求较高的场景。虽然HyperLogLog提供的计数是近似的,但标准误差只有0.81%。因此,在页面用户访问量较大且对计数的准确度要求不高的情况下,可以使用HyperLogLog进行基数的近似计数,既能节省存储空间,又能保证较好的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一拖再拖 一拖再拖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值