Kunstmatige intelligentie
Programmeeropgave 4, 2013 — Aandelen

PLAATJE De vierde programmeeropgave (in het voorjaar van 2013) behorende bij het vak Kunstmatige intelligentie gaat over Neurale netwerken.
Het is de bedoeling een eenvoudig Neuraal netwerk (NN) te programmeren met één verborgen laag dat bepaalde kentallen van aandelen kan "voorspellen".

Voor de benodigde data, zie hier voor S&P500 aandelen. Formaat: Date, Company, Open, High, Low, Close, Volume. Voor de zekerheid: het gaat om deze file.
Liefhebbers mogen ook rekenen aan de bitcoin.

Schrijf vervolgens zonodig een klein Perl-programma (voor Perl, zie ook acht sheets in PDF) dat de benodigde kenmerken/attributen uit de originele file opslaat in het gewenste formaat, bijvoorbeeld alle attributen, of juist een samenspel van enkele. Alle waardes moeten omgezet worden naar een getal tussen 0 en 1, bijvoorbeeld door te delen door de maximale waarde van het betreffende attribuut. Waarden tussen 0 en 1 dus, wellicht gescheiden door spaties. Dat geldt ook voor de target-waarde.
Probeer bijvoorbeeld de slotkoers te voorspellen uit de drie andere, al dan niet aangevuld met het volume. Vergelijk dit met een naieve voorspeller als de openingskoers. (Probeer eens 3 verborgen knopen, α = 0.1, en 100000000 voorbeelden.)
Ter inspiratie: converteer.pl.

Tip: maak eerst een netwerk voor het 2-inputs XOR probleem. Gebruik het skelet-programma en bekijk deze hints. Als dat goed gaat, is het tijd voor het echte werk. Zorg er hierbij voor dat de voorbeelden in random volgorde worden aangeboden.

Voor gnuplot zie de eerste opgave. [Het volgende geldt voor een netwerk met twee inputs ...] Maak nu een file plot.p met daarin bijvoorbeeld
     set xrange [0:1]
     set yrange [0:1]
     set pm3d
     splot sin(2*pi*x)*cos(2*pi*y)

En laad deze file in gnuplot met gnuplot> load "plot.p".
Als je een netwerk hebt om deze functie te benaderen, kun je het beste aan het eind van je programma alle benodigde trio's (x,y,netwerkuitvoer) afdrukken in een file (zeg net.uit; één trio per regel), waarbij x met kleine stapjes door het interval [0,1] loopt, en y idem, terwijl netwerkuitvoer de bijbehorende uitvoer van het getrainde netwerk is. In gnuplot kun je eenvoudig een grafiekje van netuitvoer en beoogde functie maken met behulp van:
     gnuplot> splot "net.uit", sin(2*pi*x)*cos(2*pi*y) [En nu weer terug naar algemenere netwerken ...]

Misschien kun je voor netwerken met meer dan twee inputs zo'n mooie 3D plot als volgt maken. Geeft de "gemiddelde fout" bij verschillende aantallen epochs en verschillende aantallen verborgen knopen.

Leg in het verslag ook kort BackPropagation uit, met de formules, en uiteraard een referentie naar Russell en Norvig. Geef duidelijk aan welke input je hebt gebruikt.
In te leveren: geprint verslag (in LaTeX gemaakt; de C++-code en eventueel Perl-code als Appendix, zie verder hier voor opmerkingen over het verslag), en per email: C++- en eventueel Perl-code. Stuur svp geen emails met LaTeX/PostScript/PDF.

Deadline: dinsdag 21 mei 2013; Den Haag: woensdag 22 mei 2013.


Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.

10 april 2013 — http://www.liacs.nl/home/kosters/AI/nn13.html