上一篇博客中讲述了使用
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?,则不将其加入;否则,则将其加入。下图给出了其算法示意图:
示例
T-digest的建立
T-digest的查询
相关链接
TDigest 算法原理
TDigest_PPT