2013-06-26 22 views
1

我正试图找到最准确的函数来给我一个数据集内给定值的分位数。数据集将(可能)始终是指数分布。当处理指数数据集时,是否使用mquantiles()是否准确?

我使用的方法如下(我道歉,如果编码很差,因为我真的基础设施的人,而不是一个统计的家伙,也不是每天DEV):

import sys, scipy, numpy 
from matplotlib import pyplot 
from scipy.stats.mstats import mquantiles 

def FindQuantile(data,findme): 
    print 'entered FindQuantile' 
    probset=[] 
    #cheap hack to make a quick list to get quantiles for each permille value] 
    for i in numpy.linspace(0,1,10000): 
      probset.append(i) 

    #http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.mquantiles.html 
    quantile_results = mquantiles(data,prob=probset) 
    quantiles = [] 
    i = 0 
    for value in quantile_results: 
      print str(i) + ' permille ' + str(value) 
      quantiles.append(value) 
      i = i+1 
    #goal is to figure out which quantile findme falls in: 
    i = 0 
    for quantile in quantiles: 
      if (findme > quantile): 
        print str(quantile) + ' is too small for ' + str(findme) 
      else: 
        print str(quantile) + ' is the quantile value for the ' + str(i) + '-' + str(i + 1) + ' permille quantile range. ' + str(findme) + ' falls within this range.' 
        break 
      i = i + 1 

在我的研究,我注意到有几个更高级的功能可供使用,如scipy.stats.[distribution type].ppf()

使用mquantiles()的优势是什么?

有没有一种方法可以有效地确定数据集中数据的分布(这是我对scipy.stats.[distribution type]()的关注)?

感谢,

马特

[更新]

与讨论后,“统计花花公子,”我相信,这种方法(他被称为“经验方法”)仅仅是如果您不知道分配情况,则为有效。要找到分布,可以使用通过scipy.stats.ksonescipy.stats.kstwobign显示的Kolmogorov–Smirnov test来确定分布,然后使用scipy.stats.[distribution type].ppf()函数之一。他还表示,根本没有关系,上述方法与完成所有这些工作一样好,没有多少回报。尽管他警告说,上述方法的优势将随着data中的可用数据量的增加而增加(意味着情况反过来也是如此),但没有人解决了针对小数据集应用法律的问题。

我会做的是考虑数据集的强度,并对我的结果加以权衡,并且认为数据集“小”时它会更加模糊/重量更轻。什么是“小”?我不肯定。

我仍然想找到其他人输入有效使用ppf()与mquantile()。

回答

1

ppf给出了给定分布参数的特定分布的分位数。例如,您可以将数据拟合成指数分布,然后您可以使用ppf和估计的参数来获得分位数。

当你使用mquantiles时,你不会认为你有特定的分布。

估计一个给定的分布的参数和使用ppf会给你更好的结果,低方差比mquantiles,如果你的数据确实来自于分布或分布至少一个很好的近似。

+0

感谢您的回复。我在原来的问题中附加了更多的信息,因为它涉及到确定数据所在的分布。我应该使用一种方法来尝试发现分布并使用'ppf'函数吗?或者这太昂贵了?我希望整合到这个系统中的系统将是一个接近实时的异常检测机制。谢谢! – mbrownnyc

+0

异常值检测是一个不同的问题。你需要一个参考分布来知道什么是异常值(否则它只是尾部的常规随机抽取)。参考分布是过去的干净数据集(mquantiles)还是基于分布假设(distr.ppf)取决于您的用例。此外,如果分布变化不是很快,那么不需要每次新观察都更新参考分位数。一旦你拥有分位数,np.searchsorted是找到新的观察位置相对于基准位置的最快速度。 – user333700

+0

对于指数分布也有特定的异常值测试,但我不记得参考。 – user333700

相关问题