2012-06-06 18 views
6

Sto ricevendo un errore molto strano utilizzando un metodo di collegamento di base in python. Sembra, a meno che non devo essere molto stupido, ho valori diversi per A = A + B, e A + = B. Ecco il mio codice:Errore di addizione numpy di Python

def variance(phi,sigma,numberOfIterations): 
    variance = sigma 
    for k in range(1,numberOfIterations): 
     phik = np.linalg.matrix_power(phi,k) 
     variance = variance + phik*sigma*phik.T 
    return variance 

Questo fondamentalmente solo calcola la covarianza di un vettore un'autoregressione . Così per:

phi = np.matrix('0.7 0.2 -0.1; 0.001 0.8 0.1; 0.001 0.002 0.9') 
sigma = np.matrix('0.07 0.01 0.001; 0.01 0.05 0.004; 0.001 0.004 0.01') 

ottengo:

variance(phi,sigma,10) = 
[[ 0.1825225 0.07054728 0.00430524] 
[ 0.07054728 0.14837229 0.02659357] 
[ 0.00430524 0.02659357 0.04657858]] 

Questo è corretto credo (d'accordo con Matlab). Ora, se cambio la linea di cui sopra per

variance += phik*sigma*(phik.T) 

ottengo:

variance(phi,sigma,10) = 
[[ 0.34537165 0.20258329 0.04365378] 
[ 0.20258329 0.33471052 0.1529369 ] 
[ 0.04365378 0.1529369 0.19684553]] 

Che cosa sta succedendo?

Molte grazie

Dan

+1

'A = A .__ add __ (B)' = 'A = A .__ IADD __ (B)' se A è mutevole – JBernardo

+0

E 'anche un po' strano di avere una variabile nel campo di applicazione del funzione con lo stesso nome della funzione. –

risposta

7

il colpevole è:

variance = sigma 

Se si cambia quello a:

variance = sigma.copy() 

Vedrete il risultato corretto.

Questo perché += esegue effettivamente un (più efficiente) aggiunta sul posto ... E poiché sia ​​variance e sigma riferimento stesso vettore, verrà aggiornato entrambi. Ad esempio:!

>>> sigma = np.array([1]) 
>>> variance = sigma 
>>> variance += 3 
>>> sigma 
array([4]) 
+0

Grazie, molto apprezzato! – Dan