编辑整理:整理来源:维基百科,浏览量:102,时间:2022-12-21 02:42:01
第p百分位数怎么求,第p百分位数怎么求,为整数时,为啥求平均数,第p百分位数怎么求,为整数时,为啥求平均数
大家好,我是历小冰。
ElasticSearch 作为一个分布式的开源搜索和分析引擎,不仅能够进行全文匹配搜索,还可以进行聚合分析。
今天,我们就来了解一下其聚合分析中较为常见的 percentiles 百分位数分析。n 个数据按数值大小排列,处于 p% 位置的值称第 p 百分位数。比如说,ElasticSearch 记录了每次网站请求访问的耗时,需要统计其 TP99,也就是整体请求中的 99% 的请求的最长耗时。
近似算法当数据量较小或者数据集中存储在同一位置时,进行类似 TP99 这样的百分位数分析就很容易。但当数据量不断增长时,对于数据进行聚合分析就需要在数据量,精确度和实时性三个方面进行取舍,只能满足其中两项。
如上图所示,我们一共有三种选择方案:
有限数据计算:选择了精确度高和实时性,必然不能处理较大量级的数据,比如 MySQL 对单机数据进行统计分析;离线计算:选择了大数据量和精确度高,导致实时性较差,比如 Hadoop 可以在 PB 级别数据上提供精确分析,但是可能要很长时间;近似计算:选择了大数据量和实时性,但会损失一定的精确度,比如0.5%,但提供相对准确的分析结果。Elasticsearch 目前支持两种近似算法,分别是 cardinality 和 percentiles。
cardinality 用于计算字段的基数,即该字段的 distinct 或者 unique 值的数量。cardinality 基于 HyperLogLog(HLL)算法实现, HLL 会先对数据进行哈希运算,然后根据哈希运算的结果中的位数做概率估算从而得到基数。有关 HLL 算法的细节可以阅读《Redis HyperLogLog 详解》一文。
而 percentiles 则是本文的重点。
百分位数ElasticSearch 可以使用 percentiles 来分析指定字段的百分位数,具体请求如下所示,分析 logs 索引下的 latency 字段的百分位数,也就是计算网站请求的延迟百分位数。
percentiles 默认情况下会返回一组预设的百分位数值,分别是 [1, 5, 25, 50, 75, 95, 99] 。它们表示了人们感兴趣的常用百分位数值,极端的百分位数在范围的两边,其他的一些处于中部。具体的返回值如下图所示,我们可以看到最小延时在 75ms 左右,而最大延时差不多有 600ms。与之形成对比的是,平均延时在 200ms 左右。
和前文的 cardinality 基数一样,计算百分位数需要一个近似算法。
对于少量数据,在内存中维护一个所有值的有序列表, 就可以计算各类百分位数,但是当有几十亿数据分布在几十个节点时,这类算法是不现实的。
因此,percentiles 使用 TDigest 算法,它是一种近似算法,对不同百分位数的计算精确度不同,较为极端的百分位数范围更加准确,比如说 1% 或 99% 的百分位要比 50% 的百分位要准确。这是一个好的特性,因为多数人只关心极端的百分位。
TDigest 算法TDigest 是一个简单,快速,精确度高,可并行化的近似百分位算法,被 ElastichSearch、Spark 和 Kylin 等系统使用。TDigest 主要有两种实现算法,一种是 buffer-and-merge 算法,一种是 AV L树的聚类算法。
TDigest 使用的思想是近似算法常用的 Sketch,也就是素描,用一部分数据来刻画整体数据集的特征,就像我们日常的素描画一样,虽然和实物有差距,但是却看着和实物很像,能够展现实物的特征。
下面,我们来介绍一下 TDigest 的原理。比如有 500 个 -30 ~ 30 间的数字,我们可以使用概率密度函数(PDF)来表示这一数据集。该函数上的某一点的 y 值就是其 x 值在整体数据集中的出现概率,整个函数的面积相加就正好为 1 ,可以说它刻画了数据在数据集中的分布态势(大家较为熟悉的正太分布示意图展示的就是该函数)。
有了数据集对应的 PDF 函数,数据集的百分位数也能用 PDF 函数的面积表示。如下图所示,75% 百分位数就是面积占了 75% 时对应的 x 坐标。
我们知道,PDF 函数曲线中的点都对应着数据集中的数据,当数据量较少时,我们可以使用数据集的所有点来计算该函数,但是当数据量较大时,我们只有通过少量数据来代替数据集的所有数据。
这里,我们需要将数据集进行分组,相邻的数据分为一组,用 平均数(Mean)和 个数(Weight)来代替这一组数。这两个数合称为 Centroid(质心数),然后用这个质心数来计算 PDF,这就是 TDigest 算法的核心思想。
如上图所示,质心数的平均值作为 x 值,个数作为 y 值,可以通过这组质心数大致绘制出这个数据集的 PDF 函数。
对应的,计算百分位数也只需要从这些质心数中找到对应的位置的质心数,它的平均值就是百分位数值。
很明显,质心数的个数值越大,表达它代表的数据越多,丢失的信息越大,也就越不精准。如上图所示,太大的质心数丢失精准度太多,太小的质心数则有消耗内存等资源较大,达不到近似算法实时性高的效果。
所以,TDigest 在压缩比率(压缩比率越大,质心数代表的数据就要越多)的基础上,按照百分位数来控制各个质心数代表的数据的多少,在两侧的质心数较小,精准度更高,而在中间的质心数则较大,以此达到前文所说的 1% 或 99% 的百分位要比 50% 的百分位要准确的效果。
源码分析ElasticSearch 直接使用了 TDigest 的开源实现 t-digest,其 github 地址为 https://github.com/tdunning/t-digest,我们可以在 ElastichSearch 的 TDigestState 类看到其对 t-digest 实现的封装。
t-digest 提供了两种 TDigest 算法的实现:
MergingDigest 对应上文所说的 buffer-and-merge 算法AVLGroupTree对应 AVL 树的聚类算法。MergingDigest 用于数据集已经排序的场景,可以直接根据压缩比率计算质心数,而 AVLGroupTree 则需要使用 AVL 树来自信对数据根据其”接近程度“进行判断,然后计算质心数。
MergingDigest的实现较为简单,顾名思义,其算法名称叫做 buffer-and-merge,所以实现上使用 tempWeight 和 tempMean 两个数组来代表质心数数组,将数据和保存的质心数进行 merge,然后如果超出 weight 上限,则创建新的质心数,否则修改当前质心数的平均值和个数。
而 AVLGroupTree 与 MergingDigest 相比,多了一步通过 AVL 二叉平衡树搜索数据最靠近质心数的步骤,找到最靠近的质心数后,也是将二者进行 merge,然后判断是否超过 weight 上线,进行修改或者创建操作。
下面,我们直接来看 AVLGroupTree 的 add 方法。
当 ElasticSearch 处理一个数据集时,就是不断将数据集中的数据通过调用 add 函数加入到质心数中,然后统计完毕后,调用其 quantile 来计算百分位数。
后记欢迎大家继续关注程序员历小冰,后续会继续为大家带来有关数据存储,数据分析,分布式相关的文章。下一篇文章我们回来学习一下 ElasticSearch 的其他聚合分析操作的实现原理。
参考https://blog.bcmeng.com/post/tdigest.htmlhttps://blog.bcmeng.com/pdf/TDigest.pdfhttps://github.com/tdunning/t-digesthttps://op8867555.github.io/posts/2018-04-09-tdigest.html 百分位(p) :没啥好说的,就是百分数,比如2%,39%等等,没有量纲。
百分位数(P) :对于某个数值序列,根据某个 百分位p 计算得到的值就是该百分位对应的 百分位数P ,百分位数有量纲。假如原来序列表示考试成绩,则某个百分位数也是成绩。
百分位数的计算没有统一的标准公式 ,但有一个基本原则, 即当序列元素足够多或者序列满足连续概率分布时,不同百分位数计算方式得到的结果应该是一致的。
假设原始数值序列S0的长度为n,求百分位p的百分位数?
计算过程如下:
(1)序列排序:将序列从小到大排序,得到序列S1
(2)百分位序号计算:1+(n-1)×p=i+j,其中i是整数部分,j是小数部分;
(注意:这里的百分位序号指的是百分位对应序列中的位置,正常情况下它是个正整数,但实际上计算结果会出现小数,最简单处理方式就是取前一个或后一个最近的整数位置,但这么做有一个问题,如果前后两个位置对应的值差别很大,那么取前和取后得到的百分位数P差别就很大,于是另一种方式就是根据计算的百分位序号并结合前后两个位置的数据插值得到最终的百分位数P,随着插值方式的变化,P也不同,其中Excel和numpy的插值方式如下:)
(3)百分位数:P=S1(i)+[S(i+1)-S(i)]×j
(说明:这个插值思想很简单,S1(i)表示前一个位置的值,[S(i+1)-S(i)]×j表示前后两个位置对应值的间隔乘以位置的小数部分j,就是把j作为比例去截取间隔。)
例子:
求考试成绩序列S0=[37 12 72 9 75 5 79 64 16 1 76 71 6 25 50 20 18 84 11 28],单位是“分”。
在百分位p=80%的百分位数?
解:
S1=[ 1 5 6 9 11 12 16 18 20 25 28 37 50 64 71 72 75 76 79 84]
序列长度为n=20
则百分位序号为:1+(20-1)×80%=16.2,即i=16,j=0.2
则百分位数为:P=S1(16)+[S(17)-S(16)]×0.2=72+(75-72)*0.2=72.6分
这个结果的意思是80%的人在72.6分以下。
第p百分位数怎么求,第p百分位数怎么求,为整数时,为啥求平均数,第p百分位数怎么求,为整数时,为啥求平均数
作者:整理来源:维基百科,时间:2022-12-21 02:42,浏览:103
1、试用:程序插件没有试用哦!
2、效果:seo效果影响因数很多,老司机快速起站,新手自行评估!
3、ai模式:chatgpt模式需自备美国服务器+key,易封不建议使用!
4、更新:本人在用就会一直更新!
5、确认:确定好以上几点,一旦购买,概不退换,感谢支持,扫微付!