Kalmana filtra izmantošana, lai filtrētu no sensoriem saņemtās vērtības. Kalmana filtrēšana Optimālais Kalmana filtrs

Internetā, tostarp Habré, jūs varat atrast daudz informācijas par Kalman filtru. Bet ir grūti atrast viegli sagremojamu pašu formulu atvasinājumu. Bez secinājuma visa šī zinātne tiek uztverta kā sava veida šamanisms, formulas izskatās kā bezsejas simbolu kopums, un pats galvenais, daudzi vienkārši apgalvojumi, kas atrodas uz teorijas virsmas, ir nesaprotami. Šī raksta mērķis būs runāt par šo filtru vispieejamākajā valodā.
Kalmana filtrs ir spēcīgs datu filtrēšanas rīks. Tās galvenais princips ir tāds, ka filtrējot tiek izmantota informācija par pašas parādības fiziku. Pieņemsim, ja jūs filtrējat datus no automašīnas spidometra, tad automašīnas inerce dod jums tiesības uztvert pārāk ātrus ātruma lēcienus kā mērījumu kļūdu. Kalmana filtrs ir interesants, jo savā ziņā tas ir labākais filtrs. Tālāk mēs sīkāk apspriedīsim, ko īsti nozīmē vārdi “labākais”. Raksta beigās parādīšu, ka daudzos gadījumos formulas var vienkāršot tiktāl, ka no tām gandrīz nekas nepaliek.

Likbez

Pirms iepazīšanās ar Kalmana filtru, es ierosinu atgādināt dažas vienkāršas definīcijas un faktus no varbūtību teorijas.

Izlases vērtība

Kad viņi saka, ka ir dots nejaušs mainīgais, viņi nozīmē, ka šis mainīgais var iegūt nejaušas vērtības. Tas iegūst dažādas vērtības ar dažādām varbūtībām. Kad tu met, teiksim, kauliņu, izkritīs diskrēts vērtību kopums: . Runājot, piemēram, par klejojošas daļiņas ātrumu, tad, acīmredzot, ir jātiek galā ar nepārtrauktu vērtību kopu. Gadījuma lieluma “izkritušās” vērtības tiks apzīmētas ar , bet dažreiz mēs izmantosim to pašu burtu, kas apzīmē nejaušo mainīgo: .
Nepārtrauktas vērtību kopas gadījumā nejaušo lielumu raksturo varbūtības blīvums , kas mums nosaka, ka varbūtība, ka nejaušais mainīgais "izkrīt" nelielā garuma punkta apkārtnē, ir vienāda ar . Kā redzams no attēla, šī varbūtība ir vienāda ar ēnotā taisnstūra laukumu zem diagrammas:

Diezgan bieži dzīvē nejaušie lielumi tiek sadalīti pēc Gausa, kad varbūtības blīvums ir .

Mēs redzam, ka funkcijai ir zvana forma, kuras centrā ir punkts un kuras raksturīgs platums ir .
Tā kā mēs runājam par Gausa sadalījumu, būtu grēks nepieminēt, no kurienes tas cēlies. Tāpat kā skaitļi ir stingri nostiprinājušies matemātikā un parādās visnegaidītākajās vietās, tā arī Gausa sadalījums ir ieņēmis dziļas saknes varbūtību teorijā. Viens ievērojams apgalvojums, kas daļēji izskaidro Gausa visuresamību, ir šāds:
Lai ir nejaušs mainīgais ar patvaļīgu sadalījumu (patiesībā šai patvaļai ir daži ierobežojumi, taču tie nebūt nav stingri). Veiksim eksperimentus un aprēķināsim nejauša lieluma "izkritušo" vērtību summu. Veiksim daudz šādu eksperimentu. Skaidrs, ka katru reizi saņemsim citu summas vērtību. Citiem vārdiem sakot, šī summa pati par sevi ir nejaušs lielums ar savu noteiktu sadalījuma likumu. Izrādās, ka pietiekami lielam šīs summas sadalījuma likums tiecas uz Gausa sadalījumu (starp citu, “zvaniņam” raksturīgais platums pieaug par ). Lasiet vairāk wikipedia: centrālās robežu teorēma. Dzīvē ļoti bieži ir daudzumi, kas sastāv no liela skaita vienādi sadalītu neatkarīgu gadījuma lielumu, un tāpēc tiek sadalīti saskaņā ar Gausu.

Vidēji

Gadījuma lieluma vidējā vērtība ir tā, ko mēs iegūstam robežās, ja veicam daudz eksperimentu un aprēķinām kritušo vērtību vidējo aritmētisko. Vidējā vērtība tiek apzīmēta dažādos veidos: matemātiķiem patīk apzīmēt ar (cerība), bet ārzemju matemātiķiem - ar (cerība). Fizika pats caur vai. Mēs norādīsim svešā veidā:.
Piemēram, Gausa sadalījumam vidējais ir .

Izkliede

Gausa sadalījuma gadījumā mēs varam skaidri redzēt, ka nejaušais mainīgais dod priekšroku izkrist kādā tā vidējās vērtības tuvumā. Kā redzams no grafika, secības vērtību raksturīgā izkliede ir . Kā mēs varam novērtēt šo vērtību izplatību patvaļīgam gadījuma mainīgajam, ja mēs zinām tā sadalījumu. Varat uzzīmēt tā varbūtības blīvuma grafiku un ar aci novērtēt raksturīgo platumu. Bet mēs dodam priekšroku algebriskajam ceļam. Jūs varat atrast vidējo novirzes garumu (moduli) no vidējās vērtības: . Šī vērtība būs labs vērtību raksturīgās izplatības novērtējums. Bet jūs un es ļoti labi zinām, ka moduļu izmantošana formulās ir galvassāpes, tāpēc šī formula tiek reti izmantota, lai novērtētu raksturīgo izplatību.
Vienkāršāks veids (vienkāršs aprēķinu ziņā) ir atrast . Šo lielumu sauc par dispersiju un bieži dēvē par . Dispersijas sakni sauc par standarta novirzi. Standarta novirze ir labs nejaušā mainīgā lieluma izplatības novērtējums.
Piemēram, Gausa sadalījumam mēs varam pieņemt, ka iepriekš definētā dispersija ir precīzi vienāda ar , kas nozīmē, ka standarta novirze ir vienāda ar , kas ļoti labi saskan ar mūsu ģeometrisko intuīciju.
Patiesībā šeit ir paslēpta neliela krāpniecība. Fakts ir tāds, ka Gausa sadalījuma definīcijā zem eksponenta ir izteiksme . Šie divi saucējā ir tieši tā, lai standartnovirze būtu vienāda ar koeficientu. Tas ir, pati Gausa sadalījuma formula ir uzrakstīta formā, kas ir īpaši asināta, lai mēs apsvērtu tās standarta novirzi.

Neatkarīgi nejauši mainīgie

Nejaušie mainīgie var būt vai nebūt atkarīgi. Iedomājieties, ka jūs iemetat adatu plaknē un pierakstiet abu tās galu koordinātas. Šīs divas koordinātas ir atkarīgas, tās savieno ar nosacījumu, ka attālums starp tām vienmēr ir vienāds ar adatas garumu, lai gan tie ir nejauši mainīgie.
Gadījuma mainīgie ir neatkarīgi, ja pirmā iznākums ir pilnīgi neatkarīgs no otrā iznākuma. Ja nejaušie mainīgie un ir neatkarīgi, tad to reizinājuma vidējā vērtība ir vienāda ar to vidējo vērtību reizinājumu:

Pierādījums

Piemēram, zilas acis un skolas beigšana ar zelta medaļu ir neatkarīgi nejauši mainīgie. Ja zilacaini, teiksim zelta medaļnieki , tad zilacu medaļnieki Šis piemērs stāsta, ka, ja nejaušie mainīgie un ir doti ar to varbūtības blīvumu un , tad šo lielumu neatkarība tiek izteikta ar to, ka varbūtības blīvums (pirmais vērtība izkrita , bet otrā ) tiek atrasta pēc formulas:

No tā uzreiz izriet, ka:

Kā redzat, pierādīšana tiek veikta nejaušiem mainīgajiem, kuriem ir nepārtraukts vērtību spektrs un ko nosaka to varbūtības blīvums. Citos gadījumos pierādījuma ideja ir līdzīga.

Kalmana filtrs

Problēmas formulēšana

Apzīmē ar vērtību, kuru mēs izmērīsim un pēc tam filtrēsim. Tas var būt koordinātas, ātrums, paātrinājums, mitrums, smakas pakāpe, temperatūra, spiediens utt.
Sāksim ar vienkāršu piemēru, kas novedīs pie vispārīgas problēmas formulējuma. Iedomājieties, ka mums ir radiovadāma automašīna, kas var braukt tikai uz priekšu un atpakaļ. Mēs, zinot automašīnas svaru, formu, ceļa segumu utt., aprēķinājām, kā vadības kursorsvira ietekmē kustības ātrumu.

Tad mašīnas koordinātas mainīsies saskaņā ar likumu:

Reālajā dzīvē mēs nevaram savos aprēķinos ņemt vērā nelielus traucējumus, kas iedarbojas uz automašīnu (vējš, nelīdzenumi, oļi uz ceļa), tāpēc reālais automašīnas ātrums atšķirsies no aprēķinātā. Uzrakstītā vienādojuma labajā pusē tiek pievienots nejaušs mainīgais:

Mums uz mašīnas ir uzstādīts GPS sensors, kas mēģina izmērīt patieso mašīnas koordinātu, un, protams, nevar precīzi izmērīt, bet mēra ar kļūdu, kas arī ir nejaušs lielums. Rezultātā mēs saņemam kļūdainus datus no sensora:

Problēma ir tāda, ka, zinot nepareizos sensora rādījumus, atrodiet labu mašīnas patiesās koordinātas tuvinājumu.
Vispārējās problēmas formulējumā par koordinātu var būt atbildīgs jebkas (temperatūra, mitrums ...), un terminu, kas atbild par sistēmas vadību no ārpuses, mēs apzīmēsim kā (piemērā ar mašīnu). Koordinātu un sensoru rādījumu vienādojumi izskatīsies šādi:

Sīkāk apspriedīsim to, ko mēs zinām:

Ir lietderīgi atzīmēt, ka filtrēšanas uzdevums nav izlīdzināšanas uzdevums. Mūsu mērķis nav izlīdzināt datus no sensora, mūsu mērķis ir iegūt vistuvāko vērtību reālajai koordinātei.

Kalmana algoritms

Mēs spriedīsim ar indukciju. Iedomājieties, ka --tajā solī mēs jau esam atraduši sensora filtrēto vērtību, kas labi tuvina sistēmas patieso koordinātu. Neaizmirstiet, ka mēs zinām vienādojumu, kas kontrolē nezināmas koordinātas izmaiņas:

tādēļ, vēl nesaņemot vērtību no sensora, mēs varam pieņemt, ka solī sistēma attīstās saskaņā ar šo likumu un sensors rādīs kaut ko tuvu . Diemžēl neko precīzāku vēl nevaram pateikt. No otras puses, mūsu rokās būs neprecīzs sensora rādījums.
Kalmana ideja ir šāda. Lai iegūtu vislabāko tuvinājumu patiesajai koordinātei, mums ir jāizvēlas vidusceļš starp neprecīzo sensora nolasījumu un mūsu prognozēm par to, ko mēs gaidījām. Sensora rādījumam piešķirsim svaru, un paredzamajai vērtībai būs svars:

Koeficientu sauc par Kalmana koeficientu. Tas ir atkarīgs no iterācijas soļa, tāpēc pareizāk būtu rakstīt , bet pagaidām, lai nepārblīvētu aprēķinu formulas, tā indeksu izlaidīsim.
Mums ir jāizvēlas Kalmana koeficients tā, lai iegūtā koordinātas optimālā vērtība būtu vistuvāk patiesajai vērtībai. Piemēram, ja mēs zinām, ka mūsu sensors ir ļoti precīzs, mēs vairāk uzticēsimies tā rādījumam un piešķirsim vērtībai lielāku nozīmi (tuvu vienam). Ja sensors, gluži pretēji, nav precīzs, mēs vairāk koncentrēsimies uz teorētiski prognozēto vērtību.
Kopumā, lai atrastu precīzu Kalmana koeficienta vērtību, vienkārši jāsamazina kļūda:

Mēs izmantojam vienādojumus (1) (tos, kas atrodas zilajā lodziņā), lai pārrakstītu kļūdas izteiksmi:

Pierādījums

Tagad ir pienācis laiks apspriest, ko nozīmē izteiciens samazināt kļūdu? Galu galā kļūda, kā mēs redzam, pati par sevi ir nejaušs mainīgais un katru reizi iegūst dažādas vērtības. Patiešām nav universālas pieejas, lai definētu, ko nozīmē, ka kļūda ir minimāla. Tāpat kā gadījuma lieluma dispersijas gadījumā, kad mēģinājām novērtēt tā izkliedes raksturīgo platumu, arī šeit aprēķiniem izvēlēsimies vienkāršāko kritēriju. Mēs samazināsim vidējo no kļūdas kvadrātā:

Uzrakstīsim pēdējo izteiksmi:

Pierādījums

No tā, ka visi gadījuma mainīgie, kas iekļauti izteiksmē, ir neatkarīgi, izriet, ka visi "krustu" termini ir vienādi ar nulli:

Mēs izmantojām faktu, ka , tad dispersijas formula izskatās daudz vienkāršāka: .

Šī izteiksme iegūst minimālo vērtību, ja (atvasinājumu pielīdzināt nullei):

Šeit jau rakstām izteiksmi Kalmana koeficientam ar soļu indeksu , tāpēc uzsveram, ka tas ir atkarīgs no iterācijas soļa.
Mēs aizvietojam iegūto optimālo vērtību izteiksmē, kurai esam minimizējuši. Mēs saņemam;

Mūsu uzdevums ir atrisināts. Esam ieguvuši iteratīvu formulu Kalmana koeficienta aprēķināšanai.
Apkoposim savas iegūtās zināšanas vienā rāmī:

Piemērs

Matlab kods

nodzēst visu; N=100% paraugu skaits a=0,1% paātrinājums sigmaPsi=1 sigmaEta=50; k=1:N x=k x(1)=0 z(1)=x(1)+normrnd(0,sigmaEta); ja t=1:(N-1) x(t+1)=x(t)+a*t+normrnd(0,sigmaPsi); z(t+1)=x(t+1)+normrnd(0,sigmaEta); beigas; %kalman filtrs xOpt(1)=z(1); eOpt(1)=sigmaEta; ja t=1:(N-1) eOpt(t+1)=sqrt((sigmaEta^2)*(eOpt(t)^2+sigmaPsi^2)/(sigmaEta^2+eOpt(t)^2+ sigmaPsi^2)) K(t+1)=(eOpt(t+1))^2/sigmaEta^2 xOpt(t+1)=(xOpt(t)+a*t)*(1-K(t) +1))+K(t+1)*z(t+1) beigas; plot(k,xopt,k,z,k,x)

Analīze

Ja mēs izsekojam, kā Kalmana koeficients mainās ar iterācijas soli, tad mēs varam parādīt, ka tas vienmēr stabilizējas līdz noteiktai vērtībai. Piemēram, ja sensora un modeļa RMS kļūdas ir saistītas viena ar otru kā desmit pret vienu, tad Kalmana koeficienta diagramma atkarībā no iterācijas soļa izskatās šādi:

Nākamajā piemērā mēs apspriedīsim, kā tas var ievērojami atvieglot mūsu dzīvi.

Otrais piemērs

Praksē bieži gadās, ka mēs vispār neko nezinām par filtrējamā fizisko modeli. Piemēram, vēlaties filtrēt rādījumus no sava iecienītākā akselerometra. Jūs iepriekš nezināt, ar kādu likumu jūs plānojat pagriezt akselerometru. Lielākā daļa informācijas, ko varat iegūt, ir sensora kļūdu dispersija. Šādā sarežģītā situācijā visa nezināšana par kustības modeli var tikt novirzīta nejaušā mainīgā:

Bet, atklāti sakot, šāda sistēma vairs neatbilst nosacījumiem, ko mēs uzlikām nejaušajam mainīgajam , jo tagad visa mums nezināmā kustības fizika ir tur paslēpta, un tāpēc nevar teikt, ka dažādos laika punktos kļūdas modeļi ir neatkarīgi viens no otra un to vidējās vērtības ir nulle. Šajā gadījumā Kalmana filtra teorija kopumā nav piemērojama. Bet, mēs nepievērsīsim uzmanību šim faktam, bet, mēs stulbi pielietosim visu formulu kolosu, izvēloties koeficientus un pēc acs, lai filtrētie dati izskatās skaisti.
Bet ir vēl viens, daudz vienkāršāks veids, kā iet. Kā redzējām iepriekš, Kalmana koeficients vienmēr stabilizējas līdz vērtībai . Tāpēc tā vietā, lai atlasītu koeficientus un atrastu Kalmana koeficientu, izmantojot sarežģītas formulas, mēs varam uzskatīt, ka šis koeficients vienmēr ir konstante, un izvēlēties tikai šo konstanti. Šis pieņēmums gandrīz neko nesabojās. Pirmkārt, mēs jau nelegāli lietojam Kalmana teoriju, otrkārt, Kalmana koeficients ātri nostabilizējas līdz konstantei. Galu galā viss būs ļoti vienkārši. Mums vispār nav vajadzīgas nekādas Kalmana teorijas formulas, mums vienkārši jāizvēlas pieņemama vērtība un jāievieto iteratīvajā formulā:

Nākamajā diagrammā parādīti dati no fiktīva sensora, kas filtrēts divos dažādos veidos. Ar nosacījumu, ka mēs neko nezinām par fenomena fiziku. Pirmais veids ir godīgs, ar visām Kalmana teorijas formulām. Un otrais ir vienkāršots, bez formulām.

Kā redzam, metodes ir gandrīz vienādas. Neliela atšķirība vērojama tikai sākumā, kad Kalmana koeficients vēl nav nostabilizējies.

Diskusija

Kā mēs redzējām, Kalmana filtra galvenā ideja ir atrast tādu koeficientu, kas atbilst filtrētajai vērtībai

vidēji vismazāk atšķirtos no koordinātas reālās vērtības. Mēs redzam, ka filtrētā vērtība ir sensora nolasījuma un iepriekšējās filtrētās vērtības lineāra funkcija. Un iepriekšējā filtrētā vērtība, savukārt, ir sensora nolasījuma un iepriekšējās filtrētās vērtības lineāra funkcija. Un tā tālāk, līdz ķēde ir pilnībā atlocīta. Tas ir, filtrētā vērtība ir atkarīga no visi Iepriekšējie sensora rādījumi lineāri:

Tāpēc Kalmana filtru sauc par lineāro filtru.
Var pierādīt, ka Kalman filtrs ir labākais no visiem lineārajiem filtriem. Labākais tādā ziņā, ka filtra kļūdas vidējais kvadrāts ir minimāls.

Daudzfaktoru gadījums

Visu Kalmana filtra teoriju var vispārināt daudzdimensiju gadījumā. Tur esošās formulas izskatās nedaudz biedējošākas, taču pati ideja par to atvasināšanu ir tāda pati kā viendimensijas gadījumā. Jūs varat tos redzēt šajā lieliskajā rakstā: http://habrahabr.ru/post/140274/ .
Un šajā brīnišķīgajā video piemērs, kā tos izmantot.

Wiener filtri ir vislabāk piemēroti apstrādes procesiem vai procesu segmentiem kopumā (bloku apstrādei). Secīgai apstrādei ir nepieciešams signāla pašreizējais novērtējums katrā ciklā, ņemot vērā informāciju, kas saņemta filtra ieejā novērošanas procesa laikā.

Izmantojot Wiener filtrēšanu, katram jaunam signāla paraugam būtu jāpārrēķina visi filtra svari. Šobrīd plaši tiek izmantoti adaptīvie filtri, kuros ienākošā jaunā informācija tiek izmantota, lai nepārtraukti koriģētu iepriekš veikto signāla tāmi (mērķa izsekošana radarā, automātiskās vadības sistēmas vadībā u.c.). Īpaši interesanti ir adaptīvie rekursīvā tipa filtri, kas pazīstami kā Kalmana filtrs.

Šos filtrus plaši izmanto automātiskās regulēšanas un vadības sistēmu vadības cilpās. Tieši no turienes viņi nāca, par ko liecina tik specifiska terminoloģija, ko izmanto, aprakstot viņu darbu kā valsts telpu.

Viens no galvenajiem uzdevumiem, kas jāatrisina neironu skaitļošanas praksē, ir ātru un uzticamu neironu tīklu mācīšanās algoritmu iegūšana. Šajā sakarā var būt lietderīgi atgriezeniskās saites cilpā izmantot lineāro filtru mācīšanās algoritmu. Tā kā mācību algoritmi pēc būtības ir iteratīvi, šādam filtram ir jābūt secīgam rekursīvam novērtētājam.

Parametru novērtēšanas problēma

Viena no statistisko risinājumu teorijas problēmām, kam ir liela praktiska nozīme, ir sistēmu stāvokļa vektoru un parametru novērtēšanas problēma, kas formulēta šādi. Pieņemsim, ka ir nepieciešams novērtēt vektora parametra $X$ vērtību, kas nav pieejams tiešajiem mērījumiem. Tā vietā tiek mērīts cits parametrs $Z$ atkarībā no $X$. Novērtējuma uzdevums ir atbildēt uz jautājumu: ko var teikt par $X$, ņemot vērā $Z$. Vispārīgā gadījumā vektora $X$ optimālās novērtēšanas procedūra ir atkarīga no novērtējumam pieņemtā kvalitātes kritērija.

Piemēram, Bajesa pieeja parametru novērtēšanas problēmai prasa pilnīgu a priori informāciju par novērtētā parametra varbūtības īpašībām, kas bieži vien nav iespējams. Šajos gadījumos tiek izmantota mazāko kvadrātu metode (LSM), kas prasa daudz mazāk a priori informācijas.

Apskatīsim LSM pielietojumu gadījumam, kad novērojuma vektors $Z$ ir savienots ar parametra novērtējuma vektoru $X$ ar lineāro modeli un novērojumā ir troksnis $V$, kas nav korelēts ar novērtēto parametru. :

$Z = HX + V$, (1)

kur $H$ ir transformācijas matrica, kas apraksta saistību starp novērotajām vērtībām un aprēķinātajiem parametriem.

Aprēķins $X$, kas samazina kļūdu kvadrātā, tiek uzrakstīts šādi:

$X_(ots)=(H^TR_V^(-1)H)^(-1)H^TR_V^(-1)Z$, (2)

Ļaujiet troksnim $V$ būt nekorelētam, un tādā gadījumā matrica $R_V$ ir tikai identitātes matrica, un novērtējuma vienādojums kļūst vienkāršāks:

$X_(ots)=(H^TH)^(-1)H^TZ$, (3)

Ierakstīšana matricas formā ievērojami ietaupa papīru, taču kādam tas var būt neparasts. To visu ilustrē sekojošais piemērs, kas ņemts no Ju. M. Koršunova monogrāfijas "Kibernētikas matemātiskie pamati".
Ir šāda elektriskā ķēde:

Novērotās vērtības šajā gadījumā ir instrumenta rādījumi $A_1 ​​= 1 A, A_2 = 2 A, V = 20 B$.

Turklāt ir zināma pretestība $ R = 5 $ Ohm. No minimālās vidējās kvadrātiskās kļūdas kritērija viedokļa vislabākajā veidā ir jānovērtē strāvu $I_1$ un $I_2$ vērtības. Vissvarīgākais šeit ir tas, ka pastāv zināma saistība starp novērotajām vērtībām (instrumentu rādījumiem) un aprēķinātajiem parametriem. Un šī informācija tiek ienesta no ārpuses.

Šajā gadījumā tie ir Kirhhofa likumi, filtrēšanas gadījumā (kas tiks apspriests vēlāk) - autoregresīvs laikrindu modelis, kas pieņem, ka pašreizējā vērtība ir atkarīga no iepriekšējiem.

Tātad Kirhofa likumu zināšanas, kas nekādā veidā nav saistītas ar statistisko lēmumu teoriju, ļauj izveidot saikni starp novērotajām vērtībām un aprēķinātajiem parametriem (tie, kas studēja elektrotehniku, var pārbaudīt, pārējiem būs pieņem viņu vārdus):

$$z_1 = A_1 = I_1 + \xi_1 = 1 $$

$$z_2 = A_2 = I_1 + I_2 + \xi_2 = 2 $$

$$z_2 = V/R = I_1 + 2 * I_2 + \xi_3 = 4 $$

Tas ir vektora formā:

$$\begin(vmatrix) z_1\\ z_2\\ z_3 \end(vmatrix) = \begin(vmatrix) 1 & 0\\ 1 & 1\\ 1 & 2 \end(vmatrix) \begin(vmatrix) I_1\ \ I_2 \end(vmatrix) + \begin(vmatrix) \xi_1\\ \xi_2\\ \xi_3 \end(vmatrix)$$

Vai $Z = HX + V$, kur

$$Z= \begin(vmatrix) z_1\\ z_2\\ z_3 \end(vmatrix) = \begin(vmatrix) 1\\ 2\\ 4 \end(vmatrix) ; H= \begin(vmatrix) 1 & 0\\ 1 & 1\\ 1 & 2 \end(vmatrix) ; X= \begin(vmatrix) I_1\\ I_2 \end(vmatrix) ; V= \begin(vmatrix) \xi_1\\ \xi_2\\ \xi_3 \end(vmatrix)$$

Uzskatot, ka trokšņa vērtības nav savstarpēji saistītas, mēs atrodam I 1 un I 2 aprēķinus ar mazāko kvadrātu metodi saskaņā ar 3. formulu:

$H^TH= \begin(vmatrix) 1 & 1& 1\\ 0 & 1& 2 \end(vmatrix) \begin(vmatrix) 1 & 0\\ 1 & 1\\ 1 & 2 \end(vmatrix) = \ begin(vmatrix) 3 & 3\\ 3 & 5 \end(vmatrix) ; (H^TH)^(-1)= \frac(1)(6) \begin(vmatrix) 5 & -3\\ -3 & 3 \end(vmatrix) $;

$H^TZ= \begin(vmatrix) 1 & 1& 1\\ 0 & 1& 2 \end(vmatrix) \begin(vmatrix) 1 \\ 2\\ 4 \end(vmatrix) = \begin(vmatrix) 7\ \ 10 \end(vmatrix) ; X(vmatrix)= \frac(1)(6) \begin(vmatrix) 5 & -3\\ -3 & 3 \end(vmatrix) \begin(vmatrix) 7\\ 10 \end(vmatrix) = \frac (1) (6) \begin(vmatrix) 5\\ 9 \end(vmatrix)$;

Tātad $I_1 = 5/6 = 0,833 A$; I_2 $ = 9/6 = 1,5 A$.

Filtrēšanas uzdevums

Atšķirībā no uzdevuma novērtēt parametrus, kuriem ir fiksētas vērtības, filtrācijas uzdevumā ir nepieciešams novērtēt procesus, tas ir, atrast pašreizējās aplēses laikā mainīgam signālam, kas ir izkropļots ar troksni un līdz ar to nav pieejams tiešam mērījumam. Vispārīgā gadījumā filtrēšanas algoritmu veids ir atkarīgs no signāla un trokšņa statistiskajām īpašībām.

Mēs pieņemsim, ka noderīgais signāls ir lēni mainīga laika funkcija, un troksnis ir nekorelēts troksnis. Mēs izmantosim mazāko kvadrātu metodi, atkal tāpēc, ka trūkst a priori informācijas par signāla un trokšņa varbūtības raksturlielumiem.

Pirmkārt, mēs iegūstam pašreizējās vērtības $x_n$ aprēķinu, izmantojot pēdējās $k$ vērtības laikrindā $z_n, z_(n-1),z_(n-2)\dots z_(n-( k-1))$. Novērošanas modelis ir tāds pats kā parametru novērtēšanas uzdevumā:

Ir skaidrs, ka $Z$ ir kolonnas vektors, kas sastāv no novērotajām laikrindu vērtībām $z_n, z_(n-1),z_(n-2)\dots z_(n-(k-1)) $, $V $ – trokšņu kolonnas vektors $\xi _n, \xi _(n-1),\xi_(n-2)\dots \xi_(n-(k-1))$, kropļojot patieso signālu. Un ko nozīmē simboli $H$ un $X$? Par kādu kolonnu vektoru, piemēram, $X$, var runāt, ja ir tikai jāsniedz laika rindas pašreizējās vērtības novērtējums? Un kas ir domāts ar transformācijas matricu $H$, nemaz nav skaidrs.

Uz visiem šiem jautājumiem var atbildēt tikai tad, ja tiek ņemta vērā signāla ģenerēšanas modeļa koncepcija. Tas ir, ir nepieciešams kāds sākotnējā signāla modelis. Tas ir saprotams, jo nav a priori informācijas par signāla un trokšņa varbūtības raksturlielumiem, atliek tikai izdarīt pieņēmumus. To var saukt par zīlēšanu uz kafijas biezumiem, taču eksperti dod priekšroku citai terminoloģijai. Viņu matu žāvētājā to sauc par parametrisko modeli.

Šajā gadījumā tiek novērtēti šī modeļa parametri. Izvēloties piemērotu signālu ģenerēšanas modeli, atcerieties, ka Taylor sērijā var paplašināt jebkuru analītisko funkciju. Teilora sērijas pārsteidzoša īpašība ir tāda, ka funkcijas formu jebkurā ierobežotā attālumā $t$ no kāda punkta $x=a$ unikāli nosaka funkcijas darbība bezgalīgi mazā punkta $x=a apkārtnē. $ (mēs runājam par tā pirmās un augstākās kārtas atvasinājumiem).

Tādējādi Teilora sērijas esamība nozīmē, ka analītiskajai funkcijai ir iekšēja struktūra ar ļoti spēcīgu savienojumu. Ja, piemēram, aprobežojamies ar trim Teilora sērijas dalībniekiem, signāla ģenerēšanas modelis izskatīsies šādi:

$x_(n-i) = F_(-i)x_n$, (4)

$$X_n= \begin(vmatrix) x_n\\ x"_n\\ x""_n \end(vmatrix) ; F_(-i)= \begin(vmatrix) 1 & -i & i^2/2\\ 0 & 1 & -i\\ 0 & 0 & 1 \end(vmatrix) $$

Tas ir, formula 4 ar noteiktu polinoma secību (piemērā tas ir vienāds ar 2) izveido savienojumu starp signāla $n$-th vērtību laika secībā un $(ni)$-th. . Tādējādi aprēķinātais stāvokļa vektors šajā gadījumā papildus pašai aprēķinātajai vērtībai ietver signāla pirmo un otro atvasinājumu.

Automātiskās vadības teorijā šādu filtru varētu saukt par otrās kārtas astatisko filtru. Transformācijas matrica $H$ šim gadījumam (novērtēta pēc pašreizējiem un $k-1$ iepriekšējiem paraugiem) izskatās šādi:

$$H= \begin(vmatrix) 1 & -k & k^2/2\\ - & - & -\\ 1 & -2 & 2\\ 1 & -1 & 0.5\\ 1 & 0 & 0 \ end(vmatrix)$$

Visi šie skaitļi ir iegūti no Teilora sērijas, pieņemot, ka laika intervāls starp blakus esošajām novērotajām vērtībām ir nemainīgs un vienāds ar 1.

Tādējādi filtrēšanas problēma saskaņā ar mūsu pieņēmumiem ir samazināta līdz parametru novērtēšanas problēmai; šajā gadījumā tiek novērtēti mūsu pieņemtā signālu ģenerēšanas modeļa parametri. Un stāvokļa vektora $X$ vērtību novērtēšana tiek veikta saskaņā ar to pašu formulu 3:

$$X_(ots)=(H^TH)^(-1)H^TZ$$

Būtībā mēs esam ieviesuši parametru novērtēšanas procesu, kas balstīts uz signāla ģenerēšanas procesa autoregresīvo modeli.

Formula 3 ir viegli realizējama programmatūrā, šim nolūkam ir jāaizpilda matrica $H$ un novērojumu vektora kolonna $Z$. Tādus filtrus sauc ierobežotas atmiņas filtri, jo viņi izmanto pēdējos $k$ novērojumus, lai iegūtu pašreizējo novērtējumu $X_(not)$. Katrā jaunā novērojumu solī pašreizējai novērojumu kopai tiek pievienota jauna novērojumu kopa un vecais tiek atmests. Šo novērtēšanas procesu sauc bīdāms logs.

Pieaugošie atmiņas filtri

Filtriem ar ierobežotu atmiņu ir galvenais trūkums, ka pēc katra jauna novērojuma ir nepieciešams atkārtoti aprēķināt visu atmiņā saglabāto datu pilnīgu pārrēķinu. Turklāt aplēšu aprēķināšanu var sākt tikai pēc tam, kad ir uzkrāti pirmo $k$ novērojumu rezultāti. Tas nozīmē, ka šiem filtriem ir ilgs pārejas process.

Lai novērstu šo trūkumu, ir jāpāriet no filtra ar pastāvīgu atmiņu uz filtru ar augoša atmiņa. Šādā filtrā novērtējamo novēroto vērtību skaitam jāatbilst pašreizējā novērojuma skaitlim n. Tas ļauj iegūt aplēses, sākot no novērojumu skaita, kas vienāds ar aprēķinātā vektora $X$ komponentu skaitu. Un to nosaka pieņemtā modeļa secība, tas ir, cik termini no Teilora sērijas tiek izmantoti modelī.

Tajā pašā laikā, palielinoties n, uzlabojas filtra izlīdzināšanas īpašības, tas ir, palielinās aprēķinu precizitāte. Tomēr šīs pieejas tieša ieviešana ir saistīta ar skaitļošanas izmaksu pieaugumu. Tāpēc pieaugošie atmiņas filtri tiek ieviesti kā atkārtojas.

Lieta tāda, ka līdz laikam n mums jau ir aprēķins $X_((n-1)ots)$, kas satur informāciju par visiem iepriekšējiem novērojumiem $z_n, z_(n-1), z_(n-2) \dots z_ (n-(k-1))$. Aprēķins $X_(not)$ tiek iegūts ar nākamo novērojumu $z_n$, izmantojot aplēsē $X_((n-1))(\mbox (ot))$ saglabāto informāciju. Šo procedūru sauc par atkārtotu filtrēšanu, un tā sastāv no šādām darbībām:

  • saskaņā ar aprēķinu $X_((n-1))(\mbox (ots))$, aprēķins $X_n$ tiek prognozēts pēc formulas 4 $i = 1$: $X_(\mbox (noca priori)) = F_1X_((n-1 )ots)$. Šī ir a priori aplēse;
  • saskaņā ar pašreizējā novērojuma $z_n$ rezultātiem šis a priori novērtējums tiek pārvērsts par patiesu, tas ir, a posteriori;
  • šī procedūra tiek atkārtota katrā solī, sākot no $r+1$, kur $r$ ir filtru secība.

Galīgā rekursīvās filtrēšanas formula izskatās šādi:

$X_((n-1)ots) = X_(\mbox (nocapriori)) + (H^T_nH_n)^(-1)h^T_0(z_n - h_0 X_(\mbox (nocapriori)))$, (6 )

kur mūsu otrā pasūtījuma filtrs:

Pieaugošās atmiņas filtrs, kas darbojas saskaņā ar 6. formulu, ir īpašs filtrēšanas algoritma gadījums, kas pazīstams kā Kalmana filtrs.

Šīs formulas praktiskajā realizācijā jāatceras, ka tajā ietverto apriori vērtējumu nosaka formula 4, un vērtība $h_0 X_(\mbox (nocapriori))$ ir vektora $X_( \mbox (nocapriori))$.

Pieaugošajam atmiņas filtram ir viena svarīga iezīme. Aplūkojot 6. formulu, gala rezultāts ir prognozētā rezultāta vektora un korekcijas termiņa summa. Šī korekcija ir liela maziem $n$ un samazinās, palielinoties $n$, līdz nullei kā $n \rightarrow \infty$. Tas ir, pieaugot n, pieaug filtra izlīdzinošās īpašības un tajā iestrādātais modelis sāk dominēt. Bet reālais signāls modelim var atbilst tikai dažos apgabalos, tāpēc prognozes precizitāte pasliktinās.

Lai to apkarotu, sākot no kādiem $n$, tiek noteikts aizliegums turpmāk samazināt korekcijas termiņu. Tas ir līdzvērtīgs filtra joslas maiņai, tas ir, maziem n filtrs ir platjoslas (mazāk inerciāls), lielajam n tas kļūst inerciālāks.

Salīdziniet 1. un 2. attēlu. Pirmajā attēlā filtram ir liela atmiņa, kamēr tas labi nogludina, bet šaurās joslas dēļ aprēķinātā trajektorija atpaliek no reālās. Otrajā attēlā filtra atmiņa ir mazāka, sliktāk izlīdzinās, bet labāk izseko reālo trajektoriju.

Literatūra

  1. Ju.M.Koršunovs "Kibernētikas matemātiskie pamati"
  2. A.V.Balakrišnans "Kalmana filtrācijas teorija"
  3. V.N. Fomins "Atkārtota novērtēšana un adaptīvā filtrēšana"
  4. C.F.N. Kovens, P.M. Piešķirt "Adaptīvos filtrus"

Random Forest ir viens no maniem iecienītākajiem datu ieguves algoritmiem. Pirmkārt, tas ir neticami daudzpusīgs, to var izmantot gan regresijas, gan klasifikācijas problēmu risināšanai. Meklējiet anomālijas un atlasiet prognozētājus. Otrkārt, šis ir algoritms, kuru patiešām ir grūti nepareizi piemērot. Vienkārši tāpēc, ka atšķirībā no citiem algoritmiem tam ir maz pielāgojamu parametru. Un tomēr tas savā būtībā ir pārsteidzoši vienkāršs. Tajā pašā laikā tas ir ārkārtīgi precīzs.

Kāda ir šāda brīnišķīga algoritma ideja? Ideja ir vienkārša: pieņemsim, ka mums ir kāds ļoti vājš algoritms, teiksim . Ja mēs izveidosim daudz dažādu modeļu, izmantojot šo vājo algoritmu, un aprēķināsim vidējo to prognožu rezultātu, tad gala rezultāts būs daudz labāks. Šī ir tā sauktā ansambļa mācīšanās darbībā. Tāpēc Random Forest algoritmu sauc par "Random Forest", saņemtajiem datiem tas izveido daudzus lēmumu kokus un pēc tam nosaka to prognožu rezultātu vidējo vērtību. Svarīgs punkts šeit ir nejaušības elements katra koka izveidē. Galu galā ir skaidrs, ka, ja mēs izveidosim daudz identisku koku, tad to vidējā noteikšanas rezultāts būs viena koka precizitāte.

Kā viņš strādā? Pieņemsim, ka mums ir daži ievades dati. Katra kolonna atbilst kādam parametram, katra rinda atbilst kādam datu elementam.

Mēs varam pēc nejaušības principa izvēlēties vairākas kolonnas un rindas no visas datu kopas un no tām izveidot lēmumu koku.


Ceturtdiena, 2012. gada 10. maijs

Ceturtdiena, 2012. gada 12. janvāris


Tas patiesībā arī viss. 17 stundu lidojums beidzies, Krievija palikusi aizjūras. Un pa omulīgā 2 guļamistabu dzīvokļa logu Sanfrancisko uz mums skatās slavenā Silīcija ieleja, Kalifornija, ASV. Jā, tieši tāpēc pēdējā laikā neesmu daudz rakstījis. Mēs pārcēlāmies.

Viss sākās 2011. gada aprīlī, kad man bija telefonintervija ar Zynga. Tad tas viss likās kā kaut kāda spēle, kurai nebija nekāda sakara ar realitāti, un es pat nevarēju iedomāties, pie kā tas novedīs. 2011. gada jūnijā Zynga ieradās Maskavā un veica virkni interviju, tika izskatīti aptuveni 60 kandidāti, kuri izturēja telefona interviju, un no viņiem tika atlasīti aptuveni 15 cilvēki (nezinu precīzu skaitu, kāds vēlāk pārdomāja, kāds uzreiz atteicās). Intervija izrādījās pārsteidzoši vienkārša. Nekādu programmēšanas uzdevumu jums, nekādu sarežģītu jautājumu par lūku formu, galvenokārt tika pārbaudīta spēja tērzēt. Un zināšanas, manuprāt, tika vērtētas tikai virspusēji.

Un tad sākās strīds. Vispirms gaidījām rezultātus, tad piedāvājumu, tad LKA apstiprinājumu, tad vīzas pieteikuma apstiprināšanu, tad dokumentus no ASV, tad rinda pie vēstniecības, tad papildu pārbaude, tad vīza. Brīžiem man šķita, ka esmu gatavs visu nomest un gūt vārtus. Brīžiem šaubījos, vai mums vajag šo Ameriku, jo arī Krievija nav slikta. Viss process aizņēma apmēram pusgadu, beigās decembra vidū saņēmām vīzas un sākām gatavoties izbraukšanai.

Pirmdiena bija mana pirmā diena jaunajā darbā. Birojā ir visi apstākļi, lai ne tikai strādātu, bet arī dzīvotu. Brokastis, pusdienas un vakariņas mūsu pašu šefpavāri, daudzveidīga ēdiena gūzma visos stūros, trenažieru zāle, masāža un pat frizieris. Tas viss darbiniekiem ir pilnīgi bez maksas. Daudzi uz darbu nokļūst ar velosipēdu, un vairākas telpas ir aprīkotas transportlīdzekļu uzglabāšanai. Vispār neko tādu Krievijā neesmu redzējis. Visam tomēr ir sava cena, mūs uzreiz brīdināja, ka būs daudz jāstrādā. Kas ir "daudz", pēc viņu standartiem, man nav īsti skaidrs.

Ceru tomēr, ka, neskatoties uz darba apjomu, pārskatāmā nākotnē varēšu atsākt blogot un varbūt pastāstīt kaut ko par amerikāņu dzīvi un programmētāja darbu Amerikā. Gaidi un redzēsi. Tikmēr novēlu visiem priecīgus Ziemassvētkus un laimīgu Jauno gadu un tiekamies jau drīzumā!


Izmantošanas piemēram izdrukāsim Krievijas uzņēmumu dividenžu ienesīgumu. Par bāzes cenu mēs ņemam akcijas beigu cenu reģistra slēgšanas dienā. Kādu iemeslu dēļ šī informācija nav pieejama Troikas vietnē, un tā ir daudz interesantāka par dividenžu absolūtajām vērtībām.
Uzmanību! Koda izpildei nepieciešams ilgs laiks, jo par katru akciju vajag uztaisīt pieprasījumu finam serveriem un iegūt tā vērtību.

rezultāts<- NULL for(i in (1:length(divs[,1]))){ d <- divs if (d$Divs>0)( try(( pēdiņas<- getSymbols(d$Symbol, src="Finam", from="2010-01-01", auto.assign=FALSE) if (!is.nan(quotes)){ price <- Cl(quotes) if (length(price)>0)(dd<- d$Divs result <- rbind(result, data.frame(d$Symbol, d$Name, d$RegistryDate, as.numeric(dd)/as.numeric(price), stringsAsFactors=FALSE)) } } }, silent=TRUE) } } colnames(result) <- c("Symbol", "Name", "RegistryDate", "Divs") result


Tāpat varat veidot statistiku par pēdējiem gadiem.

Kalmana filtrs, iespējams, ir vispopulārākais filtrēšanas algoritms, ko izmanto daudzās zinātnes un tehnoloģiju jomās. Savas vienkāršības un efektivitātes dēļ to var atrast GPS uztvērējos, sensoru rādījumu procesoros, vadības sistēmu ieviešanā u.c.

Internetā ir ļoti daudz rakstu un grāmatu par Kalmana filtru (pārsvarā angļu valodā), bet šiem rakstiem ir diezgan liels ienākšanas slieksnis, ir daudz miglas vietas, lai gan patiesībā tas ir ļoti skaidrs un caurspīdīgs algoritms. Mēģināšu par to pastāstīt vienkāršā valodā, pakāpeniski palielinot sarežģītību.

Kam tas paredzēts?

Jebkurai mērierīcei ir kāda kļūda, to var ietekmēt liels skaits ārēju un iekšēju ietekmju, kas noved pie tā, ka informācija no tās izrādās trokšņaina. Jo trokšņaināki dati, jo grūtāk ir apstrādāt šādu informāciju.

Filtrs ir datu apstrādes algoritms, kas novērš troksni un nevajadzīgu informāciju. Kalmana filtrā ir iespējams iestatīt a priori informāciju par sistēmas būtību, mainīgo attiecību un, pamatojoties uz to, izveidot precīzāku tāmi, bet pat visvienkāršākajā gadījumā (bez a priori informācijas ievadīšanas) tas dod lieliskus rezultātus.

Apsveriet vienkāršāko piemēru - pieņemsim, ka mums jākontrolē degvielas līmenis tvertnē. Lai to izdarītu, tvertnē ir uzstādīts kapacitatīvs sensors, tas ir ļoti viegli kopjams, taču tam ir daži trūkumi - piemēram, atkarība no iepildāmās degvielas (degvielas dielektriskā konstante ir atkarīga no daudziem faktoriem, piemēram, no temperatūra), liela "pļāpāšanas" ietekme tvertnē. Rezultātā informācija no tā ir tipisks "zāģis" ar pienācīgu amplitūdu. Šādi sensori bieži tiek uzstādīti smagajās kalnrūpniecības iekārtās (nekautrējieties no tvertnes tilpuma):

Kalmana filtrs

Nedaudz novirzīsimies un iepazīsimies ar pašu algoritmu. Kalmana filtrs izmanto sistēmas dinamisko modeli (piemēram, kustības fizisko likumu), zināmās vadības darbības un secīgu mērījumu kopu, lai izveidotu optimālu stāvokļa novērtējumu. Algoritms sastāv no divām iteratīvām fāzēm: prognozēšanas un korekcijas. Pirmajā posmā tiek aprēķināta stāvokļa prognoze nākamajā laika brīdī (ņemot vērā to mērījumu neprecizitāti). Otrajā gadījumā jauna informācija no sensora koriģē paredzēto vērtību (ņemot vērā arī šīs informācijas neprecizitāti un troksni):

Vienādojumi ir uzrādīti matricas formā, ja nezināt lineāro algebru, neuztraucieties, gadījumam ar vienu mainīgo būs vienkāršota versija bez matricām. Viena mainīgā gadījumā matricas deģenerējas skalārās vērtībās.

Vispirms apskatīsim apzīmējumu: apakšindekss norāda laika punktu: k - pašreizējais, (k-1) - iepriekšējais, mīnusa zīme augšējā indeksā norāda, ka šis prognozēts starpvērtība.

Mainīgo lielumu apraksts ir parādīts šādos attēlos:

Var būt ilgi un nogurdinoši aprakstīt, ko nozīmē visas šīs noslēpumainās pārejas matricas, taču, manuprāt, labāk ir mēģināt pielietot algoritmu reālā piemērā - lai abstraktās vērtības iegūtu patiesu nozīmi.

Izmēģināsim to darbībā

Atgriezīsimies pie piemēra ar degvielas līmeņa sensoru, jo sistēmas stāvokli attēlo viens mainīgais (degvielas tilpums tvertnē), matricas deģenerējas parastajos vienādojumos:
Procesa modeļa definīcija
Lai izmantotu filtru, ir jānosaka mainīgo lielumu matricas/vērtības, kas nosaka sistēmas dinamiku un mērījumus F, B un H:

F- mainīgais, kas raksturo sistēmas dinamiku, degvielas gadījumā - tas var būt koeficients, kas nosaka degvielas patēriņu tukšgaitā paraugu ņemšanas laikā (laiks starp algoritma soļiem). Tomēr papildus degvielas patēriņam ir arī degvielas uzpildes stacijas ... tāpēc vienkāršības labad mēs ņemsim šo mainīgo, kas vienāds ar 1 (tas ir, mēs norādām, ka prognozētā vērtība būs vienāda ar iepriekšējo stāvokli).

B- mainīgais, kas nosaka kontroles darbības piemērošanu. Ja mums būtu papildus informācija par dzinēja apgriezieniem vai akseleratora pedāļa nospiešanas pakāpi, tad šis parametrs noteiktu, kā mainās degvielas patēriņš paraugu ņemšanas laikā. Tā kā mūsu modelī nav kontroles darbību (nav informācijas par tām), mēs pieņemam B = 0.

H- matrica, kas nosaka saistību starp mērījumiem un sistēmas stāvokli, pagaidām bez paskaidrojumiem pieņemsim arī šo mainīgo vienādu ar 1.

Izlīdzināšanas īpašību definīcija
R- mērījumu kļūdu var noteikt, pārbaudot mērinstrumentus un nosakot to mērījumu kļūdu.

J- Procesa trokšņa noteikšana ir grūtāks uzdevums, jo ir nepieciešams noteikt procesa dispersiju, kas ne vienmēr ir iespējams. Jebkurā gadījumā varat pielāgot šo parametru, lai nodrošinātu nepieciešamo filtrēšanas līmeni.

Ieviešana kodā
Lai kliedētu atlikušo nesaprotamību, mēs ieviešam vienkāršotu algoritmu C # (bez matricām un vadības darbības):

klase KalmanFilterSimple1D
{
publiska dubultā X0 (get; privātā kopa;) // paredzamais stāvoklis
publiska dubultā P0 ( iegūt; privātā kopa; ) // paredzamā kovariācija

Publisks dubults F ( iegūt; privātā kopa; ) // reālās vērtības faktors pret iepriekšējo reālo vērtību
public double Q ( get; private set; ) // mērījumu troksnis
publiska dubultā H ( iegūt; privātā kopa; ) // izmērītās vērtības koeficients reālajai vērtībai
public double R ( get; private set; ) // vides troksnis

Publisks dubultstāvoklis (get; privāts komplekts;)
publiska dubultā kovariācija ( iegūt; privāta kopa; )

Publiskais KalmanFilterSimple1D(dubultais q, dubultais r, dubultais f = 1, dubultais h = 1)
{
Q = q;
R = r;
F = f;
H = h;
}

Publisks spēkā esošais SetState (dubultstāvoklis, dubultā kovariācija)
{
stāvoklis = stāvoklis;
Kovariance = kovariācija;
}

Publisks tukšums Pareizi (dubulti dati)
{
//laika atjauninājums - prognoze
X0 = F*stāvoklis;
P0 = F*Kovariance*F + Q;

//mērīšanas atjauninājums - korekcija
var K = H*P0/(H*P0*H + R);
Stāvoklis = X0 + K*(dati - H*X0);
Kovariance = (1 - K*H)*F;
}
}

// Lietojumprogramma...

VarfuelData = GetData();
var filtrēts = new List();

Var kalman = jauns KalmanFilterSimple1D(f: 1, h: 1, q: 2, r: 15); // iestatiet F, H, Q un R
kalman.SetState(degvielasDati, 0.1); // Iestatiet stāvokļa un kovariācijas sākotnējo vērtību
foreach(var d degvielas datos)
{
kalman.Pareizi(d); // Pielietojiet algoritmu

Filtrēts.Pievienot(kalman.State); // Saglabājiet pašreizējo stāvokli
}

Filtrēšanas ar šiem parametriem rezultāts ir parādīts attēlā (lai pielāgotu izlīdzināšanas pakāpi, varat mainīt Q un R parametrus):

Interesantākais paliek ārpus raksta darbības jomas - Kalmana filtra pielietošana vairākiem mainīgajiem, attiecību iestatīšana starp tiem un vērtību automātiska atvasināšana nenovērotajiem mainīgajiem. Mēģināšu turpināt tēmu, tiklīdz būs laiks.

Es ceru, ka apraksts izrādījās ne pārāk nogurdinošs un sarežģīts, ja jums ir kādi jautājumi un paskaidrojumi - laipni lūdzam komentāros)

Mehānismu un mezglu vadības tehnoloģisko procesu automatizācijas procesā nākas saskarties ar dažādu fizikālu lielumu mērījumiem. Tas var būt šķidruma vai gāzes spiediens un plūsma, rotācijas ātrums, temperatūra un daudz kas cits. Fizisko lielumu mērīšana tiek veikta, izmantojot analogos sensorus. Analogais signāls ir datu signāls, kurā katrs no reprezentatīvajiem parametriem ir aprakstīts ar laika funkciju un nepārtrauktu iespējamo vērtību kopu. No vērtību telpas nepārtrauktības izriet, ka jebkādi signālā ievadītie traucējumi nav atšķirami no lietderīgā signāla. Tāpēc vadības ierīces analogā ieeja saņems nepareizu vajadzīgā fiziskā daudzuma vērtību. Tāpēc ir nepieciešams filtrēt signālu, kas nāk no sensora.

Viens no efektīvākajiem filtrēšanas algoritmiem ir Kalmana filtrs. Kalmana filtrs ir rekursīvs filtrs, kas novērtē dinamiskas sistēmas stāvokļa vektoru, izmantojot virkni nepilnīgu un trokšņainu mērījumu. Kalmana filtrs izmanto sistēmas dinamisko modeli (piemēram, kustības fizisko likumu), vadības darbības un secīgu mērījumu kopumu, lai izveidotu optimālu stāvokļa novērtējumu. Algoritms sastāv no divām iteratīvām fāzēm: prognozēšanas un korekcijas. Pirmajā posmā tiek aprēķināta stāvokļa prognoze nākamajā brīdī (ņemot vērā to mērījumu neprecizitāti). Otrajā gadījumā jauna informācija no sensora koriģē prognozēto vērtību (ņemot vērā arī šīs informācijas neprecizitāti un troksni).

Prognozēšanas fāzē:

  1. Sistēmas stāvokļa prognoze:

kur ir prognoze par sistēmas stāvokli pašreizējā laikā; – pārejas matrica starp stāvokļiem (sistēmas dinamiskais modelis); – sistēmas stāvokļa prognozēšana iepriekšējā laika momentā; – kontroles darbības pielietojuma matrica; ir kontroles darbība iepriekšējā laika momentā.

  1. Kovariācijas kļūdas prognoze:

kur ir kļūdu prognozēšana; – kļūda iepriekšējā laika momentā; ir procesa trokšņa kovariācija.

Pielāgošanas posmā:

  1. Kalmana pieauguma aprēķins:

kur ir Kalmana ieguvums; – mērījumu matrica, attēlojot mērījumu un stāvokļu attiecību; ir mērījumu trokšņa kovariācija.

kur ir mērījums pašreizējā laikā.

  1. Kovariācijas kļūdas atjauninājums:

kur ir identitātes matrica.

Ja sistēmas stāvokli apraksta ar vienu mainīgo, tad = 1, un matricas deģenerējas parastos vienādojumos.

Lai skaidri parādītu Kalman filtra efektivitāti, tika veikts eksperiments ar AVR PIC KY-037 skaļuma sensoru, kas ir savienots ar Arduino Uno mikrokontrolleri. 1. attēlā parādīts sensora rādījumu grafiks, neizmantojot filtru (1. līnija). Haotiskas vērtības svārstības sensora izejā norāda uz trokšņa klātbūtni.

1. attēls. Sensoru rādījumu grafiks, neizmantojot filtru

Lai lietotu filtru, ir jānosaka mainīgo , un vērtības, kas nosaka sistēmas un mērījumu dinamiku. Mēs pieņemam un vienādi ar 1 un vienādi ar 0, jo sistēmā nav kontroles darbību. Lai noteiktu filtra izlīdzināšanas īpašības, ir jāaprēķina mainīgā vērtība un jāizvēlas parametra vērtība.

Mēs aprēķināsim mainīgo programmā Microsoft Excel 2010. Lai to izdarītu, ir jāaprēķina sensora rādījumu parauga standarta novirze. = 0,62. tiek izvēlēts atkarībā no nepieciešamā filtrācijas līmeņa, mēs pieņemam = 0,001. 2. attēlā otrā rinda ir sensora rādījumu grafiks, izmantojot filtru.

2. attēls. Sensoru rādījumu grafiks, izmantojot Kalmana filtru

No grafika var secināt, ka filtrs ir ticis galā ar trokšņu filtrēšanas uzdevumu, jo līdzsvara stāvoklī sensoru rādījumu svārstības, kas izturējušas filtrēšanu, ir nenozīmīgas.

Tomēr Kalmana filtram ir ievērojams trūkums. Ja sensora izmērītā vērtība var strauji mainīties, filtrētā sensora rādījums nemainīsies tik ātri kā izmērītā vērtība. 3. attēlā parādīta Kalmana filtra reakcija uz izmērītās vērtības lēcienu.

3. attēls. Kalmana filtra reakcija uz izmērītās vērtības lēcienu

Filtra reakcija uz izmērītās vērtības lēcienu izrādījās nenozīmīga. Ja izmērītā vērtība būtiski mainās un pēc tam neatgriežas pie iepriekšējās vērtības, tad filtrētie sensora rādījumi atbildīs izmērītās vērtības reālajai vērtībai tikai pēc ievērojama laika perioda, kas ir nepieņemami automātiskajām vadības sistēmām, kurām nepieciešams liels ātrums. .

No eksperimenta mēs varam secināt, ka Kalmana filtrs ir jāizmanto, lai filtrētu sensoru rādījumus zema ātruma sistēmās.

Bibliogrāfija:

  1. GOST 17657-79. Datu pārsūtīšana. Termini un definīcijas. - Maskava: Standartu izdevniecība, 2005. - 2 lpp.
  2. Kalmana filtrs // Wikipedia. . Atjaunināšanas datums: 26.04.2017. URL: http://ru.wikipedia.org/?oldid=85061599 (piekļuves datums: 21.05.2017.).