我一直在将一个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'
答案 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