2013-03-10 9 views
35

Próbuję obliczyć, jak obliczyć kowariancję za pomocą funkcji Covarian Python Numpy. Kiedy przekazuję mu dwie tablice jedno-wymiarowe, otrzymuję wynik 2x2 macierzy. Nie wiem, co z tym zrobić. Nie jestem świetny w statystykach, ale uważam, że kowariancja w takiej sytuacji powinna być pojedynczą liczbą. This jest tym, czego szukam. Napisałem własne:Obliczanie kowariancji za pomocą Pythona i Numpy

def cov(a, b): 

    if len(a) != len(b): 
     return 

    a_mean = np.mean(a) 
    b_mean = np.mean(b) 

    sum = 0 

    for i in range(0, len(a)): 
     sum += ((a[i] - a_mean) * (b[i] - b_mean)) 

    return sum/(len(a)-1) 

To działa, ale sądzę, że wersja Numpy jest znacznie wydajniejsza, gdybym mogła wymyślić, jak jej użyć.

Czy ktoś wie, jak sprawić, by funkcja Numpy cov działała jak ta, którą napisałem?

Dzięki,

Dave

+0

Minor uwagą, ale można skorzystać z numpy do obliczania sumy: 'sum = ((a - a_mean) * (b - b-średnia)) .sum()' – PlasmaBinturong

Odpowiedz

74

Kiedy a i b są sekwencje 1-wymiarowe, numpy.cov(a,b)[0][1] jest równoważna swojej cov(a,b).

Tablica 2x2 zwrócony przez np.cov(a,b) posiada elementy równe

cov(a,a) cov(a,b) 

cov(a,b) cov(b,b) 

(gdzie znowu cov jest funkcja zdefiniowano powyżej.)

+4

Dziękuję bardzo! Szkoda, że ​​dokumentacja nie wyjaśniła tego tak dobrze. To działa idealnie. Kiedyś miałem swoją własną funkcję roboczą, powinienem był porównać wynik do funkcji numpy.cov i prawdopodobnie bym to rozgrywał. Mogę zagłosować, jeśli mogę, ale jestem nowy i najwyraźniej nie mogę. – Dave

+2

Bez problemu. Cieszę się, że mogłem pomóc. – unutbu

+1

To jest niepoprawne: 'numpy.cov' domyślnie oblicza * kowariancję * próbki *. Następna odpowiedź wyjaśnia to. W szczególności powinno to brzmieć "numpy.cov (a, b, bias = True) [0] [1]' – javadba

9

Dzięki unutbu za wyjaśnienie. Domyślnie numpy.cov oblicza kowariancję próbki. Aby uzyskać kowariancji populacji można określić normalizację przez całkowitą N próbek, takich jak ten:

Covariance = numpy.cov(a, b, bias=True)[0][1] 
print(Covariance) 

lub tak:

Covariance = numpy.cov(a, b, ddof=0)[0][1] 
print(Covariance) 
+0

** To ** jest poprawną odpowiedzią, a nie przyjętą - która pomija "odchylenie = prawda" – javadba

+0

Okazuje się, że zaakceptowana odpowiedź działa: ale nie zawiera wzmianki o korekcie obciążenia - która jest pochowana w PO . Ta informacja o odpowiedzi jest pomocna. – javadba