Kalman-Filter zur Minimierung des Entropiewertes eines zufĂ€lligen Fehlers mit einer nicht-Gaußschen Verteilung


EinfĂŒhrung


Bei Habr wurde in den folgenden Veröffentlichungen eine mathematische Beschreibung des Betriebs des Kalman-Filters und seiner Anwendungsmerkmale berĂŒcksichtigt [1 Ă· 10]. In der Veröffentlichung [2] wurde der Algorithmus des Kalman-Filters (FC) im Modell des „Zustandsraums“ in einer einfachen und verstĂ€ndlichen Form betrachtet. Es sollte beachtet werden, dass die Untersuchung von Steuerungs- und Managementsystemen im Zeitbereich unter Verwendung von Zustandsvariablen in letzter Zeit aufgrund der einfachen Analyse in großem Umfang verwendet wurde [11].

Die Veröffentlichung [8] ist speziell fĂŒr die Ausbildung von großem Interesse. Die methodische Technik des Autors ist sehr effektiv. Er begann seinen Artikel mit der Betrachtung der Verteilung des zufĂ€lligen Gaußschen Fehlers, berĂŒcksichtigte den FC-Algorithmus und endete mit einer einfachen iterativen Formel zur Auswahl der FC-VerstĂ€rkung. Der Autor beschrĂ€nkte sich auf eine Betrachtung der Gaußschen Verteilung unter Berufung auf die Tatsache, dass fĂŒr ausreichend große n (Mehrfachmessungen) Das Verteilungsgesetz der Summe der Zufallsvariablen tendiert zur Gaußschen Verteilung.

Theoretisch ist eine solche Aussage sicherlich richtig, aber in der Praxis kann die Anzahl der Messungen an jedem Punkt im Bereich nicht sehr groß sein. Kalman RE selbst erhielt Ergebnisse zur minimalen Kovarianz des Filters basierend auf orthogonalen Projektionen, ohne anzunehmen, dass die Messfehler Gaußsch sind [12].

Der Zweck dieser Veröffentlichung ist es, die FĂ€higkeiten des Kalman-Filters zu untersuchen, um den Entropiewert eines zufĂ€lligen Fehlers mit einer nicht-Gaußschen Verteilung zu minimieren.
Um die Wirksamkeit des Kalman-Filters bei der Identifizierung des Verteilungsgesetzes oder einer Überlagerung von Gesetzen aus experimentellen Daten zu bewerten, verwenden wir die Informationstheorie von Messungen, die auf der Informationstheorie von C. Shannon basieren, wonach Informationen wie eine physikalische GrĂ¶ĂŸe gemessen und bewertet werden können.

Der Hauptvorteil des Informationsansatzes zur Beschreibung von Messungen besteht darin, dass die GrĂ¶ĂŸe des Entropieintervalls der Unsicherheit fĂŒr jedes Verteilungsgesetz streng mathematisch ermittelt werden kann. Dies beseitigt die historisch entwickelte WillkĂŒr, die bei der freiwilligen Zuweisung verschiedener Werte der Konfidenzwahrscheinlichkeit unvermeidlich ist. Dies ist besonders wichtig im Bildungsprozess, wenn der SchĂŒler bei der Anwendung der Kalman-Filterung auf eine bestimmte numerische Stichprobe eine Abnahme der Messunsicherheit beobachten kann [13, 14].

DarĂŒber hinaus kann die Kombination der Wahrscheinlichkeits- und Informationseigenschaften der Stichprobe die Art der Verteilung des Zufallsfehlers genauer bestimmen. Dies wird durch eine umfangreiche Datenbank mit numerischen Werten von Parametern wie dem Entropiekoeffizienten und dem GegenĂŒberschuss fĂŒr verschiedene Verteilungsgesetze und deren Überlagerung erklĂ€rt.

Bewertung der Überlagerung der Verteilungsgesetze einer Zufallsvariablen durch den Entropiekoeffizienten und den GegenĂŒberschuss (erhalten aus experimentellen Daten)

Wahrscheinlichkeitsverteilungsdichte fĂŒr jede Spalte des Histogramms [14] breit d ist gleich p i ( x i ) = n i / ( n c d o t d )  daher ist die SchĂ€tzung der Entropiewahrscheinlichkeiten definiert als H left(x right)= int+ infty− inftyp left(x right) lnp left(x right)dx beim Finden der Entropie durch das Histogramm von m Spalten erhalten wir das VerhĂ€ltnis:

 displaystyleH left(x right)=− summi=1 int tildexi+ fracd2 tildexi− fracd2 fracnind ln fracnind= summi=1 fracnin ln fracnni+ lnd

Wir prÀsentieren den Ausdruck zur SchÀtzung der Entropie in folgender Form:

H left(x right)= ln left[d prodmi=1 left( fracnni right) fracnin right]

Wir erhalten einen Ausdruck zum SchÀtzen des Entropiewertes einer Zufallsvariablen:

 Deltae= frac12eH left(x right)= fracdn210− frac1n summ1ni lgni

Die Klassifizierung der Verteilungsgesetze erfolgt auf einer Ebene in den Koordinaten des Entropiekoeffizienten k= frac Deltae sigma und GegenĂŒberschuss  psi= frac sigma2 sqrt mu4 wo  mu4= frac1n sumn1 left(xi− barX right)4 .

FĂŒr alle möglichen Verteilungsgesetze variiert \ psi von 0 bis 1 und k von 0 bis 2,066, sodass jedes Gesetz durch einen bestimmten Punkt charakterisiert werden kann. Wir zeigen dies mit folgendem Programm:

Ebene der Verteilungsgesetze
import matplotlib.pyplot as plt from numpy import* from scipy.stats import * def graf(a):#  a.sort() n=len(a) m= int(10+sqrt(n)) d=(max(a)-min(a))/m x=[];y=[] for i in arange(0,m,1): x.append(min(a)+d*i) k=0 for j in a: if min(a)+d*i <=j<min(a)+d*(i+1): k=k+1 y.append(k) h=(1+0.5*m/n)*0.5*d*n*10**(-sum([w*log10(w) for w in y if w!=0])/n) k=h/std (a) mu4=sum ([(w-mean (a))**4 for w in a])/n psi=(std(a))**2/sqrt(mu4) return psi,k b=800#   plt.title('  ', size=12) plt.xlabel(' $\psi$', size=12) plt.ylabel('  k', size=12) a=uniform.rvs( size=b) psi,k,=graf(a) nr=" : k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) a=logistic.rvs( size=b) psi,k,=graf(a) nr=":k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) a=norm.rvs( size=b) psi,k,=graf(a) nr=" :K=%s,$\psi$i=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) a= erlang.rvs(4,size=b) psi,k,=graf(a) nr="  :k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k, 'o', label=nr) a= pareto.rvs(4,size=b) psi,k,=graf(a) nr=" :k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k, 'o', label=nr) a = cauchy.rvs(size=b) psi,k,=graf(a) nr=" :k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) c = 0.412 a = genlogistic.rvs(c, size=b) psi,k,=graf(a) nr=" -1:k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) mu=0.6 a = poisson.rvs(mu, size=b) psi,k,=graf(a) nr=":k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) a= laplace.rvs(size=b) psi,k,=graf(a) nr=":k=%s,$\psi$=%s "%(round(k,3),round(psi,3)) plt.plot(psi,k,'o', label=nr) plt.legend(loc='best') plt.grid() plt.show() 




In einer Ebene in Koordinaten k, psi aus dem Rest der Verteilungen entfernt, die Pareto, Cauchy-Verteilungen, obwohl sie zu verschiedenen Anwendungsgebieten gehören, das erste in der Physik und das zweite in der Wirtschaft. WĂ€hlen Sie zum Vergleich die normale Gaußsche Verteilung oben in der Klassifizierung. Alle folgenden Vergleiche werden an einer begrenzten Probe durchgefĂŒhrt und dienen dazu, die FĂ€higkeiten eines photonischen Kristalls am Beispiel einer numerischen Bestimmung des Entropiefehlers zu demonstrieren.

Auswahl eines Kalman-Filteralgorithmus


An jedem ausgewĂ€hlten Punkt im Messbereich werden mehrere Messungen durchgefĂŒhrt und deren Ergebnis mit einer Messung verglichen, die FC „nicht kennt“. Daher sollten Sie einen FC auswĂ€hlen, z. B. Kalman-Filter, um eine Konstante zu schĂ€tzen [16]. Ich bevorzuge jedoch Python und habe mich fĂŒr die Option [16] mit umfangreicher Dokumentation entschieden. Ich werde eine Beschreibung des Algorithmus geben:

Da die Konstante immer ein Modell des Systems ist, kann dargestellt werden als:

xk=xk−1+wk , (1)

FĂŒr das Modell degeneriert die Übergangsmatrix zu Eins und die Kontrollmatrix zu Null. Das Messmodell hat die Form:

yk=yk−1+vk , (2)

FĂŒr Modell (2) wird die Messmatrix in Einheit und die Kovarianzmatrix konvertiert P,Q,R in Dispersionen verwandeln. Am nĂ€chsten k -th Schritt, bevor die Messergebnisse eintreffen, versucht der Kalman-Skalarfilter, den neuen Zustand des Systems unter Verwendung der Formel (1) zu bewerten:

 hatxk/(k−1)= hatx(k−1)/(k−1) , (3)

Gleichung (3) zeigt, dass die A-priori-SchÀtzung im nÀchsten Schritt gleich der im vorherigen Schritt vorgenommenen posterioren SchÀtzung ist. A-priori-SchÀtzung der Varianz des Fehlers:

Pk/(k−1)=P(k−1)/(k−1)+Qk , (4)

Nach a priori staatlicher EinschĂ€tzung  hatxk/(k−1) Es ist möglich, die Messprognose zu berechnen:

 hatyk= hatxk/(k−1) , (5)

Nach der nÀchsten Messung wird empfangen yk Der Filter berechnet den Fehler seiner Prognose k th Messung:

ek=yk− hatyk=yk− hatxk/(k−1) , (6)

Der Filter passt seine Bewertung des Systemzustands an und wĂ€hlt einen Punkt aus, der irgendwo zwischen der anfĂ€nglichen Bewertung liegt  hatxk/(k−1) und der Punkt, der der neuen Dimension entspricht yk ::

ek=yk− hatyk=yk− hatxk/(k−1) , (7)

wo Gk - FilterverstÀrkung.

Die FehlervarianzschÀtzung wird ebenfalls korrigiert:

Pk/(k)=(1−Gk) cdotPk/(k−1) , (8)

Es kann nachgewiesen werden, dass die Varianz des Fehlers ek ist gleich:

Sk=Pk/(k−1)+Rk , (9)

Die VerstÀrkung des Filters, bei der der minimale Fehler bei der Beurteilung des Systemzustands erreicht wird, wird aus der Beziehung bestimmt

Gk=Pk/(k−1)/Sk , (10)

FC-Entropiefehlerminimierung fĂŒr Rauschen mit Cauchy-, Pareto- und Gauß-Verteilung

1. In der Wahrscheinlichkeitstheorie wird die Cauchy-Verteilungsdichte aus der Beziehung bestimmt:

f(x)= fracb pi cdot(1−x2)

FĂŒr diese Verteilung ist es unmöglich, den Fehler mit Methoden der Wahrscheinlichkeitstheorie abzuschĂ€tzen (  sigma= infty ), aber die Informationstheorie erlaubt Ihnen dies:

Programm zur Minimierung des FC-Entropiefehlers durch Cauchy-Rauschen
 from numpy import * import matplotlib.pyplot as plt from scipy.stats import * def graf(a):#      a.sort() n=len(a) m= int(10+sqrt(n)) d=(max(a)-min(a))/m x=[];y=[] for i in arange(0,m,1): x.append(min(a)+d*i) k=0 for j in a: if min(a)+d*i <=j<min(a)+d*(i+1): k=k+1 y.append(k) h=(1+0.5*m/n)*0.5*d*n*10**(-sum([w*log10(w) for w in y if w!=0])/n) return h def Kalman(a,x,sz,R1): R = R1*R1 #  Q = 1e-5 #       #    : xest1 = zeros(sz) #    xest2 = zeros(sz) #    P1 = zeros(sz) #    P2 = zeros(sz) #    G = zeros(sz) #    xest2[0] = 0.0 P2[0] = 1.0 for k in arange(1, sz): #    . xest1[k] = xest2[k-1] #   . P1[k] = P2[k-1] + Q#   . #         : G[k] = P1[k] / ( P1[k] + R ) xest2[k] = xest1[k] + G[k] * ( a[k] - xest1[k] ) P2[k] = (1 - G[k]) * P1[k] return xest2,P1 nr="  " x =2#      ) R1 = 0.1 #  .  .   . sz = 50 #  . a = cauchy.rvs(x, R1, size=sz) xest2,P1=Kalman(a,x,sz,R1) plt.plot(a, 'k+', label=' ') plt.plot(xest2,'b-', label=' ') plt.axhline(x, color='g', label=' ') plt.axis([0, sz,-x, 2*x]) plt.legend() plt.xlabel(' ') plt.ylabel(u' ') h1=graf(a) h2=graf(xest2) plt.title('   %s.\n     $\Delta $1=%s   $\Delta $2=%s '%(nr,round(h1,3),round(h2,3)), size=12) plt.grid() plt.show() 




Der Typ des Diagramms kann sich sowohl beim Neustart des Programms (neue Generation der Verteilungsprobe) als auch in AbhĂ€ngigkeit von der Anzahl der Messungen und Verteilungsparameter Ă€ndern, bleibt jedoch unverĂ€ndert. Der FC minimiert den Wert des Entropiefehlers, der auf der Grundlage der Informationstheorie der Messungen berechnet wird. FĂŒr den gegebenen Graphen reduziert FC den Entropiefehler um das 3,9-fache.

2. In der Wahrscheinlichkeitstheorie die Pareto-Verteilungsdichte mit Parametern xm und k bestimmt aus dem VerhÀltnis:

f_ {X} (x) = \ left \ {\ begin {matrix} \ frac {kx_ {k} ^ {m}} {x ^ {k + 1}}, & x \ geq x_ {m} \\ 0, & x <x_ {m} \ end {matrix} \ right.



Es ist zu beachten, dass die Pareto-Verteilung nicht nur in der Wirtschaft zu finden ist. Sie können das folgende Beispiel fĂŒr die Verteilung der DateigrĂ¶ĂŸe im Internetverkehr ĂŒber das TCP-Protokoll geben.

3. In der Wahrscheinlichkeitstheorie die Dichte der Normalverteilung (Gauß) mit mathematischer Erwartung  mu und Standardabweichung  sigma bestimmt aus dem VerhĂ€ltnis:

f(x)= frac1 sigma sqrt2 pi cdote− frac(x− mu)22 sigma2

Die Bestimmung der Minimierung des FC-Entropiefehlers aus Rauschen mit einer Gaußschen Verteilung wird zum Vergleich mit nicht-Gaußschen Cauchy- und Pareto-Verteilungen angegeben.

Programm zur Minimierung des FC-Entropiefehlers durch Normalverteilungsrauschen
 from numpy import * import matplotlib.pyplot as plt from scipy.stats import * def graf(a):#      a.sort() n=len(a) m= int(10+sqrt(n)) d=(max(a)-min(a))/m x=[];y=[] for i in arange(0,m,1): x.append(min(a)+d*i) k=0 for j in a: if min(a)+d*i <=j<min(a)+d*(i+1): k=k+1 y.append(k) h=(1+0.5*m/n)*0.5*d*n*10**(-sum([w*log10(w) for w in y if w!=0])/n) return h def Kalman(a,x,sz,R1): R = R1*R1 #  Q = 1e-5 #       #    : xest1 = zeros(sz) #    xest2 = zeros(sz) #    P1 = zeros(sz) #    P2 = zeros(sz) #    G = zeros(sz) #    xest2[0] = 0.0 P2[0] = 1.0 for k in arange(1, sz): #    . xest1[k] = xest2[k-1] #   . P1[k] = P2[k-1] + Q#   . #         : G[k] = P1[k] / ( P1[k] + R ) xest2[k] = xest1[k] + G[k] * ( a[k] - xest1[k] ) P2[k] = (1 - G[k]) * P1[k] return xest2,P1 nr="  " x =2#      ) R1 = 0.1 #  .  .   . sz = 50 #  . a=norm.rvs( x, R1, size=sz) xest2,P1=Kalman(a,x,sz,R1) plt.plot(a, 'k+', label=' ') plt.plot(xest2,'b-', label=' ') plt.axhline(x, color='g', label=' ') plt.axis([0, sz,-x, 2*x]) plt.legend() plt.xlabel(' ') plt.ylabel(u' ') h1=graf(a) h2=graf(xest2) plt.title('   %s.\n     $\Delta $1=%s   $\Delta $2=%s '%(nr,round(h1,3),round(h2,3)), size=12) plt.grid() plt.show() 




Die Gaußsche Verteilung bietet eine höhere StabilitĂ€t des Ergebnisses fĂŒr 50 Messungen, und fĂŒr das gezeigte Diagramm nimmt der Entropiefehler um das 2,2-fache ab.

Minimierung des FC-Entropiefehlers aus einer Stichprobe experimenteller Daten mit einem unbekannten Rauschverteilungsgesetz

Programm zur Minimierung des FC-Entropiefehlers einer begrenzten Stichprobe experimenteller Daten
 from numpy import * import matplotlib.pyplot as plt from scipy.stats import * def graf(a):#      a.sort() n=len(a) m= int(10+sqrt(n)) d=(max(a)-min(a))/m x=[];y=[] for i in arange(0,m,1): x.append(min(a)+d*i) k=0 for j in a: if min(a)+d*i <=j<min(a)+d*(i+1): k=k+1 y.append(k) h=(1+0.5*m/n)*0.5*d*n*10**(-sum([w*log10(w) for w in y if w!=0])/n) k=h/std (a) mu4=sum ([(w-mean (a))**4 for w in a])/n psi=(std(a))**2/sqrt(mu4) return h def Kalman(a,x,sz,R1): R = R1*R1 #  Q = 1e-5 #       #    : xest1 = zeros(sz) #    xest2 = zeros(sz) #    P1 = zeros(sz) #    P2 = zeros(sz) #    G = zeros(sz) #    xest2[0] = 0.0 P2[0] = 1.0 for k in arange(1, sz): #    . xest1[k] = xest2[k-1] #   . P1[k] = P2[k-1] + Q#   . #         : G[k] = P1[k] / ( P1[k] + R ) xest2[k] = xest1[k] + G[k] * ( a[k] - xest1[k] ) P2[k] = (1 - G[k]) * P1[k] return xest2,P1 R1 = 0.9 #  .  .   . a=[ 0.203, 0.154, 0.172, 0.192, 0.233, 0.181, 0.219, 0.153, 0.168, 0.132, 0.204, 0.165, 0.197, 0.205, 0.143, 0.201, 0.168, 0.147, 0.208, 0.195, 0.153, 0.193, 0.178, 0.162, 0.157, 0.228, 0.219, 0.125, 0.101, 0.211,0.183, 0.147, 0.145, 0.181,0.184, 0.139, 0.198, 0.185, 0.202, 0.238, 0.167, 0.204, 0.195, 0.172, 0.196, 0.178, 0.213, 0.175, 0.194, 0.178, 0.135, 0.178, 0.118, 0.186, 0.191] sz = len(a) #   x =0.179#      ) xest2,P1=Kalman(a,x,sz,R1) plt.plot(a, 'k+', label=' ') plt.plot(xest2,'b-', label=' ') plt.axhline(x, color='g', label=' ') plt.axis([0, sz,-x, 2*x]) plt.legend() plt.xlabel(' ') plt.ylabel(' ') h1=graf(a) nr="  " h2=graf(xest2) plt.title('   %s \n     $\Delta $1=%s   $\Delta $2=%s '%(nr,round(h1,3),round(h2,3)), size=12) plt.grid() plt.show() 




Bei der Analyse einer Stichprobe experimenteller Daten erhalten wir stabile Ergebnisse zur Minimierung des FC-Entropiefehlers. FĂŒr dieses Beispiel reduziert der FC den Entropiefehler um das 4,85-fache.

Fazit


Alle Vergleiche in diesem Artikel wurden an begrenzten Datenstichproben durchgefĂŒhrt. Daher sollten grundlegende Schlussfolgerungen unterlassen werden. Die Verwendung von Entropiefehlern ermöglicht es uns jedoch, die Wirksamkeit des Kalman-Filters in der gegebenen Implementierung zu quantifizieren. Daher kann die Trainingsaufgabe dieses Artikels als abgeschlossen betrachtet werden.

Source: https://habr.com/ru/post/de438050/


All Articles