为什么Octave的prctile和NumPy的percentile结果不同?

3

我将一份Matlab/Octave程序改写成了Numpy,发现了一些结果值的差异。这种情况出现在百分位数/percentile和标准差函数/stdard-deviation functions中。

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

所以我在Octave中实现了这个功能,并得到了与numpy完全相同的答案。因此,标准差函数似乎有所不同。
但是为什么/如何?哪个是正确的?(如果有这样的东西)

而且prctile/percentile呢?

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

GNU Octave,版本3.6.2

numpy.version '1.6.2rc1'

2个回答

1
Numpy在百分位数落在两个数据点之间时,使用不同的算法。Octave、Matlab和R总是在需要时将其准确地居中于两个点之间(我相信),而Numpy则做得更多......如果您查看http://en.wikipedia.org/wiki/Percentile,您会发现有几种计算百分位数的方法。

是的,即使是在这里,Octave 的计算结果也为 95.450,这使我相信 NumPy 的计算结果更加“正确”,应该是 95.000。 - kmceng
抱歉,我猜那个101的事情是错的...但是numpy在这里做更复杂的事情,肯定不会错。 - seberg
使用t=linspace(0,100,N)时,无论N的值为多少,NumPy计算得到的95th百分位数都是95,但Octave在N方面会有所不同。很奇怪。 - kmceng

1

看起来Octave默认假设ddof=1,而numpy默认使用0:

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

谢谢!那肯定解决了标准偏差的问题! - kmceng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接