2013-04-17 19 views
6

sądzę numpy.cov(X) oblicza się macierz kowariancji próbek jako:funkcja numpy cov (kowariancja), co dokładnie to obliczyć?

1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean) 

tj sumy produktów zewnętrznych. Ale nigdzie w dokumentacji tak naprawdę nie mówi, po prostu mówi "Oszacuj macierz kowariancji".

Czy każdy może potwierdzić, czy działa tak wewnętrznie? (Wiem, że mogę zmienić stałą z przodu z parametrem bias.)

+0

https://github.com/numpy/numpy/blob/master/numpy/ma/extras.py#L1257 – YXD

Odpowiedz

3

Jak widać patrząc na source, w najprostszym przypadku bez masek i N zmiennymi M próbek każda, zwraca macierz (N, N) kowariancji obliczonej jako:

(x-m) * (x-m).T.conj()/(N - 1) 

Jeżeli * reprezentuje Produkt matrycy [1]

zaimplementowano grubsza:

X -= X.mean(axis=0) 
N = X.shape[1] 

fact = float(N - 1) 

return dot(X, X.T.conj())/fact 

Jeśli chcesz przejrzeć źródło, look here zamiast linku od pana E, chyba że jesteś zainteresowany maskowanymi tablicami. Jak wspomniałeś, the documentation nie jest świetny.

[1], która w tym przypadku jest efektywnie (ale nie dokładnie) produkt zewnętrzna ponieważ (x-m) ma N wektory kolumnowe długości M a zatem (x-m).T jest wiele wektorów rzędu. Wynik końcowy jest sumą wszystkich produktów zewnętrznych. Ten sam * da wewnętrzny (skalarny) produkt, jeśli zamówienie zostanie odwrócone. Ale technicznie są to tylko standardowe mnożenia macierzy, a prawdziwy zewnętrzny produkt jest jedynie produktem wektora kolumnowego na wektorze wiersza.

+0

Dobrze, a to jest odpowiednik moich sum zewnętrznych produktów? – Flash

+0

@Andrew Tak, jest i starałem się uczynić jaśniejszym w mojej odpowiedzi dla ciebie i innych. – askewchan

0

Tak, to jest to, co oblicza numpy.cov. FWIW, porównałem wyjście numpy.cov do jawnego iterowania po próbkach (jak w podanym pseudokodowaniu), aby porównać wydajność, a różnica w wynikowych tablicach wyjściowych jest tym, czego można by oczekiwać z powodu precyzji zmiennoprzecinkowej.