T-digest

上一篇博客中讲述了使用RandomRandom算法进行quantilequantile估算,详情可见Random,本博客将讲诉另外一个quantilequantile估算算法:TdigestT-digest,该算法理论基础可以参考Computing Extremely Accurate Quantiles Using t-Digest

算法

算法原理

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

空间消耗及错误界限

压缩系数σ\sigmabufferbuffer大小kk,簇的数量σ2mσ\lfloor \frac{\sigma}{2} \rfloor\leq m \leq \lceil \sigma \rceil
T-digest
不像其他quantilequantile估算算法,该算法的准确率ϵ\epsilon正比于q×(1q)q\times (1-q),其中qq就是分位数。

示例

T-digest的建立

T-digest
T-digest
T-digest

T-digest的查询

T-digest
T-digest
T-digest

相关链接

TDigest 算法原理
TDigest_PPT