【问题标题】:Python: How to find the n-th quantile of a 2-d distribution of pointsPython:如何找到点的二维分布的第 n 个分位数
【发布时间】:2018-04-06 23:47:23
【问题描述】:

我有一个点的二维分布(粗略地说,两个np.arraysxy)如附图所示。

如何选择属于此类分布的第 n 个分位数的分布点?

【问题讨论】:

  • 在维度 > 1 中,分位数不是唯一定义的。一维分位数只是一个阈值,但在二维中,它可以是任何闭合曲线,将数据集划分为“内部”和“外部”区域。如果您有一个多元正态分布,则该曲线的明智选择是以中位数/平均值为中心的椭圆。但是对于您显示的数据,我看不到任何明显的形状...
  • 就个人而言,我将 2D 分位数定义为包含 x% 数据点的最小凸(为了便于处理)区域。不知道这个定义在任何方面是否正确或有用,并且发现它可能是 NP-hard。

标签: python numpy scipy statistics quantile


【解决方案1】:

我终于想出了一个解决方案,它看起来可能不是最优雅的,但它工作得相当好: 要估计二维分布的分位数,可以使用scipy 函数binned_statistics,它允许将数据装箱 其中一个并计算另一个中的一些统计数据。 这是此类功能的文档: https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.binned_statistic.html 哪个语法是: scipy.stats.binned_statistic(x, values, statistic='mean', bins=10, range=None)

首先,可以选择要使用的垃圾箱数量,例如Nbins=100。 接下来,可以定义一个用户函数作为输入 (这里是一个如何做到这一点的例子: How to make user defined functions for binned_statistic),我的例子是一个函数,它估计该 bin 中数据的第 n 个百分位数(我称之为 myperc)。最后定义一个函数,例如它接受xyNbinsnth(所需的百分位数)并返回binned_statistics 给出3 个输出:statistic(其中所需统计的值) bin),bin_edges,binnumber(您的数据点在哪个 bin),还有位于 bin 中心的 x 的值(bin_center

def quantile2d(x,y,Nbins,nth):
    from numpy import percentile
    from scipy.stats import binned_statistic
    def myperc(x,n=nth):
        return(percentile(x,n))
    t=binned_statistic(x,y,statistic=myperc,bins=Nbins)
    v=[]
    for i in range(len(t[0])): v.append((t[1][i+1]+t[1][i])/2.)
    v=np.array(v)
    return(t,v)

所以vt.statistic 将分别给出定义所需百分位数的曲线的 x 和 y 值。

Nbins=100
nth=30.
t,v=me.quantile2d(x,y,Nbins,nth)
ii=[]
for i in range(Nbins):
    ii=ii+np.argwhere(((t.binnumber==i) & (y<t.statistic[i]))).flatten().tolist()
ii=np.array(ii,dtype=int)

最后,这给出了以下情节:

plt.plot(x,y,'o',color='gray',ms=1,zorder=1)
plt.plot(v,t.statistic,'r-',zorder=3)
plt.plot(x[ii],y[ii],'o',color='blue',ms=1,zorder=2)

其中第 30 个百分位数的线以红色显示,该百分位数以下的数据以蓝色显示。

【讨论】:

  • 如果我错了,请纠正我,但这个解决方案似乎返回了分布的条件分位数/百分位数(即基于 x 的分箱值的 y 的第 n 个分位数)。这与 n 维中的多元分位数不同。或许您应该考虑在您的问题/答案中包含“条件分位数”一词以避免混淆?
  • 我同意答案与问题不同。为了增加您的答案,您可能需要考虑寻找局部分位数回归。你可能不会找到一个包,但背后的数学相当简单:)
猜你喜欢
  • 2020-05-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多