2011-01-01 17 views
11

Şu anda Python'da Java ile yazılmış bazı algoritmaları yeniden yapılandırmaya çalışıyorum. Bir adım, bir değerler listesinin standart sapmasını hesaplamaktır. Orijinal uygulama, bunun için Apache Math 1.1 kitaplığından DescriptiveStatistics.getStandardDeviation kullanır. 1.5 numaralı standart sapmayı kullanıyorum. Sorun, aynı girdi için (çok) farklı sonuçlar veriyorlar.Wolfram ve numpy ile aynı girdi için farklı standart sapma

numpy   : 0.10932134388775223 
Apache Math 1.1 : 0.12620366805397404 
Wolfram Alpha : 0.12620366805397404 

Bir üçüncü görüş almak için Wolfram Alpha ile kontrol: Aşağıdaki sonuçlar elde

[0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842] 

: Ben örnek budur. Böyle bir farkın tek başına hassasiyetle açıklanabileceğini düşünmüyorum. Bunun neden olduğuna dair bir fikri olan var mı, bunun hakkında ne yapabilirim?

Düzenleme: yaklaşık doğru kullanarak değil, aynı zamanda

>>> from math import sqrt 
>>> v = [0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842] 
>>> mu = sum(v)/4 
>>> sqrt(sum([(x - mu)**2 for x in v])/4) 
0.10932134388775223 

:

>>> from numpy import std 
>>> std([0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842]) 
0.10932134388775223 
+0

Apache ve Wolfram'ın doğru olduğunu söyleyebilir miyim? Ve Numpy'nin yanlış olması olası değildir. Yani muhtemelen doğru kullanmıyorsunuz. Posta kodu? –

cevap

23

tarafından Apache ve Wolfram bölmek N-1 yerine Python elle hesaplanması aynı sonucu verir N. Bu, μ değerini tahmin ettiğiniz için bir serbestlik derecesi derecesidir. N-1 ile bölünerek, nüfus standart sapmasının tarafsız bir tahminini elde edersiniz. NumPy'nin davranışını ddof seçeneğini kullanarak değiştirebilirsiniz.

Bu NumPy belgelerinde açıklanmıştır:

ortalama sapma, normal olarak x.sum olarak hesaplanan olan kare()/K, burada N = len (x) tanımlanmaktadır. Ancak ddof, belirtilmişse, bölüm N - ddof yerine kullanılır. Standart istatistik uygulamada, ddof = 1, sonsuz popülasyonunun varyansının tarafsız bir tahmincisini sağlar. ddof = 0, normal olarak dağıtılmış değişkenleri için varyansının maksimum olabilirlik tahminini sağlar. Bu fonksiyonda hesaplanan standart sapma , tahmin edilen varyansın kareköküdür, bu nedenle ddof = 1 ile bile, standart sapmasındaki tahmini standart sapma tahmini olmayacaktır.

+2

Cevabınızın beni ne kadar mutlu ettiğini bilemezsin. Teşekkürler! NumPy yaptığı gibi aynı cevabı elde etmek için "nüfus standart sapma" için Alpha | –

+2

Sen Wolfram sorabilirsiniz. – Soumya

İlgili konular