2013-03-10 91 views
35

Sto cercando di capire come calcolare la covarianza con la funzione Python Numpy cov. Quando passo a due matrici monodimensionali, ottengo una matrice 2x2 di risultati. Non so cosa fare con quello. Non sono bravo in statistica, ma credo che la covarianza in una situazione del genere dovrebbe essere un numero unico. This è quello che sto cercando. Ho scritto il mio:Calcolo della covarianza con Python e 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) 

che funziona, ma immagino che la versione Numpy è molto più efficiente, se riuscivo a capire come usarlo.

Qualcuno sa come eseguire la funzione Numpy cov come quella che ho scritto?

Grazie,

Dave

+0

osservazione Minore, ma si potrebbe trarre vantaggio da numpy per calcolare la somma: 'sum = ((a - a_mean) * (b - b-mean)). Sum()' – PlasmaBinturong

risposta

74

Quando a e b sono sequenze 1-dimensionali, numpy.cov(a,b)[0][1] è equivalente al vostro cov(a,b).

La matrice 2x2 restituito da np.cov(a,b) ha elementi uguali a

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

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

(dove, sempre, cov è la funzione definita sopra.)

+4

Grazie mille! Vorrei che la documentazione lo avesse spiegato bene. Funziona perfettamente. Una volta che ho avuto la mia funzione di lavoro, avrei dovuto confrontare il risultato con la funzione numpy.cov e probabilmente l'avrei capito. Vorrei votare se potevo, ma sono nuovo e apparentemente non posso. – Dave

+2

Nessun problema. Sono contento di poterti aiutare. – unutbu

+1

Questo non è corretto: il 'numpy.cov' è impostato per il calcolo della covarianza * sample *. La prossima risposta lo spiega. In particolare questo dovrebbe dire 'numpy.cov (a, b, bias = True) [0] [1]' – javadba

9

Grazie unutbu per la spiegazione. Di default numpy.cov calcola la covarianza del campione. Per ottenere la covarianza della popolazione è possibile specificare la normalizzazione per il totale dei campioni N come questo:

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

o come questo:

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

** Questa ** è la risposta corretta, non quella accettata - che omette il 'bias = True' – javadba

+0

Risulta che la risposta accettata funziona: ma non include la menzione dell'aggiustamento di bias - che è sepolto nell'OP . Quindi questa risposta è utile. – javadba