目录
- 算法
- 算法原理
- 空间消耗及错误界限
- 示例
- T-digest的建立
- T-digest的查询
- 相关链接
上一篇博客中讲述了使用 R a n d o m Random Random算法进行 q u a n t i l e quantile quantile估算,详情可见Random,本博客将讲诉另外一个 q u a n t i l e quantile quantile估算算法: T − d i g e s t T-digest T−digest,该算法理论基础可以参考Computing Extremely Accurate Quantiles Using t-Digest
算法
算法原理
该算法的思想是将输入数据表示缩减成簇的集合 { C i } 1 m \{C_{i}\}^m_1 {Ci}1m,每个簇表示为: ( C i , C c o u n t ) (C_i,C_{count}) (Ci,Ccount), C i C_i Ci表示该簇的中心,一般是等于簇中元素的平均值, C c o u n t C_{count} Ccount则是该簇中对应的元素的数量。簇的大小极大影响了算法的准确率,假设簇的较大,则会导致结果误差偏大;假设簇的大小较小,则会导致结果准确,但另一方面计算的复杂度对增加。对于一般的问题而言,我们更加关注位于两端的 q u a n t i l e quantile quantile(即靠近 0 0 0或者 1 1 1),即: q u a n t i l e quantile quantile位于中间部分的簇容量较大;相应地, q u a n t i l e quantile 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} k(q,σ)=2πσarcsin(2q−1)(1)
其中: q q q为簇对应的分位数, σ \sigma σ为压缩系数。
则对应的某段 q u a n t i l e quantile 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(Ci)=k(q(ci),σ)−k(q(ci−1),σ)(2)
其中: K ( C 1 ) = k ( q ( c 1 ) , σ ) K(C_{1})=k(q(c_1),\sigma) K(C1)=k(q(c1),σ)
另外, T − d i g e s t T-digest 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} {K(ci)K(ci)+K(ci+1)=>≤11(3)
对于某个簇 C i C_{i} Ci而言,其所能接受的最大 q u a n t i l e quantile 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})] qlimit=21[1+sin(arcsin(2×q(ci)−1)+σ2π)]
故当某个新元素到来时,若将其加入到当前簇 C i C_i Ci时,若 q q q将大于 q l i m i t q_{limit} qlimit,则不将其加入;否则,则将其加入。下图给出了其算法示意图:
空间消耗及错误界限
压缩系数 σ \sigma σ, b u f f e r buffer buffer大小 k k k,簇的数量 ⌊ σ 2 ⌋ ≤ m ≤ ⌈ σ ⌉ \lfloor \frac{\sigma}{2} \rfloor\leq m \leq \lceil \sigma \rceil ⌊2σ⌋≤m≤⌈σ⌉
不像其他 q u a n t i l e quantile quantile估算算法,该算法的准确率 ϵ \epsilon ϵ正比于 q × ( 1 − q ) q\times (1-q) q×(1−q),其中 q q q就是分位数。
示例
T-digest的建立
T-digest的查询
相关链接
TDigest 算法原理
TDigest_PPT