Opdracht neurale netwerken echo state netwerk

20
My economic echo’s Verslag Echo state netwerk. opdracht 4 Neurale Netwerken 2008/2009 (RUG-KI) Aan: Jaap Oosterbroek Van: Wilko Dijkhuis (s1808842) Inleverdatum: 21 januari 2009 (paragraaf 6.4 en bijlage 1 en 2 zijn 23 januari toegevoegd)

description

 

Transcript of Opdracht neurale netwerken echo state netwerk

Page 1: Opdracht neurale netwerken echo state netwerk

My economic echo’s

Verslag

Echo state netwerk.

opdracht 4 Neurale Netwerken 2008/2009

(RUG-KI)

Aan: Jaap Oosterbroek Van: Wilko Dijkhuis (s1808842) Inleverdatum: 21 januari 2009 (paragraaf 6.4 en bijlage 1 en 2 zijn 23 januari toegevoegd)

Page 2: Opdracht neurale netwerken echo state netwerk

1- Inleiding

De welvaart van een land wordt gemeten m.b.v. het Bruto Nationaal Product (BNP). We gaan er vanuit dat het BNP beschreven wordt door het volgende model; De groei kent een lineaire component, vastgelegd met de parameters:

trend_t0 : BNP op tijdstip 0, dwz het snijpunt met de y-as

trend_slope : de hellingshoek van de BNP lijn (zeg de groei per jaar)

Ten tweede kennen we een cyclische component (een vaste sinusvormige wisseling gedurende het jaar). Parameters:

CycleLen : lengte van in één cyclus gemeten in aantal meettijdstippen t (als elke maand gemeten wordt dan wordt, dan zitten er 12 t’s in een jaar, dus CycleLen = 12)

Max_aplitude De maximale amplitude van de sinus.

Optelling van beide bovenstaande componenten geeft de systematische groei van het BNP. Deze lijn heet Y_soll(t) , dwz het systematische BNP verloop dat we moeten vinden.

Naast de systematische componenten zijn er een aantal andere, niet voorspelbare, zaken die de groei van het BNP mede bepalen. Deze toevalligheden worden gerepresenteerd met een ruis term (uniform verdeeld) met parameter:

Max_noise: de maximale “amplitude” van de ruis.

De metingen van het BNP (de rode lijn hiernaast) bevatten alle drie bovenstaande componenten (de meetwaarde = som van de drie). De rode lijn noemen we de Y_ist(t), dit is de werkelijke - gemeten - ontwikkeling van het BNP.

Page 3: Opdracht neurale netwerken echo state netwerk

2 - Doel / probleem Het netwerk moet de systematische groei van het Bruto Nationaal Product (BNP) van een land voor het volgende jaar kunnen voorspellen. Anders geformuleerd. Gegeven een tijdserie Y_ist voor de tijdstippen 1 … n, (de rode lijn in de grafieken). Voorspel de Y_soll voor de tijdstippen n+1 … n+cycle_time (extrapoleer de blauwe lijn één jaar ).

3 - Dataset Omdat het model voor het BNP-verloop bekend is, kunnen de data met de computer gegenereerd worden (in onbeperkte hoeveelheden en tal van varianten, zie de routine input001_read_Y_train() in het toegevoegde MatLab programma). Omdat de data gegeneerd worden is het niet nodig ze te voor te bewerken, ze zijn direct bruikbaar. Met het datagenererende model kunnen ook “toekomstige” data gegenereerd worden. De voorspellingen van het ESN kunnen dus eenvoudig gecontroleerd worden. Dit is gedaan door de MSE van de Y_ist (de voorspelling in de test periode) t.o.v. Y_soll (de bekende juiste modelwaarde) uit te rekenen. Opmerking: Het vinden van data was op zich geen probleem. Van de site van het CBS heb ik bijvoorbeeld data gedownload voor gasprijzen (kwartaalcijfers vanaf 1980). Het gedownloade SPSS bestand kan met minimale moeite geschikt gemaakt worden voor gebruik.

4 - Motivatie. Het is mijn doel om te snappen hoe het netwerk functioneert en wat er gebeurt als je aan de “knoppen” draait. Het werken met gegenereerde data en een bekend model is ideaal voor dat doel. Er is immers bekend wat er uit moet komen. De prestaties van het neurale netwerk kunnen dus goed beoordeeld worden. Je kunt dan ook duidelijk zien wat de invloed is van veranderingen in het netwerk. Het gebruiken van een NN om een realistisch probleem op te lossen is een spannende uitdaging. Die uitdaging wil ik uitstellen tot nadat ik de basic’s van NN goed onder de knie heb. De opdracht is dus puur geïnspireerd door een onderwijsleerdoel. Er is geen sprake van het oplossen van een praktisch probleem (praktische motivatie) of het toetsen of herformuleren van een theorie (theoretische motivatie). Opmerking: Om mijn inzichtdoel te realiseren heb ik een volledig eigen versie van het aangeleverde echostate netwerk gemaakt (geïnspireerd door het sinewave_solution.m programma). Er is relatief veel tijd gaan zitten in het op gang krijgen van deze eigen versie (zie het als bijlage toegevoegde my_economic_echos.m).

5 - Planning De volgende stappen zijn doorlopen.

Bestudeer de achterliggende theorie.

Maak een eigen versie van sinewave_solution.m, begrijp hoe dit programma werkt.

Maak op basis van dat programma vervolgens het voor de opdracht benodigde matlab programma: my_economic_echos.m

Gebruik het programma om het gestelde doel te halen voor verschillende scenario’s.

Trek conclusies formuleer vervolgonderzoek.

Rapporteer. Het onderzoek is door één persoon uitgevoerd, er hoefde dus geen werk verdeeld te worden.

Page 4: Opdracht neurale netwerken echo state netwerk

6 – Experimenten Het programma my_echonomic_echos.m heeft de volgende parameters. % --- NN topology parameters ---------------- global N; (het aantal hidden neuronen in het dynamisch reservoir) global Chh; (connectivity binnen het DR – dwz van hidden naar hidden -) global Chy; (contivity van hidden neurons naar output neuron Y) global Cyh; (connectivity van output neuron naar hidden neurons) global alfa; (de alpha van het ESN) % --- economic growth parameters --- global trend_t0; (BNP op tijdstip 0) global trend_slope; (hellingshoek van de groei van het BNP) global cycleLen; (aantal meetmomenten in een jaarcyclus) global Max_Amplitude; (maximale amplitude van de BNP cycluscomponent) global Max_noise; (maximale amplitude ruis in de BNP

ontwikkeling) % --- time period parameters ------ global TransLen; (de lengte van de transient periode) global TrainLen; (de lengte van de training periode) global TestLen; (de lengte van de test periode);

Zie paragraaf 1 – inleiding - voor toelichting bij de economic growth parameters. Zie de theorie van het ESN voor de betekenis van de overige parameters. Door de parameters verschillende waarden te geven kunnen verschillende experimenten uitgevoerd worden (diverse scenario’s doorgerekend worden). Opmerking Gedurende de experimenten zijn met trial and error regelmatig verschillende de parameter waarden uitgeprobeerd. De resultaten van dit probeerproces worden niet gerapporteerd in dit verslag. Belangrijke vondsten (nodige veranderingen in de parameter waarden) worden wel expliciet vermeld.

6.1 – experiment 1 : de sinus generator. Inleiding Ter controle is als eerste de werking van de sinewave generator gerepliceerd. Aan de hand van dit eenvoudige voorbeeld wordt de in deze experimenten gevolgde werkwijze gedemonstreerd. Gebruikte parameterwaarden. % --- NN topology parameters ---------------- global N; N = 20; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.8; % --- economic growth parameters --- global trend_t0; trend_t0 = 0; global trend_slope; trend_slope = 0.0; global cycleLen; cycleLen = 20; global Max_Amplitude; Max_Amplitude = 0.5; global Max_noise; Max_noise = 0.00001; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 600; global TestLen; TestLen = 30*cycleLen;

Page 5: Opdracht neurale netwerken echo state netwerk

Resultaten

Getoond worden de voorspelde waarden (de ist waarden) vanaf t=700, het einde van de trainingsperiode). In de test periode moet de Y_ist geïnterpreteerd worden als de door het netwerk berekende waarde d.w.z. de voorspelling op basis van het getrainde netwerk. De Y-ist (rood) ligt 30 cycluslengtes lang precies op de Y-soll (blauw). De blauwe lijn wordt afgedekt door de rode en is dus niet zichtbaar. Binnen de econometrie zou dit een spectaculair resultaat zijn (de economische groei voorspellen voor de komende 30 jaar met een fout die veel kleiner is dan één promille). De kwaliteit van de voorspelling kwantitatief is te meten aan de hand van de MSE

De test MSE geeft de kwaliteit van de voorspelling weer (MSE gedurende de testtijd op basis van de voorspelling Y_ist en de correcte waarde Y_soll). De train MSE geeft het verschil tusen Y_train en Y_soll gedurende de trainingsperiode. De Y_train is de door ruis vervuilde “meetwaarde” die het datamodel genereert. De train MSE meet hoeveel ruis er in de trainingsdata zit (hoe dicht liggen de voor training gebruikte Y_train waarden af van de ideale ruisvrije waarden van Y_soll). Merk op dat de test MSE lager is dan de train MSE. De voorspelling is dus van betere kwaliteit dan de trainingsdata, Het ESN filtert de ruis weg uit de trainingsdata en weet de onderliggende systematische trend in de groei te reconstrueren. De kwaliteit van de functioneren van het netwerk kan nu gemeten worden met: Predict_Quality = MSE_train / MSE_test;

Om de uitkomsten van verschillende experimenten vergelijkbaar te maken gaan we standaard uit van een test periode die één cyclus lengte lang. De standaard presentatie van het resultaat van een experiment zien er als volgt uit.

In dit geval weet het netwerk de ruis met een factor 24 terug te dringen.

Page 6: Opdracht neurale netwerken echo state netwerk

Verder zal standaard de grafiek van de voorspelling worden getoond.

Als we het programma met dezelfde parameterwaarden nog eens runnen dan zullen de uitkomsten anders zijn (verschillen van een factor 100 komen regelmatig voor). In mijn experimenten run ik het programma een aantal malen, en pak vervolgens een typisch voorbeeld van een goed resultaat. Motivatie: wat in de exploitatie van het netwerk interessant is, is één goede set gewichten Dat er andere sets waren die minder bruikbaar zijn is voor het succes van de exploitatie niet echt interessant (in de exploitatie gebruik je immers de goede set en niet de andere). Conclusie van het experiment In dit experiment weet het netwerk de ontwikkeling van het BNP spectaculair goed te voorspellen. Echter de parameter waarden vertegenwoordigen geen realistisch economisch situatie (economieën die zich zo gedragen bestaan niet). We kunnen dus zeker niet concluderen dat het netwerk het BNP goed kan voorspellen. Wel kunnen we concluderen dat het ESN een goede sinusgenerator is. Dit voorbeeld is vooral opgenomen als een eenvoudig te begrijpen voorbeeld van de gevolgde standaard werkwijze.

6.2 – experiment 2 : een realistischer model. Inleiding In en meer realistisch model zal de economische groei groter dan nul zijn. Een typisch groei van 2% op jaar basis zou bij een cycluslengte van 20 metingen en een trend_t0 = 100 neerkomen op een trend_slope = 0.1. De trend_t0 zal ook niet nul zijn. We nemen hier de waarde 100 (willekeurig gekozen, eigenlijk maakt het niet zoveel uit welke waarde we hier kiezen). Als we de seizoensfluctuaties op maximaal 5% van het BNP op tijdstip t=0 dan zou dat resulteren in een Max_Amplitude = 5. De maximale invloed van onverwachte zaken houden we in eerste instantie erg laag door een Max_noise = 0.0001 te nemen (d,w,z, 0.001% van het BNP op tijdstip t=0)

Page 7: Opdracht neurale netwerken echo state netwerk

Gebruikte parameterwaarden % --- NN topology parameters ---------------- global N; N = 225; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.75; % --- economic growth parameters --- global trend_t0; trend_t0 = 100; global trend_slope; trend_slope = 0.1; global cycleLen; cycleLen = 20; global Max_Amplitude; Max_Amplitude = 5; global Max_noise; Max_noise = 0.00001; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 600; global TestLen; TestLen = 1*cycleLen;

Resultaten

De voorspelling is nu nog steeds redelijk maar zeker niet perfect. Om deze uitkomst te produceren moet het programma een groot aantal keren gerund worden. In meer dan 90 % van de runs produceert het netwerk geen oplossing (zelfs geen slechte). Om tot die oplossing te komen moest het aantal neuronen drastisch opgevoerd worden (N=225). Alhoewel de test MSE nog steeds redelijk is, is de train MSE orde groottes kleiner. De fouten zijn dus niet aan de invloed ruis toe te schrijven. Een aardig effect is wel dat de gevonden oplossing vrij stabiel is. In de onderstaande plot blijft het model zelfs 30 jaar lang stabiel voorspellen.

Page 8: Opdracht neurale netwerken echo state netwerk

Conclusie van het experiment Het toevoegen van een licht stijgende jaarlijkse groei van 1% (van Trend_t0) heeft een grote impact. - het aantal neuronen moet drastisch opgevoerd worden - er zijn veel meer runs nodig om tot een bevredigende oplossing te komen. - de voorspelling is nog steeds redelijk - de voorspelling is redelijk stabiel. Om de sinus te genereren zijn 20 neuronen blijkbaar ruim voldoende (zie het eerste experiment). Als we echter een echter een eenvoudige stijgende lijn willen toevoegen dan blijkt dat 200 neuronen extra te vergen. Het ESN heeft vermoedelijk moeite met monotoon stijgende verschijnselen. Periodiek wisselende signalen worden beter opgepakt. De Max_noise = 0.0001 in deze situatie is nog steeds onrealistisch klein. Realistischer zou een waarde gelijk aan de Max_Amplitude zijn.

6.3 – experiment 3 : extreem realisme. Inleiding In dit experiment wordt de Max_noise = 5 gezet (gelijk aan de amplitude van de cyclische component). Gebruikte parameterwaarden % --- NN topology parameters ---------------- global N; N = 225; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.75; % --- economic growth parameters --- global trend_t0; trend_t0 = 100; global trend_slope; trend_slope = 0.1; global cycleLen; cycleLen = 20; global Max_Amplitude; Max_Amplitude = 5; global Max_noise; Max_noise = 5; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 600; global TestLen; TestLen = 1*cycleLen;

Resultaten

Page 9: Opdracht neurale netwerken echo state netwerk

De voorspelling is nu duidelijk slechter. De sinusvorm van de voorspeling in sterk aangetast. Echter:

de voorspelling ligt nog steeds in de buurt van de gewenste waarde

de op en neer gaande beweging wordt nog steeds gevolgd

de voorspelling (rode lijn) ligt dichter bij de werkelijke waarde dan het door ruis vervuilde trainingssignaal (groene lijn). De test MSE is beter dan de train MSE

Het netwerk weet het signaal dus nog steeds te vinden in de sterk door ruis vervuilde meetgegevens die gebruikt worden om het netwerk te trainen. Het netwerk leert blijkbaar om de ruis te negeren. Als we de trainingstijd langer maken zou dat tot betere resultaten moeten leiden. Verdriedubbelen van de trainLen tot 1800 geeft inderdaad het volgende resultaat.

Wat bij een aantal oplossingen opviel was dat de eerste helft van de rode sinus vaak gekarteld was (niet smooth). De tweede helft was dat vaak veel beter. Het zou kunnen zijn dat de invloed van de trainingsdata eerst weggespoeld moet worden voordat de gevonden sinus zichtbaar wordt. Nemen we de test lengte gelijk aan 2 jaar i.p.v. 1 dat ziet de grafiek er qua sinusvorm inderdaad beter uit. Overall, wordt de voorspelling wel slechter als we verder in de toekomst proberen te kijken.

Page 10: Opdracht neurale netwerken echo state netwerk

Conclusie van het experiment Het ESN kan de BNP groei onder extreme condities voorspellen, een erg nauwkeurige voorspelling is het niet. Bij de overgang van de train period naar de test period lijkt er een overgangsperiode te zijn (van zeg 10 a 20 momenten) waarin oude door ruis vervuilde traindata nog invloed hebben op de voorspelling. Na die overgangsperiode wordt de voorspelling regelmatiger (ongewenste fluctuaties verdwijnen). In het geval van veel ruis gedurende de trainingsperiode helpt het om de trainingsperiode te verlengen (het netwerk heeft dan meer gegevens om het signaal in de ruis te vinden).

6.4 – experiment 4 : aangepast extreem realisme . inleiding In het vorige experiment rees het vermoeden dat: … “het zou kunnen zijn dat de invloed van de trainingsdata eerst weggespoeld moet worden voordat de gevonden sinus zichtbaar wordt. Om te controleren of dat klopt is het programma aangepast. (Zie bijlage 2 voor de wijzigingen.) Tussen de TrainPeriod en de TestPeriod is een FlushPeriod ingelast. Gedurende die periode wordt een Y aan het netwerk opgelegd (een Y_forced op het net gezet). We gebruiken hier de Y_soll voor (de ruisvrije correcte waarde die de Y eigenlijk zou moeten hebben). Geurende twee cyclus lengten wordt de X op basis van deze Y berekend. Het dynamisch reservoir wordt zo ruisvrij gemaakt (de effecten van de ruis uit de trainingsperiode dempen uit). Na de flush periode kan de test periode nu beginnen vanuit een schone, ruis vrije, initiële positie. Merk op dat er nog steeds voorspeld wordt op basis van de oude matrix Why. Deze matrix wordt nog steeds op de “oude” wijze bepaald op basis van met ruis vervuilde train data. Gebruikte parameterwaarden % --- NN topology parameters ---------------- global N; N = 225; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.75; % --- economic growth parameters --- global trend_t0; trend_t0 = 100; global trend_slope; trend_slope = 0.1; global cycleLen; cycleLen = 20; global Max_Amplitude; Max_Amplitude = 5; global Max_noise; Max_noise = 5; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 1600; global FlushLen; FlushLen = 2*cycleLen; global TestLen; TestLen = 1*cycleLen;

Page 11: Opdracht neurale netwerken echo state netwerk

Resultaten

De voorspelling kan de sinusvorm goed vasthouden en volgt het juiste traject, ook als de TestLen op 10 cycli wordt gezet (zie hieronder).

Conclusie van het experiment Het resultaat bevestigt ons vermoeden. Als de voorspelling begint vanuit een “schone” begintoestand, wordt de sinusvorm van de voorspelling aanzienlijk beter. Ook blijkt de nauwkeurigheid beter te worden. De gevonden Why is dus veel beter dan hij in eerste instantie leek.

Page 12: Opdracht neurale netwerken echo state netwerk

7 - Conclusies Onderzoeksdoel Het in paragraaf 2 gestelde onderzoeksdoel – voorspel de ontwikkeling van het BNP -is gedeeltelijk gehaald. Het netwerk kan onder realistische aannamen mbt de parameterwaarden de BNP ontwikkeling inderdaad voorspellen. De voorspelling laat duidelijk nog te wensen over, maar het netwerk vertoont de potentie om goed te functioneren. Waarschijnlijk kan het functioneren van het netwerk nog verder verbeterd worden door betere waarden voor de parameters te kiezen. Nader onderzoek is dus gewenst. Leerdoelen. Ook de leerdoelen zijn gedeeltelijk gerealiseerd.

Ik begrijp nu goed hoe het ESN formalisme werkt en kan zelf een programma schrijven dat het formalisme implementeert.

Ik begin te begrijpen wat de invloed van de verschillende parameters is, maar het kwartje is nog niet helemaal gevallen. Het zou nuttig zijn om hier nog meer tijd in te steken.

Werkwijze Het werken met gegenereerde data lijkt een goede keuze te zijn geweest. Het was inderdaad mogelijk op maat gesneden experimenten uit te voeren. Het handigheidje om een aantal programma runs uit te voeren en vervolgens te werken met de beste oplossing is bij nader inzien problematisch. Ik kan niet bewijzen dat de zo gevonden oplossing typisch is. Bij nader inzien zou ik net zo lang aan de parameters hebben moeten draaien totdat ik een stabiele oplossing gevonden had (stabiel = elke run met bepaalde parameters resulteert in ongeveer dezelfde oplossing).

8 – Vervolg onderzoek.

Ten eerste zou het nuttig zijn om het programma uit te breiden met een optie die het mogelijk maakt goed functionerende gewichten matrices te saven (en later weer te loaden). Verder zou het nuttig zijn om analyse software te hebben die de eigenschappen van deze matrices zichtbaar maakt (laat zien wat de eigenschappen zijn van succesvolle en minder succesvolle matrices). Ten tweede zou het een goed idee zijn om een aantal leaky integrator neuronen in het model te introduceren. De huidige sigmoid neuronen kunnen goed optellen en vermenigvuldigen, ze kunnen niet integeren. Met optellers zijn eigenlijk geen langlopende monotoon stijgende lijnen te realiseren (met veel optellers kun je slechts op een beperkt interval een stijgende lijn produceren). Voor het oplossen van het voorliggende probleem zijn monotoon stijgende lijnen noodzakelijk. Je hebt niet meer dan één integrator neuron nodig om zo’n stijgende lijn te realiseren.

Page 13: Opdracht neurale netwerken echo state netwerk

Bijlage 1 – listing van my_economic_echos.m %************************************************************ %** %** my_economic_echos.m %** w.dijkhuis (s1808842) %** 14 jan. 2009 %** %************************************************************ %** my_economic_echos.m predicts economic growth using %** - a long term slow moving trend %** - a short term cyclic deviation from the long trend %** The traning data are computer generated (not empiricaly collected) %** %*************** topology ************************************ %** Given a neural net with: %** - no input nodes %** - N hidden nodes(h1,h3,...,hn) %** - one output node y1 %** %** connections between nodes %** - Chh: connectivity from h to h nodes %** - Chy: connectivity from h to y nodes %** - Cyh: connectivity from y to h nodes %** connectivity = #_of_connections / #_of_possible_connections %** - Whh: matrix with Weights of h to h connections %** - Why: matrix with Weights of h to y connections %** - Wyh: matrix with Weights of y to h connections %** %*************** execution ************************************ %** The state of the net changes at discrete moments t=1,2,3...,Ttot %** The run starts with a startup period TransPeriod %** Next is a training period TtrainPeriod %** Last is a test/exploitation period TestPeriod %** %** during training we record for each t in matrix %** - M : the activations of hidden nodes %** - T : the values of the forced output (the training signal) %** after training the matric Why will be calculated (using M and T) %** %** Whh and Wyh will be fixed at the start of the run. %** They will be fixed by a random proces. %** The parameter alfa is used to set the Whh to aceptable values %** - alfa: controls the damping properties of Whh %** %************************************************************

function my_economic_echos declare_global_data(); proces_main_loop(); end

Page 14: Opdracht neurale netwerken echo state netwerk

%********************************************************** %** %** DATA DECLARATIONS %** global data only %** local data are declared in the function %** %**********************************************************

function declare_global_data() % ******************************************* % ** parameters that can/must be changed % ******************************************* % --- NN topology parameters ---------------- global N; N = 225; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.75; % --- economic growth parameters --- global trend_t0; trend_t0 = 100; global trend_slope; trend_slope = 0.1; global cycleLen; cycleLen = 10; global Max_Amplitude; Max_Amplitude = 5; global Max_noise; Max_noise = 5; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 1600; global TestLen; TestLen = 3*cycleLen; % ******************************************* % ** calculated ranges !!DO NOT CHANGE!! % ******************************************* global TotLen; TotLen = TransLen + TrainLen + TestLen; global TransPeriod; TransPeriod = 2:TransLen; global TrainPeriod; TrainPeriod = (TransLen+1):(TransLen+TrainLen); global TestPeriod; TestPeriod = (TransLen+TrainLen+1):(TransLen+TrainLen+TestLen); % ******************************************* % ** type definitions !!DO NOT CHANGE!! % ******************************************* global Whh; Whh = zeros(N,N); global Why; Why = zeros(N,1); global Wyh; Wyh = zeros(N,1); global X; X = zeros(N,1); global M; M = zeros(TrainLen,N); global Y_ist; Y_ist = zeros(TotLen,1); global Y_soll; Y_soll = zeros(TotLen,1); global Y_train; Y_train = zeros(TotLen,1); end

Page 15: Opdracht neurale netwerken echo state netwerk

%********************************************************** %** %** MAIN LINE - program body - %** %**********************************************************

function proces_main_loop()

global TransPeriod, global TrainPeriod, global TestPeriod;

r100initMain(); input01_read_Y_train(); %----- flush the dynamic reservoir ------ for t = TransPeriod r200a_get_Y_forced(t); r210_update_X(t); end %----- record echo state data in M ------ for t = TrainPeriod r200a_get_Y_forced(t); r210_update_X(t); r230_build_M(t); end %----- calculate output weigths ---------- r240_build_Why(); %----- use trained network to predict ---- for t = TestPeriod r210_update_X(t); r200b_calculate_prediction_for_Y(t); end %------------------------------------------ r110showResults();

end

Page 16: Opdracht neurale netwerken echo state netwerk

%********************************************************** %** %** mainline subroutines %** %**********************************************************

function r100initMain %------------ init Whh --------------- global Whh; global N; global Chh; global alfa; Wpre=sprand(N,N,Chh); W0=2*(Wpre-0.5).*(Wpre>0); lambda_max=abs(eigs(W0,1)); W1=W0/lambda_max; Whh=alfa*W1; %------------ init Wyh --------------- global Wyh; global Cyh; W0=sprand(N,1,Cyh); Wyh=2*(W0-0.5).*(W0>0); %------------- init X ------------------ global X; X = random('unif',-1,1,N,1); end

function r110showResults() %out01_show_test_output(); out02_show_MSE(); %out03_show_total_output(); out04_show_test_output_with_train(); end

function r200a_get_Y_forced(t) global Y_train; global Y_ist; Y_ist(t) = Y_train(t); end

function r200b_calculate_prediction_for_Y(t) global Why; global X; global Y_ist; Ycal = (Why')*X; Y_ist(t) = Ycal; end

function r210_update_X(t) global X; global Whh; global Wyh;global Y_ist; X = tanh(Whh*X + Wyh*Y_ist(t-1)); end

function r230_build_M(t) global M; global X; global TransLen; idx = t - TransLen; M(idx,:) = X; end

function r240_build_Why() global M; global TrainPeriod; global Why;global Y_ist; Minv = pinv(M); T = Y_ist(TrainPeriod); Why = Minv*T; end

Page 17: Opdracht neurale netwerken echo state netwerk

%********************************************************** %** %** input %** %**********************************************************

function input01_read_Y_train() global TotLen; global Y_soll; global Y_train; global cycleLen; global Max_Amplitude; global trend_t0; global trend_slope;global Max_noise; for t = 1:TotLen %----- construct Y_soll --------- cyclic_term = Max_Amplitude*sin(t*2*pi/cycleLen); trend_term = trend_t0 + trend_slope*t; Y_soll(t) = cyclic_term + trend_term; %----- construct Y_train -------- noise_term = random('unif',-1,1,1,1).*Max_noise; Y_train(t) = Y_soll(t) + noise_term; end; end

%********************************************************** %** %** output routines %** %**********************************************************

function out01_show_test_output() %*************************************** %** show testtime Y_ist and Y_soll %*************************************** global Y_ist;global Y_soll; global TestPeriod; figure(1) clf xlabel('time') ylabel('GNP') title('predicted and real GNP by time') hold on; plot(TestPeriod,Y_soll(TestPeriod),'b'); plot(TestPeriod,Y_ist(TestPeriod),'r'); legend('Y-soll (correct vaule)','Y-ist (predicted value)'); end

function out02_show_MSE() %*************************************** %** show MSE in train and test period %*************************************** global Y_ist; global Y_soll; global TestPeriod; global TestLen; global TrainPeriod; global TrainLen; %--------- MSE_train = sum((Y_ist(TrainPeriod)-Y_soll(TrainPeriod)).^2)/TrainLen; MSE_test = sum((Y_ist(TestPeriod)-Y_soll(TestPeriod)).^2)/TestLen; Predict_Quality = MSE_train / MSE_test; %--------- fprintf('train MSE = %e \n' ,MSE_train); fprintf(' test MSE = %e \n',MSE_test ); fprintf('predict quality = %6.3f \n\n',Predict_Quality ); end

Page 18: Opdracht neurale netwerken echo state netwerk

function out03_show_total_output() %*************************************** %** plot totale error per epoch %*************************************** global Y_ist;global Y_soll; global TotLen; figure(2) clf xlabel('time') ylabel('GNP') title('GNP by time') hold on; TotPeriod = 1:TotLen; plot(TotPeriod,Y_ist(TotPeriod),'r'); plot(TotPeriod,Y_soll(TotPeriod),'b'); legend('predicted','real'); end

function out04_show_test_output_with_train() %*************************************** %** show testtime Y_train, Y_ist and Y_soll %*************************************** global Y_ist;global Y_soll; global Y_train; global TestPeriod; figure(3) clf xlabel('time') ylabel('BNP') title('predicted and real BNP by time') hold on; plot(TestPeriod,Y_ist(TestPeriod),'r'); plot(TestPeriod,Y_soll(TestPeriod),'b'); plot(TestPeriod,Y_train(TestPeriod),'g'); legend('predicted','real','typical noise'); end

Page 19: Opdracht neurale netwerken echo state netwerk

Bijlage 2 – wijzigingen in my_economic_echos.m Drie functies zijn aangepast. Deze functies staan hier onder. De wijzigingen zijn geel gemarkeerd. function declare_global_data() % ******************************************* % ** parameters that can/must be changed % ******************************************* % --- NN topology parameters ---------------- global N; N = 225; global Chh; Chh = 0.15; global Chy; Chy = 1.00; global Cyh; Cyh = 0.30; global alfa; alfa = 0.75; % --- economic growth parameters --- global trend_t0; trend_t0 = 100; global trend_slope; trend_slope = 0.1; global cycleLen; cycleLen = 20; global Max_Amplitude; Max_Amplitude = 5; global Max_noise; Max_noise = 5; % --- time period parameters ------ global TransLen; TransLen = 100; global TrainLen; TrainLen = 1600; global FlushLen; FlushLen = 2*cycleLen; global TestLen; TestLen = 1*cycleLen; % ******************************************* % ** calculated ranges !!DO NOT CHANGE!! % ******************************************* global TotLen; TotLen = TransLen + TrainLen + FlushLen + TestLen; global TransPeriod; TransPeriod = 2:TransLen; global TrainPeriod; TrainPeriod = (TransLen+1):(TransLen+TrainLen); global FlushPeriod; FlushPeriod = (TransLen+TrainLen+1):(TransLen+TrainLen+FlushLen); global TestPeriod; TestPeriod =

(TransLen+TrainLen+FlushLen+1):(TransLen+TrainLen+FlushLen+TestLen); % ******************************************* % ** type definitions !!DO NOT CHANGE!! % ******************************************* global Whh; Whh = zeros(N,N); global Why; Why = zeros(N,1); global Wyh; Wyh = zeros(N,1); global X; X = zeros(N,1); global M; M = zeros(TrainLen,N); global Y_ist; Y_ist = zeros(TotLen,1); global Y_soll; Y_soll = zeros(TotLen,1); global Y_train; Y_train = zeros(TotLen,1); end

Page 20: Opdracht neurale netwerken echo state netwerk

function proces_main_loop()

global TransPeriod, global TrainPeriod, global TestPeriod; global FlushPeriod;

r100initMain(); input01_read_Y_train(); %----- flush the dynamic reservoir ------ for t = TransPeriod r200a_get_Y_forced(t); r210_update_X(t); end %----- record echo state data in M ------ for t = TrainPeriod r200a_get_Y_forced(t); r210_update_X(t); r230_build_M(t); end %----- calculate output weigths ---------- r240_build_Why(); %----- flush the dynamic reservoir ------ for t = FlushPeriod r200c_get_Y_soll(t); r210_update_X(t); end %----- use trained network to predict ---- for t = TestPeriod r210_update_X(t); r200b_calculate_prediction_for_Y(t); end %------------------------------------------ r110showResults();

end

function r200c_get_Y_soll(t) global Y_soll; global Y_ist; Y_ist(t) = Y_soll(t); end