2013-04-17 4 views
6

Presumo numpy.cov(X) calcola la matrice di covarianza del campione come:numpy cov (covariance), che cosa calcola esattamente?

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

cioè somma dei prodotti esterni. Ma da nessuna parte nella documentazione si dice in realtà, dice semplicemente "Stima una matrice di covarianza".

Qualcuno può confermare se questo è ciò che fa internamente? (So ​​che posso modificare la costante in primo piano con il parametro bias.)

+0

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

risposta

3

Come si può vedere guardando il source, nel caso più semplice, senza maschere, e N variabili con M campioni ciascuno, restituisce la matrice (N, N) covarianza calcolata come:

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

Qualora il * rappresenta la matrice prodotto [1]

Implementato approssimativamente come:

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

fact = float(N - 1) 

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

Se si desidera esaminare la fonte, look here anziché il collegamento da Mr E a meno che non si sia interessati agli array mascherati. Come hai detto, lo the documentation non è eccezionale.

[1] che in questo caso è efficace (ma non esattamente) il prodotto esterno perché (x-m) ha N vettori colonna di lunghezza M e quindi (x-m).T è come molti vettori riga. Il risultato finale è la somma di tutti i prodotti esterni. Lo stesso * darà il prodotto interno (scalare) se l'ordine è invertito. Ma tecnicamente queste sono solo delle moltiplicazioni di matrice standard e il vero prodotto esterno è solo il prodotto di un vettore di colonna su un vettore di riga.

+0

Giusto, e questo è equivalente alla mia somma di prodotti esterni? – Flash

+0

@Andrew Sì, lo è, e ho cercato di renderlo più chiaro nella mia risposta per te e per gli altri. – askewchan

0

Sì, questo è ciò che computa numpy.cov. FWIW, ho confrontato l'output di numpy.cov con iterazioni esplicite sugli esempi (come nello pseudocode fornito) per confrontare le prestazioni e la differenza negli array di output risultanti è ciò che ci si aspetterebbe dalla precisione in virgola mobile.