Het NN heeft een 2- tot 10-tal invoerknopen
(evenveel als er kenmerken zijn; in ieder geval moet 8 kunnen, zie verderop),
één uitvoerknoop,
en een tussen 1 en 40 in te stellen
aantal verborgen knopen. Verder zijn er twee bias-knopen,
één op invoernivo en
één op verborgen nivo.
Gebruik BackPropagation als leermethode;
redelijke waarden zijn wellicht: leersnelheid 0.1 tot 0.9,
aantal verborgen knopen 3 en ... voorbeelden in totaal.
Test allereerst het netwerk op een paar
"eenvoudige" functies van twee variabelen,
bijvoorbeeld
XOR(x,y) voor x,y=0,1,
respectievelijk
f(x,y) = sin(2πx) cos(2πy) voor 0 ⩽ x ⩽ 1 en 0 ⩽ y ⩽ 1.
Besteed hier in het verslag kort aandacht aan.
Nogmaals, het netwerk heeft dus één uitvoerknoop.
Schrijf vervolgens zonodig een klein
Perl-programma
(voor Perl, zie ook
acht sheets in PDF)
dat de benodigde kenmerken/attributen uit de Abalone-file opslaat
in het gewenste formaat, bijvoorbeeld
alle attributen, of juist een samenspel van enkele.
Kun je bijvoorbeeld twee combinaties van attributen maken,
zodat het netwerk toch goed presteert?
In principe zijn er 8 invoeren, waarvan de eerste (een nominaal attribuut)
nog naar een getal tussen 0 en 1 moet worden omgezet.
Waarden tussen 0 en 1 dus, wellicht gescheiden door spaties.
Dat geldt ook voor de target-waarde.
De file zal er ook wel meerdere malen in random-volgorde doorheen moeten, ten einde
genoeg voorbeelden langs te krijgen.
Train daarna het netwerk hierop met BackPropagation,
en geef resultaten van de experimenten. Denk
aan het gebruiken van aparte training-set en test-set.
Ook een simpel statistiekje over de invoerfile doet het goed.
En hoe doet het naieve algoritme (gok het gemiddelde, of
de meest voorkomende) het?
Gebruik gnuplot
om voor het verslag
enkele grafieken te plotten, bijvoorbeeld met verschillende
aantallen verborgen knopen, leersnelheden en
stopcriteria.
Maak 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)
Hierbij kun je zonodig PostScript-uitvoer genereren
met behulp van
gnuplot> set terminal postscript eps enhanced color
gnuplot> set output "file.ps"
vlak voor het (s)plot-commando te geven
(of enhanced monochrome voor grijswaarden-plaatjes).
En dat allemaal in een plot-file, dan hoef je het niet steeds
over te tikken.
Op internet staat alles en meer over gnuplot, bijvoorbeeld
hier of
daar.
Kijk verder in de
LaTeX-handleiding
(Hoofdstuk 4.1) hoe je PostScript-files in LaTeX kunt importeren.
Leg in het verslag ook kort BackPropagation uit, met de formules,
en een referentie naar Russell en Norvig.
In te leveren: geprint verslag (in LaTeX gemaakt; de C++-code als Appendix,
zie verder
hier
voor opmerkingen over het verslag),
en per email: C++- en Perl-code.
Stuur svp geen emails met LaTeX/PostScript/PDF.
Deadline: dinsdag 6 april 2010.
Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.
15 maart 2010 — http://www.liacs.nl/home/kosters/AI/nn10.html