【问题标题】:Why the difference between octave's prctile and numpy's percentile?为什么 octave 的 prctile 和 numpy 的百分位数之间存在差异?
【发布时间】:2012-09-08 08:34:22
【问题描述】:

我一直在将一个 matlab/octave 程序重写为 numpy 并遇到了一些结果值的差异。 百分位数/百分比和标准偏差函数都会出现这种情况。

在 Numpy 中:

import matplotlib.mlab as ml
import numpy

>>> t = numpy.linspace(0,100, 100)
>>> numpy.percentile(t,95)
95.0
>>> numpy.std(t)
29.157646512850626
>>> ml.prctile(t,95)
95.000000000000014              

八度:

octave:1> t = linspace(0,100,100)';
octave:2> prctile(t,95)
ans =  95.454545
octave:3> std(t)
ans =  29.304537

虽然 't' 的数组值相同,但结果比我想象的要大得多。

在 numpy 帮助(numpy.std)中,他们特别提到该算法是:

std = sqrt(mean(abs(x - x.mean())**2))

所以我在 octave 中实现了它并得到了 numpy 给出的确切答案。所以看起来标准偏差函数不同。
但是为什么/如何?哪个是正确的? (如果有这种事)

甚至 prctile/percentile?

以防万一,因为我在 Linux aptosid...

GNU Octave,版本 3.6.2

numpy.版本 '1.6.2rc1'

【问题讨论】:

    标签: numpy octave


    【解决方案1】:

    当百分位数位于两个数据点之间时,Numpy 只是使用不同的算法。 Octave、Matlab 和 R 总是在需要时将它精确地居中在两点之间(我相信),numpy 做得更多...如果你检查http://en.wikipedia.org/wiki/Percentile,你会看到有几种计算百分位数的方法。

    【讨论】:

    • 是的,即使在那里,octave 也得出 95.450,这让我相信 numpy 在 95.000 时更“正确”。
    • 对不起,我猜 101 的事情是错误的......但仍然 numpy 在这里做更复杂的事情,而且肯定没有错。
    • 在 t=linspace(0,100,N) 的情况下,无论 N 多少,numpy 都将第 95 个百分位表示为 95,但八度音阶在 N. Weird 方面有所不同。
    【解决方案2】:

    似乎 Octave 至少默认假定 ddof=1,而 numpy 默认使用 0:

    >>> numpy.std(t, ddof=0)
    29.157646512850633
    >>> numpy.std(t, ddof=1)
    29.304537349375785
    

    【讨论】:

    • 谢谢!这无疑解决了标准偏差问题!
    猜你喜欢
    • 2016-12-25
    • 2019-04-28
    • 1970-01-01
    • 2018-11-09
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多