Numpy std () neden matlab std () 'den farklı bir sonuç verir?


88

Matlab kodunu numpy'ye dönüştürmeye çalıştım ve numpy'nin std fonksiyonu ile farklı bir sonucu olduğunu anladım.

matlab'da

std([1,3,4,6])
ans =  2.0817

uyuşmuş

np.std([1,3,4,6])
1.8027756377319946

Bu normal mi? Ve bununla nasıl başa çıkmalıyım?

Yanıtlar:


146

NumPy işlevi np.stdisteğe bağlı bir parametre alır ddof: "Delta Serbestlik Derecesi". Varsayılan olarak bu 0. 1MATLAB sonucunu elde etmek için ayarlayın :

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326

Biraz daha bağlam eklemek için, varyans hesaplamasında (standart sapması kareköktür) tipik olarak sahip olduğumuz değerlerin sayısına böleriz.

Ancak, Ndaha geniş bir dağılımdan rastgele bir eleman örneği seçip varyansı hesaplarsak, bölme N, gerçek varyansın olduğundan az tahmin edilmesine yol açabilir. Bunu düzeltmek için, böldüğümüz sayıyı ( serbestlik derecesini ) N(genellikle N-1) den daha küçük bir sayıya indirebiliriz . ddofParametresi bize belirttiğiniz miktar böleni değiştirmek verir.

Aksi belirtilmedikçe, NumPy varyans için yanlı tahmin ediciyi hesaplayacaktır ( ddof=0bölerek N). Tüm dağıtımla çalışıyorsanız (ve daha büyük bir dağıtımdan rastgele seçilmiş bir değer alt kümesi değil), istediğiniz şey budur. Eğer ddofparametre verilir, NumPy böler N - ddofyerine.

MATLAB'ın varsayılan davranışı, stdörneklem varyansı için önyargıyı bölerek düzeltmektir N-1. Bu, standart sapmadaki önyargının bir kısmından (ancak muhtemelen hepsinden değil) kurtulur. Bu işlevi, daha büyük bir dağılımın rastgele bir örneğinde kullanıyorsanız, büyük olasılıkla istediğiniz şey olacaktır.

@Hbaderts'ın güzel cevabı daha fazla matematiksel ayrıntı verir.


4
Bunu Matlab'da ekleyeceğim, std([1 3 4 6],1)NumPy'nin varsayılanına eşdeğerdir np.std([1,3,4,6]). Tüm bunlar Matlab ve NumPy belgelerinde oldukça açık bir şekilde açıklanmıştır, bu nedenle OP'nin gelecekte bunları okuduğundan emin olmasını şiddetle tavsiye ederim.
horchler

Bu standart değişti Bir noktada: np.std () = np.std (ddof = 1), dokümantasyon o np.std () varsayılan gerektiğini söylüyor olsa bile ddof = 0 ... için
ColinMac

61

Standart sapma, varyansın kareköküdür. Rastgele bir değişkenin varyansı Xşu şekilde tanımlanır:

varyans tanımı

Bu nedenle varyans için bir tahminci olacaktır

önyargılı tahminci

burada örnek anlamıörnek ortalamayı belirtir. Rastgele seçilen için xi, bu tahmincinin gerçek varyansa yakınsamadığı, ancak

tarafsız tahminci

Örnekleri rastgele seçerseniz ve örnek ortalamasını ve varyansını tahmin ederseniz, düzeltilmiş (tarafsız) bir tahminci kullanmanız gerekecektir.

tarafsız tahminci

hangi yakınsama olacaktır sigma kare. Düzeltme terimine n-1Bessel'in düzeltmesi de denir.

Artık varsayılan olarak, MATLABs , düzeltme terimiyle tarafsız tahmin ediciyi stdhesaplar . Bununla birlikte NumPy (@ajcr'nin açıkladığı gibi) önyargılı tahminciyi varsayılan olarak düzeltme terimi olmadan hesaplar . Parametre , herhangi bir düzeltme terimini ayarlamaya izin verir . 1 olarak ayarlayarak MATLAB ile aynı sonucu alırsınız.n-1ddofn-ddof

Benzer şekilde, MATLAB w, "tartım şemasını" belirten ikinci bir parametre eklemeye izin verir . Varsayılan, w=0düzeltme terimi n-1(yansız tahminci) ile sonuçlanırken w=1, yalnızca n düzeltme terimi olarak kullanılır (yanlı tahminci).


2
Düzeltilmiş tahmin için formülde, faktör n (toplamı içinde) mevcut olmamalıdır.
Frunobulax

3
Varyanstaki n-1 teriminin arkasındaki sezgi: varyansı yaklaşık olarak belirlemek için kullanacağınız ortalamayı tahmin etmek için örneklerinizi zaten kullandınız. Bu bir korelasyon ortaya çıkarır ve bu nedenle ddof 1 olmalıdır.
Matthias

@Frunobulax Gelecek nesil için yazım hatasını düzelttim. Orijinal denklemde olan şey, toplamın üst sınırının düzgün şekilde işlenmemesiydi. nToplama gösteriminin en üstüne gitmek yerine , toplamın içine girdi.
rayryeng

5

İstatistikler konusunda iyi olmayan kişiler için basit bir rehber:

  • Tam veri kümenizden alınan bir örnek için ddof=1hesaplama yapıyorsanız dahil edin np.std().

  • Tam popülasyon için ddof=0hesap yapıyorsanız emin olunnp.std()

Sayılarda meydana gelebilecek sapmayı dengelemek için numunelere DDOF dahildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.