求k分位数的k-1个顺序统计量

本文介绍了一种高效的O(nlogk)算法来找出一个包含n个元素的集合的k分位数。该算法通过利用Select算法并结合二分思想,能够快速找到将集合平均分为k个子集所需的k-1个顺序统计量。

问题:对于一个包含n个元素的集合来说,k分为数就是指能把有序集合分成k个等大小集合的“k-1个顺序统计量”,给出一个能找出某一集合的k分位数的O(nlogk)的算法。

       首先k要整除n,这样才可以分为k个等大小的集合。若将一个大小为n的集合按照顺序排好,我们所要求的这k-1个数就是要把这个集合平均分为k个集合。例如集合A= { 8, 4,0, -89, -12, 0, 36, 789, 21},将集合排序后A={-89,-12,0,0,4,8,21,36,789};若k=3,则将集合分为{-89,-12,0},{0,4,8},{21,36,789}那么2个顺序统计量为0,8

        设d=n/k,于是这k-1个数是集合A中第d,2d....(k-1)d小的数。我们知道利用Select算法(选择的O(n)算法)找出第i小的数算法复杂度为O(n),那么逐一的找出这k-1个数时间为O(nk),而题目给出的时间是O(nlogk).于是需要结合二分的思想。  首先将第(k/2)*d小的数找出来放在A中正确的位置(数组A[0...n-1],则它正确的位置下标为(k/2)*d-1)),然后数组A[o..n-1

<think> 我们讲解中位数和分位数的概念,这些是描述数据布的重要统计量。 中位数(Median)和分位数(Quantiles)是统计学中用于描述数据布位置的度量。 1. 中位数(Median): 中位数是将数据集按顺序排列后位于中间的值。换句话说,它是将数据集为两半的点:50%的数据小于或等于中位数,50%的数据大于或等于中位数。 计算方法: - 如果数据点数量为奇数,则中位数是中间的那个数。 - 如果数据点数量为偶数,则中位数是中间两个数的平均值。 2. 分位数(Quantiles): 分位数是将数据集划成相等部的值。常见的分位数有: -分位数(Quartiles):将数据为四等份。 * 第一四分位数(Q1):25%分位数,表示有25%的数据小于或等于该值。 * 中位数(Q2):50%分位数,即中位数。 * 第三四分位数(Q3):75%分位数,表示有75%的数据小于或等于该值。 - 此外还有百分位数(Percentiles),例如第10百分位数、第90百分位数等。 3. 分位数的计算(以四分位数为例): 有多种计算方法,这里介绍一种常用方法(包括numpy和pandas使用的方法): 步骤: a. 将数据从小到大排序。 b. 确定位点的位置(位置从0开始计数): Q1的位置 = (n-1) * 0.25 Q2的位置 = (n-1) * 0.5 Q3的位置 = (n-1) * 0.75 c. 如果位置是整数,则分位数就是该位置上的值;如果不是整数,则使用线性插值。 例如:数据集[1, 3, 5, 7, 9, 11, 13, 15] n=8 Q1位置 = (8-1)*0.25 = 1.75 -> 位于第1个数据(3)和第2个数据(5)之间,具体值= 3 + (5-3)*0.75 = 4.5 Q2位置 = (8-1)*0.5 = 3.5 -> 位于第3个数据(7)和第4个数据(9)之间,具体值= 7 + (9-7)*0.5 = 8 Q3位置 = (8-1)*0.75 = 5.25 -> 位于第5个数据(11)和第6个数据(13)之间,具体值= 11 + (13-11)*0.25 = 11.5 4. 箱线图(Boxplot)中的应用: 在箱线图中,箱子的上下边界别对应Q3和Q1,箱子中间的线对应中位数(Q2)。箱子外的须线通常延伸至1.5倍IQR(四位距,即Q3-Q1)范围内的数据点。 5. 为什么使用中位数和分位数? 它们对异常值不敏感(鲁棒性),特别是在存在极端值的情况下,比均值更能代表数据的中心位置和布情况。 示例代码(计算中位数和四分位数): 我们可以使用numpy来计算中位数,用pandas计算分位数。 </think> ### 中位数与分位数概念精讲 #### 1. 中位数(Median) ```python # Python计算中位数 import numpy as np data = [15, 20, 35, 40, 50] median = np.median(data) # 结果:35 ``` **概念解释**: - 中位数是数据集排序后处于最中间位置的值 - **计算规则**: - 当数据量为奇数:取中间值(如[1, 3, 5]的中位数是3) - 当数据量为偶数:取中间两数的平均值(如[1, 3, 5, 7]的中位数是(3+5)/2=4) - **核心价值**: - 衡量数据集的"中心位置" - 相比平均数,对极端值不敏感(鲁棒性强) - 示例:工资数据[3000, 4000, 5000, 6000, 100000]的中位数是5000,更合理反映普通员工收入 #### 2. 分位数(Quantiles) ```python # Python计算四分位数 import numpy as np data = [10, 20, 30, 40, 50, 60, 70, 80] q1 = np.quantile(data, 0.25) # 第一四分位数:35.0 q2 = np.quantile(data, 0.50) # 第二四分位数(中位数):45.0 q3 = np.quantile(data, 0.75) # 第三四分位数:65.0 ``` **层级关系**: ``` 最小値 Q1 中位数(Q2) Q3 最大值 |----------|----------|----------|----------| 10 35 45 65 80 ``` **关键分位数**: | 分位数类型 | 割比例 | 别名 | 意义 | |------------|----------|------------|-----------------------| | 第一四分位数 | 25% | Q1/lower quartile | 25%数据小于此值 | | 第二四分位数 | 50% | 中位数 | 数据集的中间点 | | 第三四分位数 | 75% | Q3/upper quartile | 75%数据小于此值 | | 百分位数 | 自定义 | P_k | K%数据小于此值 | #### 3. 分位数计算原理 以数据集[1, 3, 5, 7, 9, 11]为例: 1. **排序数据**:[1, 3, 5, 7, 9, 11](已排序) 2. **定位公式**:位置 = (n-1) * p (n为数据量,p为位比例) 3. **计算结果**: - Q1位置:(6-1)*0.25=1.25 → 介于索引1(3)和2(5)之间 - 插值计算:3 + (5-3)*0.25 = 3.5 - Q3位置:(6-1)*0.75=3.75 → 7 + (9-7)*0.75 = 8.5 #### 4. 应用场景对比 | 场景 | 推荐统计量 | 原因 | |--------------------|------------|-------------------------------| | 收入析 | 中位数 | 避免超高收入扭曲结果 | | 考试成绩评估 | 百分位数 | 精确判定学生排名位置 | | 产品质量控制 | 四位距 | (Q3-Q1)衡量数据离散程度 | | 异常值检测 | 箱线图规则 | 使用Q1-1.5IQR和Q3+1.5IQR作为边界 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值