2016-07-24 8 views
0

Ich habe eine Python for Schleife, die eine Variable zu haben scheint, die sich innerhalb der Schleife ändert. Meine Variablen sind definiert als:Variablenwechsel von sich aus innerhalb der Schleife

yhat = np.empty((1,len(prices))) 
yhat[:] = nan 
yhat = yhat.astype('float') 
e = Q = yhat 

P = R = np.matrix(np.zeros((2,2))) 
B = np.empty((2,len(prices))) 
B[:] = nan 
B = np.matrix(B) 

B[:,0] = 0 

Die Schleife ist: (prices ist ein Datenrahmen)

for t in xrange(0,len(prices),1): 

    if t > 0: 
     B[:,t] = B[:,t-1] 
     R = P+Vw 


    yhat[0,t] = x[t,:]*B[:,t] 
    print yhat[0,t] 

    Q[0,t] = x[t,:]*R*x[t,:].T + Ve 
    print yhat[0,t] 

    e[0,t] = y[t,0] - yhat[0,t] 
    print yhat[0,t] 

    K = (R*x[t,:].T)/Q[0,t] 

    B[:,t] = B[:,t]+K*e[0,t] 


    P = R - K*x[t,:]*R 

ich drucke yhat, weil ich die Anomalie in den Code unten, um es verengt haben. Nachdem der Wert von yhat @ t festgelegt wurde, scheint es sich zu ändern. Wenn ich den Code ausführen, druckt es aus:

0.0 
0.001 
20.438747 

Außerdem, ich bin besorgt über die Subtraktion für e[0,t] weil aus irgendeinem Grunde der Subtraktion ergibt den Wert von yhat in diesem gegenwärtigen Moment?

Vielleicht vermisse ich etwas offensichtlich offensichtlich. Ich bin relativ neu bei Python, und ich wechselte von MATLAB.

BEARBEITEN: x & y sind auch Matrixobjekte. Also sind alle Multiplikationen Matrix-Punkt-Produkte.

Antwort

3

e = Q = yhat erstellt keine Kopien. Sie sind stattdessen zusätzliche Verweise auf das gleiche Objekt. Wenn Sie dieses Objekt über die Namen e oder Q ändern, werden diese Änderungen auch durch die yhat Referenz angezeigt.

So

yhat[0,t] = x[t,:]*B[:,t] 

und

Q[0,t] = x[t,:]*R*x[t,:].T + Ve 

und

e[0,t] = y[t,0] - yhat[0,t] 

arbeiten alle auf dem gleichen, einzigen numpy Array-Objekt, nicht auf separate Objekte.

Verwenden Sie die numpy.copy() function unabhängige neue Kopien zu erstellen, statt:

e, Q = np.copy(yhat), np.copy(yhat) 
+0

Schöne. Jetzt funktioniert der Kalman-Filter wie ein Traum. Ist das jetzt nur eine Nuance? Oder gibt es das gleiche Ergebnis mit einem Pandas Datenrahmen? – denbjornen505

+1

@ denbjouren505: Dies ist eine * Python * Nuance; Namen sind * Label *, Referenzen auf ein Objekt. Sie können beliebig viele Beschriftungen an ein Objekt anhängen. –

+1

@ denbjouren505: siehe http://nedbatchelder.com/text/names.html für einen tollen Artikel und eine Präsentation darüber, wie Namen in Python funktionieren. –

Verwandte Themen