关于Numpy使用np.quantile取分位数得到的数据不在原始数组中的解释

什么是分位数

分位数(Quantile)是一个统计学概念,用于描述一个数据集中的位置特性。在一个有序的数据集中,第 q q q 分位数是一个值,使得数据集中至少有 q × 100 % q \times 100\% q×100% 的数据点小于或等于这个值,并且至少有 ( 1 − q ) × 100 % (1-q) \times 100\% (1q)×100% 的数据点大于或等于这个值。

当你在 NumPy 中使用 np.quantile 函数并设置 axis=0,函数将按列计算分位数。具体地,它会在每一列中找到相应的 q q q 分位数。

关于你的问题“为什么不在原 array 里面”,这是因为分位数是根据数据的分布计算出来的,不一定是数据集中实际出现的值。分位数可能是数据集中的一个值,也可能是两个(或多个)相邻值的平均值。

让我们通过一个例子来说明。假设我们有以下数组:

arr = 
[[0.77395605, 0.43887844, 0.85859792, 0.69736803],
[0.09417735, 0.97562235, 0.7611397, 0.78606431],  
[0.12811363, 0.45038594, 0.37079802, 0.92676499]]

我们可以使用 NumPy 的 np.quantile 函数来找到每一列的 1 / 4 1/4 1/4 分位数。

计算得到的 1 / 4 1/4 1/4 分位数(按列)为:

[0.11114549, 0.44463219, 0.56596886, 0.74171617]

这意味着:

  • 第一列中,至少有 25 25\\% 25 的数据小于或等于 0.11114549 0.11114549 0.11114549,并且至少有 75 75\\% 75 的数据大于或等于 0.11114549 0.11114549 0.11114549

  • 第二列中,至少有 25 25\\% 25 的数据小于或等于 0.44463219 0.44463219 0.44463219,并且至少有 75 75\\% 75 的数据大于或等于 0.44463219 0.44463219 0.44463219

  • 第三列中,至少有 25 25\\% 25 的数据小于或等于 0.56596886 0.56596886 0.56596886,并且至少有 75 75\\% 75 的数据大于或等于 0.56596886 0.56596886 0.56596886

  • 第四列中,至少有 25 25\\% 25 的数据小于或等于 0.74171617 0.74171617 0.74171617,并且至少有 75 75\\% 75 的数据大于或等于 0.74171617 0.74171617 0.74171617

注意,这些分位数值可能不在原始数组中。它们是根据数据分布计算出来的,可能是两个相邻数据点的中值或者插值。这也是为什么分位数可能不在原数组中的原因。

代码:

import numpy as np

# Given array
arr = np.array([
    [0.77395605, 0.43887844, 0.85859792, 0.69736803],
    [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
    [0.12811363, 0.45038594, 0.37079802, 0.92676499]
])

# Calculate the 1/4 quantile for each column
quantile_25 = np.quantile(arr, q=0.25, axis=0)
quantile_25

怎么求出中位数

计算分位数的方法有多种,但一种常用的方法是以下几个步骤:

  1. 排序数据:首先,将数据排序(升序或降序均可,但通常是升序)。

  2. 计算位置参数:使用以下公式计算 q q q 分位数的位置参数(索引):

i = q × ( N − 1 ) + 1 i = q \times (N - 1) + 1 i=q×(N1)+1

其中 N N N 是数据点的数量, q q q 是所求的分位数(例如,对于 1 / 4 1/4 1/4 分位数, q = 0.25 q = 0.25 q=0.25)。

  1. 找到分位数:
  • 整数索引:如果 i i i 是整数,那么 i i i 索引处的数据值就是 q q q 分位数。

  • 非整数索引:如果 i i i 不是整数,那么通常会使用线性插值来找到分位数。这通常是通过以下公式完成的:

Quantile = ( 1 − α ) × Value ⌊ i ⌋ + α × Value ⌈ i ⌉ \text{Quantile} = (1 - \alpha) \times \text{Value}_{\lfloor i \rfloor} + \alpha \times \text{Value}_{\lceil i \rceil} Quantile=(1α)×Valuei+α×Valuei

其中 ⌊ i ⌋ \lfloor i \rfloor i ⌈ i ⌉ \lceil i \rceil i 分别是 i i i 的向下和向上取整, α = i − ⌊ i ⌋ \alpha = i - \lfloor i \rfloor α=ii

让我们通过一个具体的例子来解释这个过程。我们可以使用 NumPy 数组的第一列([0.77395605, 0.09417735, 0.12811363])来计算 1 / 4 1/4 1/4 分位数。

对第一列的数据([0.77395605, 0.09417735, 0.12811363])进行排序后,我们得到:

排序后的数据 = [0.09417735, 0.12811363, 0.77395605]

计算 1 / 4 1/4 1/4 分位数的位置参数 i i i(基于 1 的索引):

i = 0.25 × ( 3 − 1 ) + 1 = 1.5 i = 0.25 \times (3 - 1) + 1 = 1.5 i=0.25×(31)+1=1.5

因为 i i i 不是整数( i = 1.5 i = 1.5 i=1.5),我们需要使用线性插值来找到分位数。我们使用下面的公式:

Quantile = ( 1 − α ) × Value ⌊ i ⌋ + α × Value ⌈ i ⌉ \text{Quantile} = (1 - \alpha) \times \text{Value}_{\lfloor i \rfloor} + \alpha \times \text{Value}_{\lceil i \rceil} Quantile=(1α)×Valuei+α×Valuei

在这个例子中, Value ⌊ i ⌋ = 0.09417735 \text{Value}_{\lfloor i \rfloor} = 0.09417735 Valuei=0.09417735, Value ⌈ i ⌉ = 0.12811363 \text{Value}_{\lceil i \rceil} = 0.12811363 Valuei=0.12811363, α = 1.5 − 1 = 0.5 \alpha = 1.5 - 1 = 0.5 α=1.51=0.5

所以,

Quantile = ( 1 − 0.5 ) × 0.09417735 + 0.5 × 0.12811363 = 0.11114549 \text{Quantile} = (1 - 0.5) \times 0.09417735 + 0.5 \times 0.12811363 = 0.11114549 Quantile=(10.5)×0.09417735+0.5×0.12811363=0.11114549

这正是我们用 NumPy 得到的结果。这样,你可以更好地理解分位数是如何计算的,以及为什么它可能不在原始数据集中。

代码:

# Extract the first column from the array
first_column = arr[:, 0]

# Sort the data
sorted_data = np.sort(first_column)

# Number of data points
N = len(sorted_data)

# Quantile to calculate (1/4)
q = 0.25

# Calculate index parameter (1-based index)
i = q * (N - 1) + 1

# Calculate quantile
if i.is_integer():
    quantile_value = sorted_data[int(i) - 1]
else:
    lower_value = sorted_data[int(np.floor(i)) - 1]
    upper_value = sorted_data[int(np.ceil(i)) - 1]
    alpha = i - np.floor(i)
    quantile_value = (1 - alpha) * lower_value + alpha * upper_value

sorted_data, i, quantile_value

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值