Idősor előrejelzés
Szórádi Júlia, BSc konzulens: Dr. Horváth Gábor Önálló laboratórium (BMEVIMIA362) 2010-11 II. félév
IDŐSOR ELŐREJELZÉS Az idősor előrejelzés számos területen alapvető fontosságú feladat, célja elsősorban a múltbéli megfigyelt adatok alapján következtetni az idősor jövőbeli alakulására. Különböző fogyasztási görbéktől (víz, áram, benzin, stb) kezdve időjáráson át rengeteg felhasználási területe létezik. Számos módszert dolgoztak ki az idősorok vizsgálatára, belőlük valamiféle szabályosság kinyerésére, én az önálló labor során neurális hálók használatát vizsgáltam. A neurális hálók megvalósítására a MATLAB fejlesztőkörnyezet neural network toolboxát, illetve NNSYSID nevezetű külső toolboxot használtam. A felhasznált módszer eldöntése után az első lépés a módszer megismerése volt. Az idősor előrejelzés egy dinamikus nem lineáris probléma, így dinamikus neurális hálók használata célszerű. DINAMIKUS NEURÁLIS HÁLÓZATOK A dinamikus neurális hálózatok abban különböznek a statikus hálóktól, hogy a háló kimenete nem csak az aktuális bemenettől függ, hanem az adatsorozat időben korábbi értékeitől is. Az időfüggő hálózatok nem lineáris dinamikus rendszermodellnek tekinthetők, így diszkrét idejű rendszerek esetén a be- és kimenet kapcsolata a következőképpen írható le:
Az egyenletben a az úgynevezett regresszor vektor, a pedig a rendszer paramétereit összefoglaló vektor. A regresszor vektor adja meg, hogy a kimenet előállításában milyen korábbi értékeket használunk fel. A modell tervezésekor itt is, mint a statikus hálók esetén, arra törekszünk, hogy a háló kimenete minél jobban megközelítse a kívánt választ egy adott kritérium értelmében (amely általában az átlagos négyzetes hiba). A regresszor vektor típusától függően különböző modellosztályokat különböztethetünk meg:
NFIR: A regresszor csak a korábbi bemeneteket tartalmazza.
NARX: A regresszor korábbi bemeneteket és korábbi kívánt válaszokat is tartalmaz.
NOE: A regresszor korábbi bemeneteket és a modell korábbi válaszait is magában foglalja.
NARMAX: A NARX modell olyan kibővítése ahol a regresszor a korábbi bemenetek és kívánt válaszok mellett még a modell korábbi hibáit is tartalmazza.
NBJ: A NOE modell kiegészítése kétfajta hiba visszacsatolásával.
ahol regresszor vektorban és
, helyére 0-t írunk.
olyan modell kimenetén nyerjük ahol a
A modellosztály megválasztása után már csak a modell fokszámát kell meghatározni, tehát, hogy a regresszor vektor hány késleltetést tartalmazzon. Ezt meg lehet határozni próbálkozással is, de ez nem mindig célravezető, ráadásul minden próba esetén létre kel hozni a modellt és ki kell próbálni, hogy megfelel-e az elvárásoknak. A fokszám meghatározására léteznek különböző módszerek, én az önálló laboratórium során a Lipschitz indexen alapuló módszert használtam. LIPSCHITZ INDEX A módszer azon alapul, hogy feltételezhetjük a nemlineáris dinamikus rendszer által megvalósított leképezés folytonosságát. A módszer bemutatásához vegyünk egy folytonos többváltozós f függvényt.
Ez az f függvény az összes felsorolt független x változótól függ, és csak ezektől. A megfelelő számú változó meghatározása a Lipschitz index segítségével történhet.
ahol a
a
Lipschitz hányadosok közül a k. legnagyobb érték, N a bemeneti változók száma (regresszor vektor hossza), p pedig egy alkalmasan megválasztott pozitív szám általában Ha az első feltételezésünk igaz volt, tehát az f függvény csak a felsorolt x változóktól függ, akkor a Lipschitz hányadosok korlátosak. Ha viszont kihagyunk egy változót, akkor a Lipschitz hányados nevezője csökken, a számláló viszont nem változik. Ha a kihagyott változó független a többitől, akkor az érték akár végtelen is lehet, viszont ha a kihagyott változó nem teljesen független a többitől, akkor a hányados értéke sokkal nagyobb lesz mint ha nem hagynánk ki a változót. Tehát ha egy szükséges bemeneti változó hiányzik, akkor a Lipschitz hányados nagyon nagy értéket is felvehet, és minél több fontos változó hiányzik, az értéke annál nagyobb lehet. Ha viszont redundáns változót adunk a bemenetekhez (tehát az új változótól a függvény kimenete nem függ), akkor a Lipschitz hányados értéke jelentős mértékben nem változik. Tehát az N értéke megfelelő, ha közel azonos -nel, viszont sokkal kisebb mint . Így neurális háló fokszámának meghatározásához a tanítópontokra kiszámítjuk a Lipschitz indexet növekvő fokszámmal. Ha az eredményt kirajzoljuk (fokszám függvényében), akkor az ábráról leolvashatók, a lehetséges fokszámok. Ugyanis ezek a töréspontokban találhatóak (előttük meredek a görbe, utánuk ellaposodik). A módszer előnye, hogy csak a tanítóminták alapján dolgozik, tehát nem kell elkészíteni a modellt hozzá. Hátránya viszont, hogy zajos jel esetén bizonytalanná válik.
BENCHMARK FELADATOK Az idősor előrejelzéssel való ismerkedést benchmark feladatokkal kezdtem. Ennek során megismerkedtem dinamikus neurális hálókkal, a tervezés lépéseivel, és a MATLAB neural network toolbox-ával, amit a későbbiek során is használtam. Az első ilyen feladat a Mackey-Glass kaotikus folyamat modellezése volt. MACKEY-GLASS A folyamatot leíró differenciál egyenlet:
A feladat során τ=17 paraméterrel dolgoztam. A megfelelő neurális háló paramétereit próbálgatással határoztam meg, mind a neuronok számát, mind a regresszor vektor hosszát változtattam. A végső megoldásban a regresszor vektor 10 régebbi bemenetet tartalmaz. A háló egy rejtett réteggel rendelkezik, amiben 4 neuron található. A feladathoz kapott adatsor 1500 adatból áll, ezt felosztottam tanító és teszt adatokra. A tanító adathalmazhoz az első 1000 pontot használtam, a hozzá tartozó kívánt válasz pedig az eggyel eltolt pont sorozat, tehát (2:1001) pontok halmaza. A hálót a MATLAB newfftd() függvényével hoztam létre, a tanításhoz az alapértelmezett Levenberg-Marquardt tanítóalgoritmust használom, ugyanis ez a leggyorsabb. Az ábrán látható a tesztelés eredménye. A felső ábrán kék vonallal látható a teszt bemenetekre a kívánt válasz, piros szaggatott vonallal pedig a háló válasza. Az alsó ábrán látható a hiba alakulása. A hiba nagyságrendje .
LORENZ A következő feladat a Lorenz kaotikus folyamat előrejelzése volt. A neurális háló paramétereit itt is próbálgatással határoztam meg. A regresszor vektor hosszát és a neuronokat is változtattam, míg egy kellően jó megoldásra nem jutottam. A végső megoldásban a regresszor vektor 10 korábbi bemenetet tartalmaz és a háló egy rejtett rétegben 2 neuront tartalmaz. A kapott adatsor 90003 pontból áll, ebből az első 9300 pontot használtam tanításra, a kívánt válasz pedig az eggyel eltolt tartomány. A hálót itt is a newfftd() függvénnyel hoztam létre, a tanításhoz Levenberg-Marquardt algoritmust használtam. Az ábrán látható a teszt eredménye. A felső ábrán látható a kívánt válasz és a háló kimenete, az alsó ábrán pedig a hiba alakulása. A hiba itt nagyságrendű.
VALÓS IDŐSOR A benchmark feladatok után elkezdtem foglalkozni egy valódi idősor előrejelzési problémával. A képen látható idősor a IBM-től származik, egy gyártással összefüggő adatot tartalmaz heti bontásban.
1. ELŐREJELZÉS EGYBEN Kiindulásként az idősort egyben próbáltam meg előre jelezni. A benchmark feladatokkal ellentétben a regresszor vektor hosszának (modell fokszámának) meghatározásához Lipschitz indexet használtam. Az ábrán látható, hogy három főbb töréspont, ezek megfelelnek a negyedéves, féléves és éves időintervallumoknak. Az éves intervallumnak megfelelő töréspont található a legalacsonyabban így az tűnik a legjobb választásnak, de nincs elég adat, így azt a fokszámot használva, csak kevés tanítóadatunk lenne. Kompromisszumot kell kötni a fokszám és a tanítóminták száma között.
ELŐREJELZÉS EREDMÉNYEI A Lipschitz index segítségével meghatározott mindhárom töréspontot kipróbáltam, és megkerestem hozzájuk a megfelelő neuron számot. Az adatokat felbontottam tanító és teszt halmazra. Tanításhoz az első 80 pontot használtam fel, a maradék 24-et pedig teszteléshez. I.
12-es fokszám
A háló egy rejtett réteggel rendelkezik amelyben 6 neuron található. Az ábrán látható a tesztelés eredménye , a felső ábrán kékkel a kívánt válasz pirossal pedig a háló válasza. Az alsó ábrán a hiba alakulása látható. A megoldások összehasonlításához kiszámoltam a négyzetes hibát a teljes tartományra, illetve a teszt tartományra is. teljes tartományon az átlagos négyzetes hiba: 2.3087e+003 teszt tartományon az átlagos négyzetes hiba: 2.7566e+003
II.
25-ös fokszám
A végső háló 10 neuront tartalmaz. Az ábrán látható a tesztelés eredménye, a felső ábrán itt is kékkel látható a kívánt válasz pirossal pedig a háló válasza, az alsó ábra pedig a hiba alakulását mutatja. teljes tartományon az átlagos négyzetes hiba: 1.4337e+003 teszt tartományon az átlagos négyzetes hiba: 3.4656e+003
III.
52-es fokszám
A megoldás 12 neuront tartalmaz. Az ábra a fentiekkel megegyezően jeleníti meg a tesztelés eredményét. teljes tartományon az átlagos négyzetes hiba: 2.1225e+003 teszt tartományon az átlagos négyzetes hiba: 4.9789e+003
A megoldásokból látszik, hogy a fokszám növelésével a tanítómintákat egyre jobban megtanulja, viszont romlik az általánosítási képesség. A teljes tartományon vett négyzetes hiba a 25-ös fokszám esetén a legkisebb, viszont a teszt tartományon a 12-es fokszámú megoldás jobban teljesít.
2. KOMPONENSEKRE BONTÁS Ezek után felmerült a komponensekre bontás ötlete, melynek célja, hogy a jelet könnyebben előre jelezhető komponensekre bontsuk, és ezek előrejelzését összeadva egy jobb megoldást kapjunk mint az előbbi módszerrel. Illetve, hogy kinyerjünk egy trend szerű komponenst aminek előrejelzése önmagában is hasznos lehet. 2.1. IDŐTARTOMÁNYBAN TÖRTÉNŐ SZŰRÉS: Először időtartományban történő szűréssel próbálkoztam, melynek során a jelet két komponensre bontottam, egy alacsony frekvenciás komponens és a maradék. A szűréssel elő akartam állítani az eredeti jel simított változatát, ami a nagyobb kiugrásokra illeszkedik és a kisebb ingadozásokat elsimítja. A szűréshez a MATLAB-ban megtalálható FIR szűrőt használtam, melynek paramétereit a következő módon állítottam be: (a frekvenciák Hz-ben értendők) Fs = 48000; (mintavételi frekvencia) Fpass = 4800; Fstop = 9600;
A teljes tartományon egyszerre elvégeztem a szűrést és utána bontottam szét tanító és teszt adatokká, így a tanítóadatok előállításához felhasználtam a teszt adatokról is információt, így a megoldás nem teljesen korrekt. Az ábrán látható a szűrés eredménye. Kékkel látható az eredeti jel, pirossal a szűrt jel, zölddel a kettő különbsége (a maradék).
ELŐREJELZÉSI EREDMÉNYEK Az előző ábrán pirossal és zölddel megjelenő jeleket próbáltam tehát előre jelezni. Ehhez a fokszámot újra meg kellett állapítani, ugyanis a két új jel viselkedése nem feltétlenül egyezik meg az eredeti jellel.
I.
alacsony frekvenciás komponens
A megoldás 7 neuront tartalmaz, a regresszor vektor pedig 13 régebbi bemenetet. A képen látható, hogy az alacsonyfrekvenciás komponenst jól előre lehet jelezni (kék vonal: elvárt kimenet, piros vonal: háló válasza).
II.
maradék
A felhasznált háló 6 neuront tartalmaz, a regresszor vektor pedig 13régebbi bemenetet. Jól látható, hogy a maradékot nem sikerült jó minőségben előre jelezni (kék vonal: elvárt kimenet, piros vonal: háló válasza).
III.
összeg
Végül a kettőt összeadtam és összehasonlítottam az eredeti jellel. A maradék előrejelzési hibája miatt az összeg is nagymértékben eltér a kívánt választól (kék vonal: kívánt válasz, piros vonal: hálók válaszának összege, alsó ábra pedig a hiba alakulása). átlagos négyzetes hiba: 2.0834e+003 maximális hiba: 235.6866
2.2. FREKVENCIA TARTOMÁNYBAN TÖRTÉNŐ SZŰRÉS Ezek után áttértem frekvenciatartományban történő szűrésre. Itt már több komponenst használtam az előbbi tapasztalatokból kiindulva (maradék nem sikerült előre jelezni). 2.2.1. SZŰRÉS TELJES TARTOMÁNYON Első körben a szűrést itt is a teljes tartományon végeztem el, majd utána bontottam szét tanító és teszt adatokra, így a tanító adatok előállításához most is felhasználtam a teszt adatokról is információt. A jelet Fourier transzformáltam, majd a transzformált jelet feldaraboltam, és a darabokat különkülön visszatranszformáltam. Az ábrán látható a jel Fourier transzformáltja, a piros vonalak mentén bontottam fel a spektrumot.
Az első komponenst úgy határoztam meg, hogy az eredeti jel egy simított, a nagyobb kiugrásokra illeszkedő változatát kapjam. Az időtartománybeli szűrés eredményeiből kiindulva két komponens nem elegendő, így a maradékot is fel kell osztani. Ennek a felosztását pedig próbálgatással határoztam meg. A komponenseket balról jobbra határoztam meg, és egyszerre mindig eggyel foglalkoztam. Tízesével változtattam a határokat, és ha könnyen előre jelezhetővé vált az aktuális komponens, akkor azt a határt rögzítettem. Az ábrán láthatóak a komponensek illetve az eredeti jel (kék vonal) időtartományban. A zöld jel az első komponens, látható, hogy a negyedévek végén található nagyobb kiugrásokra illeszkedik, a kisebb ingadozásokat pedig kisimítja.
ELŐREJELZÉSI EREDMÉNYEK I.
komponensek
Az alábbi ábrán látható az egyes komponensek előrejelzése, a következő ábrán pedig az előrejelzési hibák alakulása.
II.
összeg:
Az ábrán (szokásos elrendezésben) látható az egyes komponensek eredményeinek összege, az eredeti jellel összehasonlítva. A korábbi eredményekhez képest nagy javulást mutat. Ez az eredmény már elfogatható minőségű, így a feladat az, hogy kiküszöböljük a csalást amellett, hogy a megoldás minősége ne romoljon nagy mértékben. átlagos négyzetes hiba: 52.7668 maximális hiba: 50.3670
2.2.2. SZŰRÉS KÜLÖN A TESZT ÉS A TANÍTÓ ADATOKON Az első lépés a teljesen korrekt megoldás felé az volt, hogy a szűrést külön a tanító halmazon és külön a teszt halmazon végeztem el, így a tanító pontok előállításához nem használok a teszt tartományból információt. Viszont teszteléskor még mindig használom a „jövőbeni” adatokat, ugyanis a teljes teszt tartományt egyszerre szűröm. A szűrést újra meg kellett tervezni, ugyanis a jel rövidebb szakaszait szűröm egyszerre, így a spektrum is rövidebb, tehát új felbontás kell. Az ábrán látható a tanító pontok Fourier transzformáltja, amit a piros vonalak mentén daraboltam fel. A felbontás itt is hasonló elven végeztem mint az előző megoldásnál.
A következő ábrán láthatóak a komponensek, illetve az eredeti jel (kék vonal) időtartománybeli alakja. Az első komponens itt is zölddel látható, és ugyanazok mondhatók el róla mint az előző megoldásban.
ELŐREJELZÉSI EREDMÉNYEK I.
komponensek Az alábbi ábrán látható az egyes komponensek előrejelzése, a következő ábrán pedig az előrejelzési hibák alakulása.
II.
összeg
Az ábrán (szokásos elrendezésben) látható az egyes komponensek eredményeinek összege, az eredeti jellel összehasonlítva. Az előző eredményhez képest romlott egy keveset a megoldás minősége, de ez még mindig elfogadható. átlagos négyzetes hiba: 122.1930 maximális hiba: 31.0243
2.2.3. CSÚSZÓ ABLAKOS SZŰRÉS Végül kísérletet tettem egy teljesen korrekt megoldás létrehozására. Itt már a szűrést mindig a már ismert adatokon végeztem, tehát először a tanító adatokon, azokkal megtanítottam a hálót. Teszteléskor pedig először szintén a tanító adatokon végeztem a szűrést, ezt adtam a megtanított hálók bemenetére, ebből jósoltam a következő adatot (első ami kimaradt a szűrésből), majd azt is ismertnek feltételeztem. Következő körben bevettem a neki megfelelő kívánt választ a szűrésbe, és ebből jósoltam a következő adatot, és így tovább. Tehát csúszó ablak szerűen végeztem a szűrést. Az előző megoldásban elkészített szűrést alkalmaztam, mivel a szűrendő tartomány hossza nem változott. ELŐREJELZÉS EREDMÉNYE A képen látható az eredmény, ami szemlátomást sokat romlott az előző megoldáshoz képest. átlagos négyzetes hiba: 4.1786e+003 maximális hiba: 461
ÖSSZEFOGLALÁS A félév során megismerkedtem a neurális hálóval történő idősor előrejelzés alapvető kérdéseivel, és elkezdtem foglalkozni egy valós problémával. A feladat során kipróbáltam a jel komponensekre bontását, ami egy lehetőség az előrejelzés megkönnyítésére. Ennek során mind időtartomány, mind frekvenciatartománybeli szűrést is használtam. A feladat végső megoldása nem megfelelő minőségű, de a korábbi eredmények arra utalnak, hogy ezen még lehet javítani.
FELHASZNÁLT IRODALOM
Dr. Horváth Gábor – Neurális hálózatok
TARTALOM Idősor előrejelzés ................................................................................................................................................ 2 Dinamikus neurális hálózatok ................................................................................................................... 2 Lipschitz index .......................................................................................................................................... 3 Benchmark feladatok .......................................................................................................................................... 4 Mackey-glass ............................................................................................................................................ 4 Lorenz ....................................................................................................................................................... 5 Valós idősor ........................................................................................................................................................ 6 Előrejelzés egyben .................................................................................................................................... 6 Komponensekre bontás ............................................................................................................................ 9 Időtartományban történő szűrés: .............................................................................................. 9 Frekvencia tartományban történő szűrés ................................................................................ 11 Összefoglalás .................................................................................................................................................... 18 Felhasznált irodalom......................................................................................................................................... 18