如何获取二维点分布的第n分位数并筛选对应分位数的点?
解决二维点分布的分位数计算与筛选问题
处理二维点分布的分位数问题和一维不太一样——因为二维数据没有天然的“大小排序”逻辑,所以我们通常需要先把每个点映射到一个一维的指标(比如到分布中心的距离),再用熟悉的一维分位数方法处理。下面分两部分解决你的问题:
一、计算二维点分布的第n分位数
这里我们介绍两种最常用的方法,你可以根据数据分布选择:
方法1:基于欧氏距离到均值中心
这种方法适合数据大致呈圆形分布的场景,步骤很直观:
- 先计算所有点的均值中心(x方向和y方向的均值)
- 计算每个点到这个中心的欧氏距离
- 对距离数组计算第n分位数(注意
np.quantile的参数是0-1之间的小数,比如90分位数用0.9)
方法2:基于马氏距离
如果你的数据是椭圆分布(比如x和y有相关性),马氏距离会更合适——它会考虑数据的协方差结构,消除维度间相关性的影响:
- 先把x和y合并成二维点矩阵
- 计算协方差矩阵及其逆矩阵
- 计算每个点到均值中心的马氏距离
- 同样对距离数组计算分位数
二、筛选属于第n分位数的点
这里的“属于第n分位数”通常指距离小于等于第n分位数阈值的点(也就是分布中最靠近中心的n%的点),步骤如下:
- 用上面的方法算出距离数组和对应的分位数阈值
- 生成一个布尔掩码,标记哪些点的距离≤阈值
- 用这个掩码筛选x和y数组,得到目标点
完整代码示例
import numpy as np # 模拟你的二维点数据(替换成你自己的x和y数组即可) x = np.random.normal(loc=0, scale=1, size=1000) y = np.random.normal(loc=0, scale=2, size=1000) # 模拟椭圆分布 # -------------------------- # 问题1:计算第90分位数(你可以替换成任意n值,比如75) # -------------------------- n_percent = 90 quantile_value = n_percent / 100 # 转换为0-1的小数 # 欧氏距离法 mean_x, mean_y = np.mean(x), np.mean(y) eu_distances = np.sqrt((x - mean_x)**2 + (y - mean_y)**2) eu_quantile = np.quantile(eu_distances, quantile_value) print(f"基于欧氏距离的第{n_percent}分位数:{eu_quantile:.2f}") # 马氏距离法 points = np.column_stack((x, y)) cov_matrix = np.cov(points, rowvar=False) inv_cov = np.linalg.inv(cov_matrix) centered_points = points - np.mean(points, axis=0) maha_distances = np.sqrt(np.sum(centered_points @ inv_cov * centered_points, axis=1)) maha_quantile = np.quantile(maha_distances, quantile_value) print(f"基于马氏距离的第{n_percent}分位数:{maha_quantile:.2f}") # -------------------------- # 问题2:筛选对应分位数的点 # -------------------------- # 筛选欧氏距离≤分位数的点 eu_mask = eu_distances <= eu_quantile filtered_x_eu = x[eu_mask] filtered_y_eu = y[eu_mask] print(f"欧氏距离筛选后保留的点数:{len(filtered_x_eu)}(约占总点数的{n_percent}%)") # 筛选马氏距离≤分位数的点 maha_mask = maha_distances <= maha_quantile filtered_x_maha = x[maha_mask] filtered_y_maha = y[maha_mask] print(f"马氏距离筛选后保留的点数:{len(filtered_x_maha)}(约占总点数的{n_percent}%)")
补充说明
如果你的需求不是基于距离的分位数,而是要找二维联合分布的概率分位数(即找到一个区域,使得该区域内的点占总点数的n%),那可能需要用到核密度估计(KDE)来划分区域,但这种方法更复杂,适合更专业的统计场景。上面的距离法是最通用、易实现的方案,能覆盖大多数日常需求。
内容的提问来源于stack exchange,提问作者Julia Roquette
相关产品推荐
相关产品推荐

