上一篇博客中讲述了使用Random算法进行quantile估算,详情可见Random,本博客将讲诉另外一个quantile估算算法:T−digest,该算法理论基础可以参考Computing Extremely Accurate Quantiles Using t-Digest
算法
算法原理
该算法的思想是将输入数据表示缩减成簇的集合{Ci}1m,每个簇表示为:(Ci,Ccount),Ci表示该簇的中心,一般是等于簇中元素的平均值,Ccount则是该簇中对应的元素的数量。簇的大小极大影响了算法的准确率,假设簇的较大,则会导致结果误差偏大;假设簇的大小较小,则会导致结果准确,但另一方面计算的复杂度对增加。对于一般的问题而言,我们更加关注位于两端的quantile(即靠近0或者1),即:quantile位于中间部分的簇容量较大;相应地,quantile位于两端的簇的容量较小。给出如下公式:
k(q,σ)=2πσarcsin(2q−1)(1)
其中:q为簇对应的分位数,σ为压缩系数。
则对应的某段quantile所能代表的量化长度为:
K(Ci)=k(q(ci),σ)−k(q(ci−1),σ)(2)
其中:K(C1)=k(q(c1),σ)
另外,T−digest还需满足以下性质:
{K(ci)K(ci)+K(ci+1)=>≤11(3)
对于某个簇Ci而言,其所能接受的最大quantile为:
qlimit=21[1+sin(arcsin(2×q(ci)−1)+σ2π)]
故当某个新元素到来时,若将其加入到当前簇Ci时,若q将大于qlimit,则不将其加入;否则,则将其加入。下图给出了其算法示意图:


空间消耗及错误界限
压缩系数σ,buffer大小k,簇的数量⌊2σ⌋≤m≤⌈σ⌉

不像其他quantile估算算法,该算法的准确率ϵ正比于q×(1−q),其中q就是分位数。
示例
T-digest的建立



T-digest的查询



相关链接
TDigest 算法原理
TDigest_PPT