3

我一直在将 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 help(numpy.std) 他们特别提到该算法是:

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

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

甚至是分位数/百分位数?

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

GNU Octave,版本 3.6.2

麻木的。版本“1.6.2rc1”

4

2 回答 2

1

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

于 2012-09-07T20:11:03.653 回答
1

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

>>> numpy.std(t, ddof=0)
29.157646512850633
>>> numpy.std(t, ddof=1)
29.304537349375785
于 2012-09-08T00:34:22.927 回答