为什么octave的prctile和numpy的百分位数之间存在差异?

时间:2012-09-07 19:59:50

标签: numpy octave

我一直在将一个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:

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))

所以我在八度音程中实现了它,并得到了numpy给出的确切答案。所以似乎std-deviation函数不同。
但为什么/如何?哪个是正确的? (如果有这样的事情)

甚至是prctile /百分位?

以防万一我在Linux aptosid ......

GNU Octave,版本3.6.2

numpy。版本'1.6.2rc1'

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

似乎Octave假设ddof = 1,至少默认情况下,numpy默认使用0:

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