You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取二维点分布的第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:12:34