gpt4 book ai didi

python - matlab中分位数的等效python命令

转载 作者:太空狗 更新时间:2023-10-30 00:36:44 29 4
gpt4 key购买 nike

我正在尝试在 python 中复制一些 Matlab 代码。我找不到与 Matlab 函数 quantile 完全等价的函数。我发现最接近的是 python 的 mquantiles

Matlab 示例:

 quantile( [ 8.60789925e-05, 1.98989354e-05 , 1.68308882e-04, 1.69379370e-04],  0.8)

...给出:0.00016958

python 中的相同示例:

scipy.stats.mstats.mquantiles( [8.60789925e-05, 1.98989354e-05, 1.68308882e-04, 1.69379370e-04], 0.8)

...给出 0.00016912

有谁知道如何精确复制 Matlab 的 quantile 函数?

最佳答案

documentation for quantile (在 More About => Algorithms 部分下)给出了使用的确切算法。这是一些 python 代码,使用 bottleneck 为平面数组的单个分位数执行此操作进行部分排序:

import numpy as np
import botteleneck as bn

def quantile(a, prob):
"""
Estimates the prob'th quantile of the values in a data array.

Uses the algorithm of matlab's quantile(), namely:
- Remove any nan values
- Take the sorted data as the (.5/n), (1.5/n), ..., (1-.5/n) quantiles.
- Use linear interpolation for values between (.5/n) and (1 - .5/n).
- Use the minimum or maximum for quantiles outside that range.

See also: scipy.stats.mstats.mquantiles
"""
a = np.asanyarray(a)
a = a[np.logical_not(np.isnan(a))].ravel()
n = a.size

if prob >= 1 - .5/n:
return a.max()
elif prob <= .5 / n:
return a.min()

# find the two bounds we're interpreting between:
# that is, find i such that (i+.5) / n <= prob <= (i+1.5)/n
t = n * prob - .5
i = np.floor(t)

# partial sort so that the ith element is at position i, with bigger ones
# to the right and smaller to the left
a = bn.partsort(a, i)

if i == t: # did we luck out and get an integer index?
return a[i]
else:
# we'll linearly interpolate between this and the next index
smaller = a[i]
larger = a[i+1:].min()
if np.isinf(smaller):
return smaller # avoid inf - inf
return smaller + (larger - smaller) * (t - i)

我只做了单分位数、一维的情况,因为这就是我所需要的。如果你想要几个分位数,那么做完整的排序可能是值得的;要按轴执行此操作并且知道您没有任何 nans,您需要做的就是将轴参数添加到排序中并对线性插值位进行矢量化。用 nans 按轴做会有点棘手。

此代码给出:

>>> quantile([ 8.60789925e-05, 1.98989354e-05 , 1.68308882e-04, 1.69379370e-04], 0.8)
0.00016905822360000001

并且 matlab 代码给出了 0.00016905822359999999;区别是 3e-20。 (小于机器精度)

关于python - matlab中分位数的等效python命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733034/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com