Professional Documents
Culture Documents
Wydział Elektrotechniki
i Informatyki
Sztuczna inteligencja
Projekt
2011-05-24
Robert Żegleń
robert.zeglen@gmail.com
2 EF DI P16 (117803)
SPIS TREŚCI
Wstęp.....................................................................................................................................................3
Temat.................................................................................................................................................3
Zestaw danych....................................................................................................................................3
Rodzaje atrybutów (danych wejściowych):....................................................................................3
Opis problemu....................................................................................................................................4
Sieci neuronowe.....................................................................................................................................4
Ogólne informacje..............................................................................................................................4
Funkcja transferu................................................................................................................................5
Główne topologie SN..........................................................................................................................5
Sposoby uczenia SN............................................................................................................................6
Metoda LVQ...........................................................................................................................................6
Ogólnie o metodzie............................................................................................................................6
Architektura sieci LVQ........................................................................................................................8
Algorytmy uczenia..................................................................................................................................9
Kwantowanie Wektorowe Kohonena (KVQ).......................................................................................9
Adaptacyjne Kwantowanie Wektorowe Kohonena (LVQ)..................................................................9
Podstawowy Algorytm LVQ1..........................................................................................................9
Algorytm LVQ2.1..........................................................................................................................10
Algorytm LVQ3.............................................................................................................................11
Wykonanie...........................................................................................................................................12
Przygotowanie danych wejściowych................................................................................................12
Doświadczenia......................................................................................................................................13
Eksperyment pierwszy..................................................................................................................13
Eksperyment drugi.......................................................................................................................14
Eksperyment trzeci.......................................................................................................................17
Eksperyment czwarty...................................................................................................................18
Wnioski końcowe i podsumowanie......................................................................................................18
Dodatek A.............................................................................................................................................20
Bazowy skrypt dla wersji 7.9.0 aplikacji MATLAB.............................................................................20
Dodatek B.............................................................................................................................................24
Iteracyjna wersja skryptu A (s. 20)....................................................................................................24
Dodatek C.............................................................................................................................................27
Strona 1
Dodatek D.............................................................................................................................................29
Cytowane prace....................................................................................................................................30
Spis ilustracji.........................................................................................................................................31
Strona 2
Rysunek 1 - Shelby GT500
WSTĘP
TEMAT
HTTP://ARCHIVE.ICS.UCI.EDU/ML/DATASETS/AUTO+MPG (1)
ZESTAW DANYCH
Dane zostały wykorzystane przez Rossa Quinlana (1993) do przywidywania zużycia paliwa a cyklu miejskim
w milach na galon. Z użyciem 3 atrybutów o wartościach dyskretnych i 5 przyjmujących wartości ciągłe.
1
http://archive.ics.uci.edu/ml/datasets/Auto+MPG (1)
Strona 3
OPIS PROBLEMU
Ponieważ sam temat zadania, jakie zostało postawione nie był jednoznaczny należało sprecyzować a jaki
sposób należy dane interpretować, oraz który z atrybutów miał być atrybutem rozpoznawanym. Ze względu na
brak możliwość optymalnego dobrania klas dla mpg (spalania), oraz sugestie otrzymane od prowadzącego, jako
atrybut klasowy wybrano pochodzenie.
Zadanie to dla człowieka wydaje się być proste, szczególnie korzystając z atrybutu zawierającego markę i model
samochodu. Ten atrybut niestety również musiał zostać usunięty, ze względu na trudną interpretację
matematyczną takich parametrów jak marka i model, zapisanych w formie ciągu znaków. Po takim
zmodyfikowaniu danych już przeciętny człowiek może mieć trudności z poprawnym rozpoznaniem kontynentu,
z jakiego pochodzi dany pojazd. Tym niemniej zadanie to przedstawia się, jako interesujące.
Korzystając z danych zwierających 398 (w późniejszym etapie pracy 392) rekordów, a dla każdego z nich 7
atrybutów:
Należy zrealizować sieć neuronową typu LVQ, której zadaniem będzie nauczenie się przyporządkowywania
pojazdów do jednej z trzech kategorii. Kategoria ta określa kontynent ich pochodzenia.
SIECI NEURONOWE
OGÓLNE INFORMACJE
2
Sztuczne sieci neuronowe (SSN) są matematycznym, lub obliczeniowym modelem, którego stworzenie zostało
zainspirowane działaniem biologicznych neuronów istniejących w żywych istotach (najlepszym porównaniem
jest tutaj mózg). W większości przypadków SSN są systemami adaptacyjnymi, które zmieniają swoją strukturę
bazując na danych, którymi taka sieć jest uczona.
Strona 4
Neurony wyjściowe
Rysunek - prosty schemat
sztucznej sieci neuronowej
neuronów wejściowych, patrz: Error: Reference source not found), oraz grupę, która stanowi wyjścia
(odpowiedź) sieci neuronowej. Wszystkie pozostałe elementy przetwarzające należą do tak zwanych warstw
neuronów ukrytych.
Jednak w rzeczywistości, model matematyczny SSN jest bardziej rozbudowany (Error: Reference source not
found). Przede wszystkim każde wejście (X1 do Xp) przed zaprezentowaniem go neuronowi jest przemnażane
przez odpowiedni współczynnik wagowy (W 11 do Wph).
Każdy neuron może posiadać wiele wejść, ale jedno wyjście, które może zostać przekierowane do kolejnej
warstwy neuronów, lub stać wyjściem danej SN.
FUNKCJA TRANSFERU
Aby neuron stał się nieco bliższy formie „białej skrzynki”, zamiast „czarnej” - jak dotychczas należy wspomnieć
nieco o przekształceniach matematycznych zachodzących przy przejściu informacji przez dany element
przetwarzający.
Rysunek - Dwuwarstwowa SSN typu feedforward
Wiadomo już, że ilość wejść podawanych neuronowi
Funkcja
przeważnie jest większa niż 1. Na Error: Reference transferu
X1Xj
source not found, gdzie mamy n wejść, każdemu
z nich przypisany jest odpowiadająca waga W. Po Xn SUMA Funkcja
przemnożeniu przez wagi wszystkie wartości są przejścia
sumowane. Kolejnym krokiem, najczęściej jest
Y
przemnożenie otrzymanej sumy przez współczynnik b
danego neuronu. Tak przetworzona informacja trafia,
jako parametr do funkcji aktywacji neuronu.
X∙
GŁÓWNE TOPOLOGIE SN b
Kategoryzowanie sieci według ich topologii Rysunek - Wnętrze neuronu - Funkcja transferu
sprowadza się do rozróżnienia tego jak wyglądają
połączenia w sieci, oraz sposobu rozchodzenia się
w niej informacji. Rozróżniamy dwa główne typy sieci; feedforward, oraz rekurencyjne.
Budowa pierwszych (feedforward) może zostać porównana do grafu skierowanego, a którym nie występują
pętle. Informacje przechodzą od wejścia do wyjścia w jednym kierunku i poprzednie wyjścia nie mają
bezpośredniego wypływu na aktualne wyjścia. Często stosuje się tutaj także algorytm wstecznej
propagacji błędu.3 Sieci rekurencyjne mają połączone wyjście/a z wejściem/ami. Głębsza znajomość rodzajów
tych połączeń nie jest konieczna do zrozumienia niniejszego projektu, więc na wspomnieniu o nich
poprzestaniemy.
SPOSOBY UCZENIA SN
Odpowiedź sieci dla danego wejścia, zależy od struktury połączeń i współczynników wagowych. Ogólnie rzecz
biorąc sposoby połączeń pozostają bez zmian w danej sieci. Korekcji natomiast ulegają zmianie, aby sieć mogła
interpretować wiele funkcji. To, w jaki sposób wagi są modyfikowane zależy od zadania, jakie zostanie
postawione sieci neuronowej, oraz informacji, jakie są dostępne do wykorzystanie w celu nauki sieci.
Wyróżniamy dwa główne podejścia do uczenia sieci. Uczenie nadzorowane i nienadzorowane.
UCZENIE NADZOROWANE
3
Więcej na ten temat: http://www.ai.tresura.pl/other_pages/backprop-en/backprop.html (3)
Strona 5
Sieci przedstawiany jest zestaw wejść i odpowiedni zestaw wyjść. Jeżeli dla danego wejścia otrzymamy inną
odpowiedź niż ta, znajdująca się w zestawie wyjść; wagi sieci są odpowiednio modyfikowane, aby przybliżyć
następnym razem odpowiedź była bliższa tej wymaganej. Istnieje wiele sposobów i algorytmów doboru wag.
Na kolejnych stronach opisane zostaną te występujące w sieci adaptacyjnego kwantowania wektorowego.
UCZENIE NIENADZOROWANE
Tutaj nie są znane konkretne przyporządkowania zestawów wejść. SN stara się pogrupować podobne zestawy
wejść. Wówczas sieć tworzy mapę na której umieszczane są odpowiedni rekordy wejściowe. Przejrzysty
przykład można odnaleźć na: http://itee.uq.edu.au/~cogs2010/cmc/chapters/Introduction/
METODA LVQ
OGÓLNIE O METODZIE
Adaptacyjne kwantowanie wektorowe (a ang. Learning Vector Quantisation LVQ) jest nadzorowaną wersją
kwantowania wektorowego, podobną do Samoorganizujących Map (z ang. Selforganising Maps SOM).
Metoda została stworzona dzięki pracy takich osób, jak: Linde, Gray oraz Kohonen.
Można ją zostać zastosowana do rozpoznawania obrazów, klasyfikacji wieloklasowej, oraz do kompresji danych
np. rozpoznawania mowy, czy przetwarzania obrazów. Będąc metodą nadzorowaną LVQ korzysta ze
wzorcowych (uczących) przyporządkowań wyjściowych dla każdego wektora wejściowego. Algorytmy LVQ nie
zaokrąglają funkcji gęstości dla zbioru próbek klasowych, w przeciwieństwie do wersji nienadzorowanej (VQ)
lub Probabilistycznych sieci neuronowych. LVQ definiuje granice klas na podstawie prototypów, których
parametry określane są za pomocą algorytmów: „najbliższy sąsiad” (ang. Nearest Neighbour NN) oraz
„zwycięzca bierze wszystko”.
Na początku, przestrzeni próbek (danych wejściowych) pokrywana jest wektorami kodującymi (z ang. codebook
vectors CVs). Każdy z nich ma reprezentować obszar oznaczony daną klasą. Każdy CV (codebook vector=wektor
kodujący) może być uważany za prototyp (zalążek) elementu danej klasy.
Taki wektor zlokalizowany jest w przestrzeni danych wejściowych pośrodku danej klasy lub komórki decyzyjnej,
zwanej komórką Woronoja (z ros. Вороной).4
4
Inspiracja: http://www.neural-forecasting.com/lvq_neural_nets.htm. (4)
Strona 6
wektor kodujący klasy
1
wektor kodujący klasy
2
granica klasy
sieć Woronoja
sieć Delonoja
Obszar danych wejściowych jest dzielony na komórki decyzyjne. Podział dokonuje się na płaszczyznach
prostopadłych do linii łączących dwa wektory kodujące (liniach sieci Delonoja (z ros. Делоне); kreska
przerywana na Error: Reference source not found). Płaszczyzny te w przypadku dwóch wymiarów są prostymi
(oznaczonymi kreską ciągłą na Error: Reference source not found), formującymi sieć Woronoja.
Dla szerszego zobrazowania warto dodać, że proste tworzące sieć Woronoja (komórki decyzyjne), są
symetralnymi odcinków tworzących sieć Delonoja. 5 Z kolei zbiór wszystkich wektorów kodujących, zwanych też
wektorami centralnymi, bądź wektorami Woronoja jest określa się jako książkę kodową.
5
Triangulacja Delone: http://pl.wikipedia.org/wiki/Triangulacja_Delone. (6);
Diagram Woronoja http://pl.wikipedia.org/wiki/Diagram_Woronoja. (5)
Strona 7
ARCHITEKTURA SIECI LVQ
X3
Sieci LVQ należą do sieci typu feedforward posiadających jedną ukrytą warstwą neuronów, w pełni połączoną
z warstwą wejściową. Za wektor kodujący można uważać cały ukryty neuron („neuron Kohonena”) lub wektor
wag dla wszystkich wejść KONKRETNEGO neuronu.
Strona 8
Heurystyka oparta jest na funkcji odległości- zazwyczaj używana jest funkcja odległości euklidesowej, która dla
przestrzeni n-wymiarowej wyrażona jest wzorem:
n
√
d ( X , CV ) = ( X 1−CV 1 )2 + ( X 2 −CV 2 )2 +…+ ( X n−CV n )2 =∑ |X ❑ −CV k| , gdzie :
k=1
Na podstawie powyższe zależności porównywany jest wektor wejściowy sieci z reprezentantami klas. Mała
odległość oznacza duże podobieństwo, a co za tym idzie większe prawdopodobieństwo wybrania danej próbki,
jako reprezentanta klasy rodzimej dla najbliższego wektora kodującego. Innymi słowy odszukiwany jest taki CV,
dla którego d(X, CV) jest najmniejsze.
ALGORYTMY UCZENIA
Określanie granic klasowych przez LVQ zależy w dużym stopniu od takich czynników, jak: funkcje odległości,
początkowe pozycje wektorów kodujących (CVs), ich reguy dopasowywania oraz dobór próbek parametrów
wejściowych. Przejdźmy do przestudiowania metod i algorytmów uczących sieci należące do grupy VQ
(wektorów kwantujących).
W tej metodzie nowe wagi kolejnych połączeń w sieci są modyfikowane według zależności:
Ogólnie, za wartość wyjściową dla takiej metody przyjmuje się taką klasę do której należy CV spełniający
zależność: d ¿. Jest to skalarne kryterium podobieństwa. Możemy spotkać się także z kryterium cos(Wi,X),
jednak jego wadą jest konieczność normalizacji wag, aby ich długości były takie same, różniąc się jedynie kątem
pomiędzy nimi. Prawą stronę powyższej zależności implementuje algorytm WTA (Winner takes all).
Wygrywającym neuronem staje się ten, którego d(X, CV) jest najmniejsza.
Istnieją także implementacje korzystające z algorytmu WTM (Winner takes most). Pozwala on skrócić czas
stagnacji podczas procesu uczenia.
Podstawowy algorytm LVQ nagradza poprawnie sklasyfikowane próbki poprzez przesunięcie wektora
kodującego (CV) w ich stronę danego wektora wejściowego (próbki). Natomiast błędne klasyfikacje są „karane”
oddaleniem CV w przeciwną stronę. Wektor przesunięcia jest zależny, co do wartości od współczynnika
uczenia αt. Wraz z postępem uczenia sieci współczynnik ten może być zmniejszany, aby osiągnąć precyzyjniejsze
korekty w dalszych fazach uczenia.
Strona 9
1. Zaprezentowanie sieci kolejnego wektora wejściowego X n, (n – liczba próbek wejściowych)
2. Porównanie klasy C X n przypisanej wektorowi Xn i klasy C W i przypisanej do wektora Wc
(wektor kodujący), oraz odpowiednia korekta wag neuronu.
Jeśli C X =C W ,¿ :W c ( t ) + α t [ X i−W c ( t ) ]
n i
Jeśli C X ≠ C W , ¿ :W c ( t ) −α t [ X i−W c ( t ) ]
n i
Algorytm LVQ1 jest najprostszym stosowanym w sieciach LVQ. W niektórych przypadkach nie pozwala on na
osiągnięcie zadowalającej dokładności sieci. W przypadku błędnego, gdy z powodu losowego ustawiania wag
początkowych dany CV jest błędnie zlokalizowany algorytm ten nie posiada mechanizmów poprawiających
jakość i szybkość pozbywania się takich złych przyporządkowani. Jego atutem jest natomiast szybki spadek
błędu klasyfikacji w początkowych fazach uczenia- w związku z tym zaleca się go do początkowych faz uczenia.
ALGORYTM LVQ2.1
Jego zachowanie jest takie samo jak wersji 1, z jedną różnicą. W procesie uczenia korzystamy z dwóch
wektorów wzorcowych Wi, oraz Wz, które są najbliższe wektorowi X. Przy czym Wi należy do tej samej klasy co
X, a Wz należy do innej. Następnie oba wektory są odpowiednio traktowane: wspólno klasowy przybliżany jest
do próbki X, natomiast ten z innej klasy jest oddalany.
min
( di dz
,
d z di)> s , s=
1−w
1+ w
, w=0.2.. 0.3
2. Adaptacja wag:
W z ( t+1 )=W z ( t)−α t [ X k −W z ( t ) ]W i ( t+1 ) =W i (t ) +α t [ X k −W i ( t ) ] Gdzie :
z−wektor o innej klasie niż X , i−wektor o tej samej klasie co X ,
d z , di −euklidesowe odległości od X dla wektora z oraz i
w− pa rametr nazywany szerokością okna
Algorytm ten najczęściej stosowany jest dopiero po etapie uczenia metodą LVQ1.
Poniżej przedstawione jest działanie tego algorytmu na przykładzie dwuwymiarowej przestrzeni danych
z dwiema klasami (niebieskie, oraz czarne kwadraciki). Czerwonymi obwódkami zaznaczone są elementy źle
sklasyfikowane przez wektory kodujące (krzyżyki). W pierwszy kroku dla wybranego elementu ciągu uczącego
(tutaj widoczne jest wszystkie 6 elementów) modyfikacji ulega wektor źle sklasyfikowany- (wyróżniony na
[
czerwony krzyżyk), przesunięty zostaje o wartość czerwonego wektora (α t X k −W z ( t ) ¿ ]
Strona 10
Rysunek 1 - LVQ2.1 w działaniu 1
Następnie wektor, który należy do tej samej klasy, co aktualnie brana pod uwagę próbka (wyróżniony na
zielono krzyżyk), jest przesuwany w stronę elementu ciągu uczącego, który reprezentuje (
W i ( t+1 ) =W i (t ) +α t [ X k −W i ( t ) ] ¿. Ostatni rysunek przedstawia przestrzeń po 20 epokach. Wektory zostały
dopasowały się do rozłożenia próbek uczących.
ALGORYTM LVQ3
Poprzedni algorytm LVQ2.1 nie uwzględniał sprawdzania warunku, czy wektor W z w trakcie procesu uczenia nie
zmienia swojego położenia tak, że przestaje być dobrym aproksymatorem klasy, do której należy. Potrzeba
wprowadzenia zabezpieczenia ma wypadek takich sytuacji doprowadziła do powstania kolejnej wersji
algorytmu LVQ zwanej LVQ3.
Optymalną wartość ε znajduje się drogą eksperymentalną. Jest ona wprost proporcjonalna do
szerokości „okna” (parametru w). Udoskonalenie wprowadzone w wersji trzeciej w wielu
przypadkach może poprawić zbieżność w stosunku do tej, jaka występuje w algorytmie LVQ2.1.
WYKONANIE
Strona 11
PRZYGOTOWANIE DANYCH WEJŚCIOWYCH
TEORETYCZNIE
Reprezentatywna grupa oryginalnych danych wejściowych znajduje się w dodatku na stronie Error: Reference
source not found. Zgodnie z wcześniej przedstawionym opisem problemu [s. 4] dane wejściowe należy
przygotować, uwzględniając wymagania algorytmów do symulacji sieci neuronowych programu MatLab
(wersja 7.9.0), który zostanie użyty w celu rozwiązania przedstawionego problemu.
Model matematyczny sieci nie jest w stanie „zrozumieć” takich danych jak marki i modele samochodów- nie
można ich odzwierciedlić w postaci liczbowej. Ostatnia kolumna musi zostać usunięta.
Wiemy, że 6 rekordów posiada nieznaną wartość pola #4: Moc silnika. Cokolwiek zostałoby wstawione
w miejsce poprawnej wartości, mogłoby wpłynąć myląco dla procesu uczenia się sieci. Za każdym razem
napotkanie takiego rekordu przez algorytm uczenia rozstrajałby, już częściowo przybliżone położenia wektorów
kodujących. Wspomniane rekordy muszą zostać usunięte.
Dla większości algorytmów Matlaba, symulujących sieci neuronowe dane wejściowe muszą być
znormalizowane, w celu optymalniejszego działania procesu uczenia, (przykładowo w przypadku kryterium
podobieństwa opartego na cosinusie kąta pomiędzy rozpatrywanym wektorem wejściowym i prototypem brak
normalizacji praktycznie uniemożliwia poprawne uczenie i klasyfikację). Normalizacja polega na zmniejszeniu
zakresu, w jaki wpadają wartości atrybutów do przedziału <-1; 1>. Poniższa formuła przedstawia sposób, w jaki
dane są normalizowane:
Format danych przyjmowany przez funkcje, które będą wykorzystywane wymagał, aby kolejne rekordy uczące
znajdowały się w kolumnach. Aby to zagwarantować należy pamiętać o operacji transpozycji na
zaimportowanych do Matlaba danych uczących [s.30].
PRAKTYCZNIE
Niepotrzebne elementy danych wejściowych zostały usunięte. Użyłem do tego celu dwóch prostych wyrażeń
regularnych.
Usunięcie każdej linii zawierającej, jako jedną z wartości znak „?”: [.*\t\?\t.*\r] replace „”
Pozbycie się ostatniej kolumny zawierającej marki i modele samochodów: [(.*\t.*)\t.*] (replace) $1
Tak przygotowane dane zostały ponownie zapisane w postaci tekstowej. Po zaimportowaniu danych do
programu Matlab, otrzymujemy macierz, zawierającą przestrzeń danych wejściowych wraz z ich
przyporządkowaniem klasowym.
Otrzymaną macierz o wymiarach 392x8 należy jeszcze transponować, gdyż, jak już wspomniano funkcje
wykorzystywane w dalszej części projektu wymagają, aby dane były właśnie w postaci <atrybuty x rekordy>.
Dane należy podzielić na ich atrybuty, oraz klasyfikację. Wykonamy to jedną prostą operacja w Matlabie:
P=dane(1:7,:);T=dane(8,:);
Strona 12
DOŚWIADCZENIA
Pełne kody skryptów, wraz z komentarzami zostały umieszone w dodatkach A (s. 21), B(s. 25) oraz C (s. 28)
Podczas wykonywaniu symulacji takiej sieci za pomocą specjalnie przygotowanych do tego aplikacji należy
zwrócić uwagę na dobór nie tylko wspomnianych wcześniej parametrów (ilość neuronów i współczynnika
uczenia). Bardzo istotna okazuje się również epok. Oznacza ona powtórzenia dla procesu uczenia, który zadaną
ilość razy będzie przedstawiał sieci dane wejściowe, pozwalając na korygowanie wartości wag neuronów.
Intuicja sugeruje, żeby wybrać dużą wartość. Niestety możliwości techniczne (czasem wydolność chłodzenia)
niektórych komputerów może nas ograniczać.
EKSPERYMENT PIERWSZY
Warto zwrócić uwagę na to po ilu epokach wartość błędu przestanie w istotny sposób maleć. Na wykresie
poponiżej pionowa oś przedstawia wartość błędu średniokwadratowego. Im ta wartość jest niższa, tym sieć
lepiej się nauczyła. Współczynnik uczenia w tym przypadku jest bardzo niski, co sprawia, że uczenie sieci
powinno trwać bardzo długo. W istocie wartość błędu maleje dość powoli, aż do ok 1k epok. Cały czas znacznie
oscylując. Uwidaczniają się tutaj niedociągnięcia metody LVQ1. Znacznie szybszą zbieżność zapewniłaby
metoda LVQ3, która niestety nie jest zaimplementowana w Matlabie.
-1
10
0 500 1000 1500 2000 2500 3000
3000 Epochs
Rysunek 3 - Wartość Mean Square Error (MSE) od epok, dla wsp. uczenia=0.001, 800 neuronów (osiągnięta sprawność: 75%)
Strona 13
Sprawność, nawet dla tak dużej liczby neuronów nie była jednak zadowalająca. Nie zostało jednocześnie
wykonanych wystarczająco dużo eksperymentów, aby zagwarantować powtarzalność wyników i upewnić, że
nie jest to po prostu przypadek.
Wykona została druga próba dla, tym razem jeszcze większej liczby epok i mniejszego o połowę współczynnika
uczenia.
-1
10
0 1000 2000 3000 4000 5000 6000
6000 Epochs
Rysunek 4 - Wartość Mean Square Error (MSE) od epok, dla wsp. uczenia=0.0005, 800 neuronów (osiągnięta sprawność: 75%(!))
Bardzo podobnie jak poprzednio, wartość błędu malała nieznacznie, tym razem do niecałego 1500 epok.
Wprawne oko może zauważyć duży spadek ilości błędów na samym początku wykresu, gdzie na poprzednim nie
było widać aż tak drastycznego spadku na początku (nawet biorąc pod uwagę dwukrotnie większą skalę na osi
poziomej). Wpływ na to mogą mieć w obu doświadczeniach inne początkowe (losowo dobierane przy
inicjalizacji sieci) wartości współczynników wagowych.
WNIOSKI CZĘŚCIOWE 1
Duża liczba epok nie poprawia praktycznie w żaden sposób sprawności sieci. Oznacza to, że do osiągnięcia
maksimum swoich możliwości sieć nie wymaga kilku tysięcy epok.
EKSPERYMENT DRUGI
Kolejnym eksperymentem była próba zdobycia większej ilości informacji, w którym kierunku doboru
pozostałych współczynników należy zmierzać.
Poniższa tabela przedstawia wartości wektorów przygotowanych do podania skryptowi ze strony [25]. Istotną
zmianą, jaka w nim nastąpiła względem poprzedniego to wielokrotne powtarzanie eksperymentu dla iloczynu
Strona 14
wektorowego poniższych danych. Oznacza to, że dla np. siedmiu neuronów wykonane zostało 8 różnych
doświadczeń, z czego każde z innym współczynnikiem uczenia.
Epoki = 400
neurony = współczynniki =
7 0,07
150 0,1
392 0,2
600 0,3
800 0,4
0,5
0,6
0,7
Uważa się, że powinno zostać wykonanych więcej niż 7 powtórzeń każdego z tych eksperymentów, aby
uzyskany średni wynik mógł być wiarygodny. Łatwo wówczas obliczyć, że czas wykonania tych 40
eksperymentów wzrósłby 8-io krotnie. Ze względu na ograniczone możliwości prywatnego sprzętu
niektórych studentów częściowe odstąpienie od tej reguły może być konieczne. Dlatego każdy
eksperyment został wykonany trzykrotnie. Ten sam powód, który zmusił Nas do zmniejszenia
wiarygodności kosztem, właśnie czasu, przyczynił się do wybrania właśnie tylko jednej wartości epok.
Aby czytelnik mógł zobrazować sobie jak ważną kwestią był tutaj czas obliczania doświadczeń, warto
dodać, że czas wykonywania tych 120 iteracji wynosił ok 4 doby ciągłej pracy komputera
(2xC2D,1.4GHz).
W wyniku tego doświadczenia można było wykluczyć używanie małej ilości neuronów (przedział dziesiątek
i mniej). Dla użytej tutaj liczby siedmiu neuronów wszystkie próbki były przyporządkowywane do pierwszej
klasy. Tylko dzięki temu, że klasa ta była najbardziej liczna (62.5% ogółu) sprawność w takich przypadkach była
tak wysoka i wynosiła właśnie 62.5%. Daje to jednocześnie obraz tego jak słabym był wynik eksperymentu
pierwszego, gdzie sprawność początkowa wzrosła jedynie o 12.5%.
Rysunek 5 - Przydział klasowy dla 250 epok, 7 neuronów i dowolnego eta (współczynnika uczenia)
Strona 15
Kolejną ważną informacją uzyskaną z tego eksperymentu jest maksymalna wartość współczynnika uczenia, jaka
przynosi sensowne wyniki. Otóż dla wszystkich kombinacji ilości neuronów współczynnik 0.2 i wyższe po
pewnej ilości epok zaczynały, dawać albo stałą wartość błędu, lub w przybliżeniu wartość ta zaczynała liniowo
wzrastać. Dobrym przykładem podobnego zachowania jest poniższy wykres.
WNIOSKI CZĘŚCIOWE 2
Na podstawie tego eksperymentu udało się określić w miarę pewne granice współczynnika uczenia, których nie
należy przekraczać.
Najlepsze, oraz najstabilniejsze wyniki udało się uzyskać dla eta=0.07 i 600 ukrytych neuronów (oczywiście przy
400 epokach), niemniej jednak ten drugi parametr wpływał wręcz niezauważalnie na wyniki. Poniżej
porównanie dwóch przebiegów procesu uczenia.
Strona 16
Istotne jest, aby czytelnik był świadomy, że podana pod wykresami sprawności jest wartością bardzo
przybliżoną. Ponieważ gdyby przykładowo odczytano jedną epokę wcześniej, wartości mogłyby być dokładnie
odwrotne. Taka niestabilność sieci wynika w dużym stopniu z zasady działania sieci LVQ, gdzie neurony
współzawodniczą między sobą. Po zaprezentowaniu im danej próbki dostosowują się tylko do jej położenia-
często wycofując się z centrum danej komórki klasowej. Oczywiście nie bez znaczenia są także same dane, które
mogą nie pozwalać dać się sklasyfikować bez błędnych klasyfikacji do odpowiednich im komórek klasowych.
EKSPERYMENT TRZECI
Poniżej znajdują się wypisane są współczynniki, jakie zostały użyte podczas kolejnego uruchomienia tego
samego skryptu ze strony 25.
Epoki = 250
neurony = współczynniki =
7 0.0700
150 0.0500
392 0.0300
800 0.0100
0.1000
Należy się nieco wytłumaczenia podanej liczby epok. Na zaniżenie jej wartości wpłynął już wspominany [15]
czynnik czasowy. Oczywiście nie powinno się go obniżać, bez jakiegokolwiek uzasadnienia, że nie wpłynie on
zbyt negatywnie, na jakość wyników. Należy tutaj zwrócić także uwagę także na współczynniki uczenia, których
dość niskie wartości powinny przyczynić się wręcz do zwiększenia liczby epok. Tym bardziej sądząc po wykresie
nr Error: Reference source not found, gdzie dla 400 epok i eta= 0.07, zależność SSE(epok) miała tendencję
malejącą. Oznaczałoby to, że wartość błędu mogłaby jeszcze przez pewien czas maleć wraz ze wzrostem ilości
epok.
Konkludując; wartość epok w tym eksperymencie nie była dobrana należycie. Sprawdźmy jednak, jakie
przyniósł on wyniki.
Strona 17
Rysunek - Trójwymiarowy wykres zależności sprawności sieci od współczynnika uczenia i ilości
neuronów, dla 250 epok (const)
WNIOSKI CZĘŚCIOWE 3
Powyższy wykres wyraźnie potwierdza, że sprawność dla mniej niż 150 neuronów jest bardzo niska. Niestety
nie jesteśmy w stanie określić dokładnie nachylenia tego wykresu w przedziale <7;150> neuronów z powodu
braku danych. Jednocześnie da się zauważyć pewne maksimum (77,7%) przy wartości eta=0.05 i 800
neuronach. Można, więc uznać, tą wartość za dobrą podstawę do kolejnych eksperymentów. Z uwzględnieniem
oczywiście zwiększenia nieco liczby epok, oraz może ilości neuronów, co może pomóc utrzymać tą tendencję
wzrostową sprawności. Nieco ponad normę może wydawać się wartość (78%) dla eta=0.1 s1=800. Można
jednak potraktować to, jako wartość nieco przypadkową, ponieważ dla tego samego eta i mniejszego s1,
sprawność spada dużo szybciej niż dla wartości eta, przed chwilą uznanej za optymalną.
EKSPERYMENT CZWARTY
Na podstawie wykresu wygenerowanego po poprzednim doświadczeniu wykonane zostało kolejne. Tym razem
skrypt dla programu Matlab został także nieco zmodyfikowany. Zmieniony został sposób, w jaki
przygotowywane są parametry kolejnych iteracji.
Ilość neuronów jest stała przez cały eksperyment i wynosi 1k. Taka wartość miała zapewnić, że ewentualne
tendencje wzrostowe, które zarysowywały się na wykresie ze strony Error: Reference source not found będę
mogły być teraz uchwycone. Przedział wartości współczynników uczenia został zawężony, do zakresu, w którym
Strona 18
poprzednio dało się zaobserwować wysoką sprawność. Tym razem jednak wraz ze wzrostem eta zwiększana
byłą także ilość epok. Miało to na celu danie czasu sieci neuronowej na uzyskanie lepszej zbieżności.
Niestety powyższy wykres nie daje Nam już tak dużo informacji jak poprzedni. Niemniej jednak wyraźnie
pokazuje, że lepszym wyborem byłby współczynnik o wartości 0.1, dla którego sprawność wynosi blisko 80%
Rozpoznawanie kraju pochodzenia samochodów na podstawie danych [3],[30] za pomocą sieci LVQ zostało
zrealizowane, choć w mało zadowalającym stopniu. Maksymalną osiągniętą i powtarzalną sprawnością sieci
była wartość oscylująca przy wartości 80%. Śmiało możemy stwierdzić, że na wysoką sprawność nie wpływała
ilość epok większa od 1 tysiąca. Najmocniejszy wpływ miało manipulowanie ilością neuronów, choć jeżeli te
zostały dobrane powyżej pewnej wartości przestawały mieć tak istotną rolę. Wówczas to współczynnik uczenia
mógł być manipulowany w celu uzyskania lepszego wyniku. Jeśli chodzi o liczbę epok, jej optymalna wartość
wydaje się kształtować na poziomie 400. Współczynnik uczenia zdecydowanie powinien wynosić 0.1. Jeśli
zmniejszymy współczynnik uczenia minimalnie do ok 0.3 warto podnieść nieco liczbę epok, aby sieć zyskała czas
na dopasowanie wag.
Strona 19
Moim osobistym zdaniem w pakiecie Matlab metoda LVQ jest dość słabo oprogramowana. Największym
minusem byłby brak automatycznego zmniejszania współczynnika uczenia wraz z postępem epok (lub
zmniejszaniem wartość MSE). Piszę to, ponieważ takie zalecenie było wyraźnie wspomniane przez dr. Inż. Teuvo
Kohonena w Jego dokumentacji dotyczącej kwantyzacji wektorowej. Faktem jest, że napisanie odpowiedniego
skryptu uzupełniającego, z doświadczeniem, jakie zdobyłem podczas pracy nad tym projektem, nie jest niczym
trudnym. Niemniej odpowiednie dobranie wartości delta tego współczynnika wymagałoby znacznie stabilniej
działającego pod obciążeniem komputera. Dużym atutem byłby też mocniejszy procesor i natywna obsługa
wielu rdzeni przez Matlaba.
Pewnym niedociągnięciem z mojej strony jest nie wykonanie żadnych doświadczeń z wykorzystaniem metody
learnlv2, jako następnej po wstępnym ustaleniu wag metodą learnlv1. Jednak biorąc pod uwagę czas jeden
semestr studiów i maksymalną objętość projektu jest to nieosiągalne.
Na płycie CD załączonej do projektu znajdują się wszystkie wyniki eksperymentów pozwalające na dużo bardziej
wnikliwą analizę działania algorytmu Nienadzorowanego Kwantowania Wektorowego. Znajdują się tam także
całe skrypty uczące, oraz krótkie służące między innymi do przygotowywania danych z poszczególnych etapów
uczenia do przedstawienia na wykresach 3d.
Strona 20
DODATEK A
Strona 21
50 %% Podanie maksymalnej wartosci błedu
51 userInput=input(['Podaj maksymalną wartość błędu: [',num2str(eta),']:
']);
52 if ~isempty(userInput)
53 eta=userInput;
54 clear siec;
55 changed=1;
56 end
57 %% Czy reinicjalizować sieć
58 if(exist('siec','var'))
59 userInputB=input('Reinicjalizować sieć? T/N [T]: ', 's');
60 if (isempty(userInputB) || 't'==lower(userInputB));
61 reinit=1;
62 else
63 reinit=0;
64 end
65 else
66 reinit=1;
67 end
68
69
70 %% Odczytanie wskaźników, kopia danych wejściowych
71
72 Tvec = ind2vec(T); % przekonwertowanie wektora
73 % na wektor z zapisanymi tymi wartościami
74 % [(klasa, numer kol.) 1]
75 %
76 % np.
77 % vec = [1 0 0 0; 0 0 1 0; 0 1 0 1]
78 % ind = vec2ind(vec)
79 %
80 %
81 %Pnt = Pn; % dodać sprawdzanie czy jest Pn, czy jest P
82 % i pytanie czy znormalizować
83 % to samo dla T powyżej, czy rekordy są
w kolumnach?
84 % i czy odwrócić
85 %tylko kopia danych (w końcu ramu Nam dostatek
86
87
88 PR = minmax(Pn); % zmapowanie wartości min i max danych wejściowych
89 % potrzebne dla funkcji tworzącej sieć LVQ (newlvq)
90
91 percentage=(histc(T,1:3)/length(T)); % obliczenie typowego składu
procentowego klas
92
93 %% Sprawdzenie poprawności danych wejściowych
94 % useless! if size(pr,2) ~= 2, error('NNET:Arguments','Macierz PR
(min/max) musi mieć dwie kolumny.'), end
95 % if size(pr,1) ~= size(w1,2), error('NNET:Arguments','PR and W1 sizes
do not match.'), end
96 % if size(w1,1) ~= size(w2,2), error('NNET:Arguments','W1 and W2 sizes
do not match.'), end
97
98 %% Inicjalizacja/utworzenie sieci funckją z NNT2
99
100
101
102 % NEWLVQ creates an LVQ layer and here takes four arguments: Rx2
matrix of min
103 % and max values for R input elements, number of hidden neurons,
Strona 22
element vector
104 % of typical class percentages, and learning rate,
105 %/The first-layer weights are initialized to the centers of the input
106 %ranges with the function midpoint. The second-layer weights have 60%
107 %(6 of the 10 in Tc above) of its columns with a 1 in the first row,
108 %(corresponding to class 1),and 40% of its columns will have a 1 in
the second row (corresponding to class 2).
109
110
111 if(reinit) % warunek sprawdza, czy reinicjalizować sieć (jeśli
użytkownik nie zmieni parametrów wejściowych nie ma takiej potrzeby
112 % !! UWAGA! nie uwzględnia przypadku zmiany samych danych
113 % wejściowych. Ta opcja nie jest uwzględniona w cały
skrypcie
114
115 siec = newlvq(PR,s1,percentage,eta); % poeksperymentować z różnymi
metodami uczenia (piąty parametr)
116 reinit=0;
117 sprintf('Network "siec" (re)initialized, "reinit" set to 0')
118
119 % Ponieważ do inicjalizacji jest tutaj użyta funkcja
midpoint, a dane zostały znormalizowane <-1,1>
120 % wartości wag dla wejsć siec.IW{1,1} będą wynosiły 0
121
122 % siec.LW{2,1}
123 %
124 % Na początku (z procentowych wartości
125 % Jeżeli 1 jako element 1:4 - klasyfikuj element do klasy
pierwszej (pierwszy wiersz)
126 % Jeżeli 1 element numer 5 - klasyfikuj jako kl.2
127 % Jeżeli jedynki na miejcach 6,7 - klasa 3 (odpowiada jej
trzeci wiersz
128 %
129 end
130
131
132 %siec = nnt2lvq(PR,W1,ones(1,s2)/s2,eta);
133
134 %% Uczenie sieci metodą learnlv1
135
136 siec.trainParam.epochs = ep;
137 [siec, TR1] = train(siec, Pn, Tvec);
138
139 %% Symulacja i konwersja wyników do formatu pełnej macierzy
140
141 Y = sim(siec, Pn);
142 Yc = vec2ind(Y);
143
144 %% Zapisanie parametrów do zmiennych z wynikami eksperymentów
145 %postanowiłem nie używać struktur ze względu na brak możliwości
wielopoziomowego indeksowania
146 %(na wypadek, gdyby okazało się w przyszłości potrzebne)
147 %wyniki(n,:)=[s1,ep,eta,Sprawnosc];
148 %odpowiedzi(n,:,:)=[T' Yc' (T-Yc)' (abs(T-Yc)>0.5)'];
149
150 %% Wyświetlenie i porównanie wyników. Błedy.
151 odp=[T' Yc' (T-Yc)' (abs(T-Yc)>0.5)'];
152 %% Wyświetlenie wyniku iteracji.
153
154 sprawnosc=(1-sum(abs(T-Yc)>0.5)/length(Pn))*100;
155 sprintf('Ilość ukrytych neuronów: %d \nIlość iteracji: %d\nMaksymalna
Strona 23
wartość błędu: %d\nSprawność: %d\n', s1, ep, eta, sprawnosc)
156
157
158
159 % %% Uczenie learnlv2 tego pomysłu nie rozwijam
160 % userInputB=input('Trenować za pomocą learnlv2? T/N [T]: ', 's');
161 % if (isempty(userInputB) || 't'==lower(userInputB));
162 %
163 % siec2 = newlvq(PR,s1,percentage,eta, 'learnlv2');
164 % %[siec, TR2] = train(siec, Pnt, Tvec);
165 % %[dW,LS]=leranlv2();
166 %
167 % end
168 % clear userInputB;
169
170
171
172 %% Interakcja - pytanie o kolejne uruchomienie
173 userInputB=input('Kolejna próba? T/N [T]: ', 's');
174 if ~(isempty(userInputB) || 't'==lower(userInputB));
175 clear userInput userInputB rpt reinit PR Tvec TY percentage;
176 save samochody;
177 break;
178 end end
Strona 24
DODATEK B
Strona 25
46
47 for k=1:rpt(4)
48 tic();
49
50
51
52 clear siec TR1 Yvec Yind;
53 siec = newlvq(PR,neurony(nr,1),percentage,wspolczynniki(w,1));
54 %sprintf('Network "siec" (re)initialized, "reinit" set to 0')
55
% Ponieważ do inicjalizacji jest tutaj użyta funkcja
56 midpoint, a dane zostały znormalizowane <-1,1>
57 % wartości wag dla wejsć siec.IW{1,1} będą wynosiły 0
58
59 % siec.LW{2,1}
60 %
61 % Na początku (z procentowych wartości
% Jeżeli 1 jako element 1:4 - klasyfikuj element do klasy
62 pierwszej (pierwszy wiersz)
63 % Jeżeli 1 element numer 5 - klasyfikuj jako kl.2
% Jeżeli jedynki na miejcach 6,7 - klasa 3 (odpowiada jej
64 trzeci wiersz
65 %
66
67 %% Uczenie sieci metodą learnlv1
68
69 siec.trainParam.epochs = epoki(e,1);
70 [siec, TR1] = train(siec, Pn, Tvec);
71 time=toc();
72
73 %% Symulacja i konwersja wyników do formatu pełnej macierzy
74
75 Yvec = sim(siec, Pn);
76 Yind = vec2ind(Yvec);
77
78 %% Zapisanie parametrów do zmiennych z wynikami eksperymentów
%postanowiłem nie używać struktur ze względu na brak możliwości
79 wielopoziomowego indeksowania
80 %(na wypadek, gdyby okazało się w przyszłości potrzebne)
wyniki_temp(k,:)=[neurony(nr,1) epoki(e,1) wspolczynniki(w,1) time (1-
81 sum(abs(Tind-Yind)>0.5)/length(Pn))*100];
odpowiedzi_temp(k,:,:)=[Tind' Yind' (Tind-Yind)' (abs(Tind-
82 Yind)>0.5)'];
83
84
85
86 %% Zapisanie wykresów do plików
indeks=sprintf('%d%d%d%d_%d',idivide(n,int32(1000),'floor'),
idivide(rem(n,int32(100)),int32(100),'floor'),
87 idivide(rem(n,int32(100)),10,'floor'), rem(n,10),k);
88 conf=plotconfusion(Tvec,Yvec);
89 perf=plotperform(TR1);
90 roc=plotroc(Tvec,Yvec);
91 print(conf,'-dpng',['.\images\confusion\' indeks '_confusion']);
Strona 26
92 print(perf,'-dpng',['.\images\performance\' indeks '_performance']);
93 print(roc,'-dpng',['.\images\ROC\' indeks '_ROC']);
94 delete(conf, perf, roc);
95 clear conf perf roc indeks;
96 % Tind_temp(k,:)=vec2ind(Tvec);
97 % Yind_temp(k,:)=vec2ind(Tvec);
98
99 %% Wyświetlenie i porównanie wyników. Błedy.
10 %odp=[Tind' Yind' (Tind-Yind)' (abs(Tind-Yind)>0.5)'];
0
10
1
10
2
10 format short
3
10 Powtorzenie_nr=k %#ok<NOPTS>
4
10 neurony_epoki_wspolcz.ucz_czas_sprawnosc=mean(wyniki_temp,1)
5 %#ok<NOPTS>
10
6
10
7
10 end
8
10
9
11
0
11 %% zapisanie uśrednionych wyników do zmiennej wyniki_apx
1
11 wyniki_apx(n,:)=[mean(wyniki_temp,1) (max(wyniki_temp(:,4))-
2 min(wyniki_temp(:,4))) (max(wyniki_temp(:,5))-min(wyniki_temp(:,5)))];
11 odpowiedzi_apx(n,:,:)=mean(odpowiedzi_temp,1);
3
11 clear wyniki_temp odpowiedzi_temp;
4
11 n=n+1;
5
11 end
6
11 end
7
11 end
8
Strona 27
DODATEK C
1 %% LVQ dla samochodów NNT2
2 % IMPLEMENTACJA PĘTLI DOŚWIADCZEŃ
3 mkdir images
4 cd images
5 mkdir ROC
6 mkdir performance
7 mkdir confusion
8 cd ..
9
10 %% Domyśln. wart. + load
11 format compact;
12 format short;
13 sr=3
14
15 powtorzenia=size(petle,1);
16 wyniki_temp=zeros(sr,5);
17 odpowiedzi_temp=zeros(sr,length(Tind),4);
18 wyniki_apx=zeros(size(petle,1),7);
19 odpowiedzi_apx=zeros(size(petle,1),length(Tind),4);
20 n=int32(1);
21 Tvec = ind2vec(Tind);
22 PR = minmax(Pn);
23 percentage=(histc(Tind,1:3)/length(Tind));
24
25 format short
26
27 for j=1:powtorzenia
28 sprintf('---')
29 sprintf('\n---\nPowtorzenie: [%d]\nNeurony: %d \nWspolczynniki: %d\
nEpoki: %d\n---\n',j,petle(j,1),petle(j,2),petle(j,3))
30 for k=1:sr
31 tic();
32
33
34
35 clear siec TR1 Yvec Yind;
36 siec = newlvq(PR,petle(j,1),percentage,petle(j,2));
37 %sprintf('Network "siec" (re)initialized, "reinit" set to 0')
38
39
40 %% Uczenie sieci metodą learnlv1
41
42 siec.trainParam.epochs = petle(j,3);
43 [siec, TR1] = train(siec, Pn, Tvec);
44 time=toc();
45
46 %% Symulacja i konwersja wyników do formatu pełnej macierzy
47
48 Yvec = sim(siec, Pn);
49 Yind = vec2ind(Yvec);
Strona 28
50
51 %% Zapisanie parametrów do zmiennych z wynikami eksperymentów
52 %postanowiłem nie używać struktur ze względu na brak możliwości
wielopoziomowego indeksowania
53 %(na wypadek, gdyby okazało się w przyszłości potrzebne)
54 wyniki_temp(k,:)=[petle(j,1) petle(j,3) petle(j,2) time (1-
sum(abs(Tind-Yind)>0.5)/length(Pn))*100];
55 odpowiedzi_temp(k,:,:)=[Tind' Yind' (Tind-Yind)' (abs(Tind-
Yind)>0.5)'];
56 TRY(j,k)=TR1;
57 save samochody_v2.mat
58
59
60 %% Zapisanie wykresów do plików
61 indeks=sprintf('%d%d%d%d_%d',idivide(n,int32(1000),'floor'),
idivide(rem(n,int32(100)),int32(100),'floor'),
idivide(rem(n,int32(100)),10,'floor'), rem(n,10),k);
62 conf=plotconfusion(Tvec,Yvec);
63 perf=plotperform(TR1);
64 roc=plotroc(Tvec,Yvec);
65 print(conf,'-dpng',['.\images\confusion\' indeks '_confusion']);
66 print(perf,'-dpng',['.\images\performance\' indeks '_performance']);
67 print(roc,'-dpng',['.\images\ROC\' indeks '_ROC']);
68 delete(conf, perf, roc);
69 clear conf perf roc indeks;
70 % Tind_temp(k,:)=vec2ind(Tvec);
71 % Yind_temp(k,:)=vec2ind(Tvec);
72
73 %% Wyświetlenie i porównanie wyników. Błedy.
74 %odp=[Tind' Yind' (Tind-Yind)' (abs(Tind-Yind)>0.5)'];
75
76 format short
77 Powtorzenie_nr=k %#ok<NOPTS>
78 neurony_epoki_wspolcz.ucz_czas_sprawnosc=mean(wyniki_temp,1)
%#ok<NOPTS>
79
80
81 end
82
83
84 %%
85 wyniki_apx(n,:)=[mean(wyniki_temp,1) (max(wyniki_temp(:,4))-
min(wyniki_temp(:,4))) (max(wyniki_temp(:,5))-min(wyniki_temp(:,5)))];
86
87 odpowiedzi_apx(n,:,:)=mean(odpowiedzi_temp,1);
88 save samochody_v2.mat
89 clear wyniki_temp odpowiedzi_temp;
90 n=n+1;
91 end
Strona 29
DODATEK D
{...}
Strona 30
CYTOWANE PRACE
1. UCI. UCI Machine Learning Repository. Machine Learning Repository. [Online] University of California, Irvine,
School of Information and Computer Sciences. [Zacytowano: 22 5 2011.]
http://archive.ics.uci.edu/ml/datasets/Auto+MPG.
2. Wikipedia contributors. Artificial neural network - Wikipedia. Artificial neural network. [Online] 430345218,
Wikipedia, The Free Encyclopedia. [Zacytowano: 22 05 2011.] http://en.wikipedia.org/w/index.php?
title=Artificial_neural_network&direction=next&oldid=427435555.
3. Bernacki Mariusz, Włodarczyk Przemysław i Gołda Adam. Neural networks and artificial inteligence in
electronics. [Online] [Zacytowano: 22 05 2011.]
http://www.ai.tresura.pl/other_pages/backprop-en/backprop.html.
4. Centre for Forecasting, Lancaster University Management School, Lancaster LA1 4YF, UK. LVQ Neural Nets.
Portal on Forecasting with artificial neural networks. [Online] [Zacytowano: 27 05 2011.] http://www.neural-
forecasting.com/lvq_neural_nets.htm.
5. Wikipedia contributors. Diagram Woronoja - Wikipedia. Diagram Woronoja. [Online] Wikipedia, The Free
Encyclopedia. [Zacytowano: 22 05 2011.] http://pl.wikipedia.org/wiki/Diagram_Woronoja.
6. —. Triangulacja Delone - Wikipedia. Triangulacja Delone. [Online] Wikipedia, The Free Encyclopedia.
[Zacytowano: 22 05 2011.] http://pl.wikipedia.org/wiki/Triangulacja_Delone.
Strona 31
SPIS ILUSTRACJI
Rysunek 11 - Wartość Mean Square Error (MSE) od epok, dla wsp. uczenia=0.001, 800 neuronów....................13
Strona 32