当前位置: 代码迷 >> 综合 >> T-digest
  详细解决方案

T-digest

热度:98   发布时间:2024-01-30 17:15:44.0

目录

  • 算法原理
  • 示例
    • T-digest的建立
    • T-digest的查询
  • 相关链接

上一篇博客中讲述了使用 R a n d o m Random 算法进行 q u a n t i l e quantile 估算,详情可见Random,本博客将讲诉另外一个 q u a n t i l e quantile 估算算法: T ? d i g e s t T-digest ,该算法理论基础可以参考Computing Extremely Accurate Quantiles Using t-Digest

算法原理

该算法的思想是将输入数据表示缩减成簇的集合 { C i } 1 m \{C_{i}\}^m_1 ,每个簇表示为: ( C i , C c o u n t ) (C_i,C_{count}) C i C_i 表示该簇的中心,一般是等于簇中元素的平均值, C c o u n t C_{count} 则是该簇中对应的元素的数量。簇的大小极大影响了算法的准确率,假设簇的较大,则会导致结果误差偏大;假设簇的大小较小,则会导致结果准确,但另一方面计算的复杂度对增加。对于一般的问题而言,我们更加关注位于两端的 q u a n t i l e quantile (即靠近 0 0 或者 1 1 ),即: q u a n t i l e quantile 位于中间部分的簇容量较大;相应地, q u a n t i l e quantile 位于两端的簇的容量较小。给出如下公式:
k ( q , σ ) = σ 2 π a r c s i n ( 2 q ? 1 ) (1) k(q,\sigma)=\frac{\sigma}{2\pi}arcsin(2q-1)\tag{1}
其中: q q 为簇对应的分位数, σ \sigma 为压缩系数。
则对应的某段 q u a n t i l e quantile 所能代表的量化长度为:
K ( C i ) = k ( q ( c i ) , σ ) ? k ( q ( c i ? 1 ) , σ ) (2) K(C_{i})=k(q(c_{i}),\sigma)-k(q(c_{i-1}),\sigma)\tag{2}
其中: K ( C 1 ) = k ( q ( c 1 ) , σ ) K(C_{1})=k(q(c_1),\sigma)
另外, T ? d i g e s t T-digest 还需满足以下性质:
{ K ( c i ) = 1 K ( c i ) + K ( c i + 1 ) > 1 (3) \left\{ \begin{aligned} K(c_i) &= & \leq1 \\ K(c_i)+K(c_{i+1})&>&1 \end{aligned} \right.\tag{3}
对于某个簇 C i C_{i} 而言,其所能接受的最大 q u a n t i l e quantile 为:
q l i m i t = 1 2 [ 1 + s i n ( a r c s i n ( 2 × q ( c i ) ? 1 ) + 2 π σ ) ] q_{limit}=\frac{1}{2}[1+sin(arcsin(2\times q(c_i)-1)+\frac{2\pi}{\sigma})]
故当某个新元素到来时,若将其加入到当前簇 C i C_i 时,若 q q 将大于 q l i m i t q_{limit} ,则不将其加入;否则,则将其加入。下图给出了其算法示意图:
算法
算法

示例

T-digest的建立

示例
算法
示例

T-digest的查询

分位数查询
分位数查询
分位数查询

相关链接

TDigest 算法原理
TDigest_PPT