2013-10-15 11 views
17

Numpy/Python'u kullanarak, tek bir işlev çağrısından ortalama VE varyansı döndürmek mümkün mü?Tek fonksiyondan Numpy mean AND varyansı?

Bunları ayrı ayrı yapabileceğimi biliyorum, ancak ortalama örnek standart sapmasını hesaplamak için gereklidir. Yani, ortalama ve varyansı elde etmek için ayrı işlevler kullanırsam, gereksiz bir ek yük ekliyorum.

Saygın belgelere bakmayı denedim (http://docs.scipy.org/doc/numpy/reference/routines.statistics.html), ancak hiç bir başarıya sahip değil.

+0

Neden numpy.std kullanıyorsunuz? Veya standart sapmadan başka bir şey hesaplamak ister misiniz? – Greg

cevap

24

Sen new standard library statistics module beklemek gerekecek, np.std veya np.var için bilinen bir ortalamasını geçemez, ama bu arada formülü kullanarak biraz zaman kazandırabilir:

In [329]: a = np.random.rand(1000) 

In [330]: %%timeit 
    .....: a.mean() 
    .....: a.var() 
    .....: 
10000 loops, best of 3: 80.6 µs per loop 

In [331]: %%timeit 
    .....: m = a.mean() 
    .....: np.mean((a-m)**2) 
    .....: 
10000 loops, best of 3: 60.9 µs per loop 

In [332]: m = a.mean() 

In [333]: a.var() 
Out[333]: 0.078365856465916137 

In [334]: np.mean((a-m)**2) 
Out[334]: 0.078365856465916137 

ise (yani bir nokta ürünün ne olduğundan) Eğer gerçekten squaring yapmak, işleri hızlandırmak np.dot denemek için çalışıyoruz ve toplanmasıyla gibidir:

In [335]: np.dot(a-m,a-m)/a.size 
Out[335]: 0.078365856465916137 

In [336]: %%timeit 
    .....: m = a.mean() 
    .....: c = a-m 
    .....: np.dot(c,c)/a.size 
    .....: 
10000 loops, best of 3: 38.2 µs per loop 
+1

Etkileyici şeyler! – Ginger

+5

Gelecek okuyucular için: [istatistik modülü Python 3.4'e eklendi] (https://docs.python.org/3/library/statistics.html) ve varyans fonksiyonu işlem süresini kaydetmek için önceden hesaplanmış bir ortalamadan geçirilebilir. Bununla birlikte, performansının nasıl uyuştuğunu bilmiyorum. –

0

Ayrıca ortalama arasındaki ilişkinin yararlanarak çıkarma önleyebilirsiniz, varyans Bir sinyalin gücü ve değeri:

In [7]: import numpy as np 

In [8]: a = np.random.rand(1000) 

In [9]: %%timeit 
    ...: a.mean() 
    ...: a.var() 
    ...: 
10000 loops, best of 3: 24.7 us per loop 

In [10]: %%timeit 
    ...: m = a.mean() 
    ...: np.mean((a-m)**2) 
    ...: 
100000 loops, best of 3: 18.5 us per loop 

In [11]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.mean(a ** 2) 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 17.3 us per loop 

In [12]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.dot(a, a)/a.size 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 9.16 us per loop