You are on page 1of 33

Politechnika Rzeszowska

Wydział Elektrotechniki
i Informatyki

Katedra Informatyki i Automatyki

Sztuczna inteligencja
Projekt

Temat: Zrealizować sieć neuronową LVQ uczącą się


rozpoznawania samochodów

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

ZREALIZOWAĆ SIEĆ NEURONOWĄ LVQ UCZĄCĄ SIĘ ROZPOZNAWANIA

SAMOCHODÓW Z WYKORZYSTANIEM DANYCH ZAWARTYCH NA

HTTP://ARCHIVE.ICS.UCI.EDU/ML/DATASETS/AUTO+MPG (1)

ZESTAW DANYCH

Przybliżone tłumaczenie oryginalnego załącznika do danych:

Powyższy zestaw danych jest nieco zmodyfikowaną wersją zestawu zamieszczonego


w bibliotece StatLib. Podczas wykorzystania danych do przewidywania atrybutu zużycia paliwa, 8 oryginalnych
rekordów zostało usuniętych, ponieważ nie posiadały atrybutu „mpg”.

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.

 Liczba rekordów: 398


 Liczba atrybutów: 9 (włączając podział klasowy)

RODZAJE ATRYBUTÓW (DANYCH WEJŚCIOWYCH):

1. Zużycie paliwa w cyklu miejskim wyrażone w milach na galonie (wartość ciągła)


2. Liczba cylindrów [wartość dyskretna, wielowartościowa]
3. Pojemność skokowa silnika [cale sześcienne] (wartość ciągła)
4. Moc silnika [konie mechaniczne] (wartość ciągła) - występuje 6 brakujących wartości
5. Masa [funty] (wartość ciągła)
6. Przyspieszenie [sekundy na 100 km]
7. Rok modelu [dwie ostatnie cyfry roku]
8. Pochodzenie
o ‘1’:Amerykańskie
o ‘2’:Europejskie
o ‘3’:Azjatyckie
9. Marka i model samochodu [ciąg znakowy] 1

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:

1. Zużycie paliwa w cyklu miejskim wyrażone w milach na galonie (wartość ciągła)


2. Liczba cylindrów [wartość dyskretna, wielowartościowa]
3. Pojemność skokowa silnika [cale sześcienne] (wartość ciągła)
4. Moc silnika [konie mechaniczne] (wartość ciągła) (*występuje 6 brakujących wartości*)
5. Masa [funty] (wartość ciągła)
6. Przyspieszenie [sekundy na 100 km]
7. Rok modelu [dwie ostatnie cyfry roku]

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.

Aby najlepiej ukazać budowę takiej sieci najlepiej porównać ją


do jej biologicznego odpowiednika. Na Error: Reference
source not found zakreślono kilka przykładowych neuronów.
Linie rozchodzące się od tych centrów są połączeniami
nerwowymi (zwanymi przez biologów synapsami
i dendrytami), przez które przepływają informacje z i do
neuronu.

Analogicznie do neuronów spotykanych w biologii, ich Neurony wejściowe


Rysunek - dynamicznie modelowane
sztuczne modele, także posiadają wzajemne połączenia.
neurony mózgowe człowieka
W SSN wyróżniamy dodatkowo grupę neuronów, które
otrzymują na swoich wejściach wartości prezentowane sieci (grupa
2
(ukryta) warstwa neuronów(2)
http://en.wikipedia.org/w/index.php?title=Artificial_neural_network&direction=next&oldid=427435555

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

komórka Woronoja = obszar klasowy/decyzyjny

Rysunek - Teselacja przestrzeni wejściowej w regiony klasowe/decyzyjne w przestrzeni dwu-


wymiarowej.

JAK „POWSTAJĄ” KOMÓRKI DECYZYJNE?

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

Rysunek - Architektura sieci LVQ

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.

Uczenie polega na modyfikowaniu


wag zgodnie z regułami
adaptacyjnymi, a co za tym idzie;
zmianie pozycji wektora kodującego
(CV) w przestrzeni wejściowej.
Granice klasowe są odcinkami na
prostych będących symetralnymi
linii sieci Delonoja; w związku z tym
zmieniają się podczas procesu
uczenia (zmieniania współrzędnych
Rysunek - Architektura pojedynczego neuronu (wektora
wektorów kodujących).
kodującego) sieci LVQ
Teselacja powodowana przez
wektory kodujące jest tylko wtedy optymalna, gdy wszystkie dane wejściowe w jednej komórce rzeczywiście
należą do tej samej klasy.
Po zakończeniu etapu uczenia, klasyfikacja bazuje na otoczeniu zaprezentowanych próbek w przestrzeni
wejściowej: klasyfikator przydziela tą samą etykietę klasy dla wszystkich próbek, które wpadają w tą samą
teselację- komórkę sieci Woronoja (etykietą staje się etykieta prototypu dla danej próbki, czyli najbliższego jej
wektora kodującego).

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

X n−współrzędna n−tegowymiaru wektora wejściowego ( próbki )


CV n−współrzędnan−tego w ymiaru wektora kodującego( prototypu klasy)

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).

KWANTOWANIE WEKTOROWE KOHONENA (KVQ)

W tej metodzie nowe wagi kolejnych połączeń w sieci są modyfikowane według zależności:

W ¿ =W ¿ +η ( t ) ( X μn−W ¿ ) , gdzie:η ( t )−współczynnik uczenia(η−eta) ,t−numer iteracji ,


X μn−wartość n−tej cechy μ−tego wzorca ( μ−mu )
W n , i−wartość wagowa połączenia wejściowego n z wyjściem i−tego neuronu

ADAPTACYJNE KWANTOWANIE WEKTOROWE KOHONENA (LVQ)

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 LVQ1

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

3. Pozostałe wektory nie ulegają zmianie.

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.

1. Wyznaczane jest okno, do którego wpada dany wektor wejściowy wg zależności:

 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

Rysunek 2 - LVQ2.1 - w działaniu 2

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.

Algorytm uczący wygląda analogicznie do LVQ2, z wprowadzoną dodatkową zależnością:

W k =( t+1 ) =W k ( t ) + εα ( t ) [ X ( t )−W k ( t ) ]Gdzie :k ∈ { z , i } gdy X ,W z , W i należądo tej samej klasy .

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:

( Y max −Y min )∗X− X min


Y= +Y min , gdzie :X −wartość oryginalna ,
X max −X min
X max , X min −wartości maksymalna iminimalna dla całego zestawudanych wejściowych
Y max , Y min −docelowe wartości maksymalna iminimalna

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

SKRYPTY DLA APLIKACJI MATLAB

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.

Best Training Performance is NaN at epoch 0


0
10 Train
Best
Mean Squared Error (mse)

-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.

Best Training Performance is NaN at epoch 0


0
10 Train
Best
Mean Squared Error (mse)

-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.

Widać na Nim, że po osiągnięciu


minimalnej wartości błąd zaczynał
rosnąć- wynikało to
prawdopodobnie ze zbyt dużych
modyfikacji wektorów, co
powodowało zaburzenia
klasyfikacji dla innych próbek, za
każdym razem, gdy jedna z nich
była „nagradzana” przez zbliżenie
do niej wektora kodującego.

Rysunek - Średni błąd kwadratowy dla 392 neuronów i eta=0.7

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.

Rysunek - SSE(epoki), 600 neuronów, Rysunek - SSE(epoki), 800 neuronów,


eta=0.07, ok 80% sprawności po 400 epokach eta=0.07, ok 79% sprawności po 400 epokach

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.

Iteracja Ilość neuronów Współczynnik uczenia Epoki


Tym razem ilość 1 1000 0,1 1000 eksperymentów nie
jest iloczynem 2 1000 0,07 1600 wektorowym
kombinacji 3 1000 0,04 2000 przygotowanych
parametrów. 4 1000 0,01 2500

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.

Rysunek - Sprawność dla 1k neuronów, zależna od eta i ilości epok

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%

WNIOSKI KOŃCOWE I PODSUMOWANIE

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.

Co mogło być przyczyną tak małego wzrostu


sprawności w porównaniu do stanu „zerowego”?
Przypomnę, że nienauczona sieć ma sprawność
62.5%, a maksymalna osiągnięta sprawność była o ok
17.5% wyższa.
Przede wszystkim dane Auto+MPG były oryginalnie
przygotowane do przewidywania wartości rozmytej
spalania w cyklu miejskim (pierwszy atrybut).
Wspomniano wcześniej, że sieć LVQ nie może
posłużyć do takiego rodzaju przewidywania
bezklasowego. Dlatego byłem zmuszony wybrać inne
kryterium, które w dodatku może być kryterium
klasowym.

Proponuję, czytelnikowi przyjrzeć się tym danym po


ukryciu dwóch ostatnich kolumn. Jestem dość pewny,
że nawet znawca motoryzacyjny popełniłby wiele pomyłek próbując ocenić kontynent, z jakiego pochodzą te
samochody. Prywatnie za najtrudniejsze uważam rozróżnienie samochodów Europejskich (klasa 2) i Azjatyckich
(klasa 3). Zresztą, podobnie uważa sieć LVQ, co widać po procentowej zawartości błędów znajdującym się na
poprzedniej stronie, przykładowym wykresie zawartości błędnych/poprawnych przyporządkowań.

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

BAZOWY SKRYPT DLA WERSJI 7.9.0 APLIKACJI MATLAB

1 %% LVQ dla samochodów NNT2


2
3 %% Czyszczenie i ukrycie ostrzeżeń
4 %clear all
5
6 %% Domyśln. wart. + load
7 format compact;
8 format short;
9 rpt=1; %zmienna sterująca wykonywaniem pętli skryptu-dodatek
10 s1=7; %domyślna liczba neuronów
11 ep=100;
12 eta=0.7;
13 changed=0;
14 reinit=1;
15
16
17
18 % #!# Jeżeli we wczytywanym pliku będą zmienne S1, to zostaną użyte
jako
19 % wartości domyślne dla działania skryptu
20 % Macierze Pn powinna być znormalizowana za pomocą mapminmax()
21 % Pn, oraz T powinny zawierajać rekordy w kolumnach
22
23 %load samochody
24
25
26 %wyniki(1,n)=struct('parametry',zeros(1,4),'odpowiedzi',zeros(398,4));
%struktura do zapisywania wyników
27 %niestety matlab nie pozwala na wielopoziomowe indeksowanie
w strukturach
28 %wyniki(1,:).parametry=[1 2 3 4];
29 %wyniki(1,:).odpowiedzi(:,4); % <-- NIE ZADZIAŁA!!
30 %wyniki=zeros(n,4); %inicjalizacja zmiennej przechowującej wyniki
kolejnych interacji
31 %odpowiedzi=zeros(n,398,4); %inicjalizacja zmiennej przechowującej
odpowiedzi sieci dla kolejnych interacji
32
33
34 %% Pętla główna
35 while(1)
36 %% Podanie liczby ukrytych neuronów
37 userInput=input(['Podaj liczbę ukrytych neuronów: [',int2str(s1),']:
']);
38 if ~isempty(userInput)
39 s1=userInput;
40 clear siec;
41 changed=1;
42 end
43 %% Podanie liczby epok
44 userInput=input(['Podaj ilość epok: [',int2str(ep),']: ']);
45 if ~isempty(userInput)
46 ep=userInput;
47 clear siec;
48 changed=1;
49 end

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

ITERACYJNA WERSJA SKRYPTU A (S. 21)


1 %% LVQ dla samochodów NNT2
2 % IMPLEMENTACJA PĘTLI DOŚWIADCZEŃ
3
4 % clear all
5 % load beta_testy.mat
6
7
8
9 cd images
10 mkdir ROC
11 mkdir performance
12 mkdir confusion
13 cd ..
14
15
16
17 %% Domyśln. wart. + load
18 format compact;
19 format short;
rpt=[length(epoki) length(neurony) length(wspolczynniki) 3]; %zmienna
20 sterująca wykonywaniem pętli skryptu-dodatek
21 wyniki_temp=zeros(rpt(4),5);
22 odpowiedzi_temp=zeros(rpt(4),length(Tind),4);
23 wyniki_apx=zeros(rpt(1)*rpt(2)*rpt(3),7);
24 odpowiedzi_apx=zeros(rpt(1)*rpt(2)*rpt(3),length(Tind),4);
25
26 n=int32(1);
27
28 Tvec = ind2vec(Tind);
29
30 PR = minmax(Pn);
31
32 percentage=(histc(Tind,1:3)/length(Tind));
33
34
35
36 for e=1:rpt(1) %% pętla epok
37 for nr=1:rpt(2) %% pętla neuronów
38 for w=1:rpt(3)%% pętla wspołczynników
39 format short
40 sprintf('---')
41 [w nr e] %#ok<NOPTS>
42 [wspolczynniki(w,1) neurony(nr,1) epoki(e,1)] %#ok<NOPTS>
sprintf('\n---\nWartość [n]: [%d]\nIlość ukrytych neuronów: %d \nIlość
iteracji: %d\nMaksymalna wartość błędu: %d\n---\n',n, neurony(nr,1),
43 epoki(e,1), wspolczynniki(w,1))
44
45

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

ORYGINALNE DANE WEJŚCIOWE


18.0 8 307.0 130.0 3504. 12.0 70 1 chevrolet chevelle malibu
15.0 8 350.0 165.0 3693. 11.5 70 1 buick skylark 320
18.0 8 318.0 150.0 3436. 11.0 70 1 plymouth satellite
16.0 8 304.0 150.0 3433. 12.0 70 1 amc rebel sst
17.0 8 302.0 140.0 3449. 10.5 70 1 ford torino
15.0 8 429.0 198.0 4341. 10.0 70 1 ford galaxie 500
14.0 8 454.0 220.0 4354. 9.0 70 1 chevrolet impala
14.0 8 440.0 215.0 4312. 8.5 70 1 plymouth fury iii
14.0 8 455.0 225.0 4425. 10.0 70 1 pontiac catalina
11.0 8 318.0 210.0 4382. 13.5 70 1 dodge d200
9.0 8 304.0 193.0 4732. 18.5 70 1 hi 1200d
27.0 4 97.00 88.00 2130. 14.5 71 3 datsun pl510
28.0 4 140.0 90.00 2264. 15.5 71 1 chevrolet vega 2300
25.0 4 113.0 95.00 2228. 14.0 71 3 toyota corona
25.0 4 98.00 ? 2046. 19.0 71 1 ford pinto

{...}

19.0 6 232.0 100.0 2634. 13.0 71 1 amc gremlin


16.0 6 225.0 105.0 3439. 15.5 71 1 plymouth satellite custom
17.0 6 250.0 100.0 3329. 15.5 71 1 chevrolet chevelle malibu
19.0 6 250.0 88.00 3302. 15.5 71 1 ford torino 500
18.0 6 232.0 100.0 3288. 15.5 71 1 amc matador
34.0 4 108.0 70.00 2245 16.9 82 3 toyota corolla
38.0 4 91.00 67.00 1965. 15.0 82 3 honda civic
32.0 4 91.00 67.00 1965. 15.7 82 3 honda civic (auto)
38.0 4 91.00 67.00 1995. 16.2 82 3 datsun 310 gx
25.0 6 181.0 110.0 2945. 16.4 82 1 buick century limited
38.0 6 262.0 85.00 3015. 17.0 82 1 oldsmobile cutlass ciera (diesel)
26.0 4 156.0 92.00 2585. 14.5 82 1 chrysler lebaron medallion
22.0 6 232.0 112.0 2835 14.7 82 1 ford granada l
32.0 4 144.0 96.00 2665. 13.9 82 3 toyota celica gt
36.0 4 135.0 84.00 2370. 13.0 82 1 dodge charger 2.2
27.0 4 151.0 90.00 2950. 17.3 82 1 chevrolet camaro
27.0 4 140.0 86.00 2790. 15.6 82 1 ford mustang gl
44.0 4 97.00 52.00 2130. 24.6 82 2 vw pickup
32.0 4 135.0 84.00 2295. 11.6 82 1 dodge rampage
28.0 4 120.0 79.00 2625. 18.6 82 1 ford ranger
31.0 4 119.0 82.00 2720. 19.4 82 1 chevy s-10

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 1 - Shelby GT500.........................................................................................................................................3

Rysunek 2 - dynamicznie modelowane neurony mózgowe człowieka.....................................................................4

Rysunek 3 - Dwuwarstwowa SSN typu feedforward................................................................................................5

Rysunek 4 - prosty schemat sztucznej sieci neuronowej..........................................................................................5

Rysunek 5 - Wnętrze neuronu - Funkcja transferu...................................................................................................5

Rysunek 6 - Teselacja przestrzeni wejściowej w regiony klasowe/decyzyjne w przestrzeni dwu-wymiarowej......7

Rysunek 7 - Architektura sieci LVQ...........................................................................................................................8

Rysunek 8 - Architektura pojedynczego neuronu (wektora kodującego) sieci LVQ.................................................8

Rysunek 9 - LVQ2.1 w działaniu 1...........................................................................................................................11

Rysunek 10 - LVQ2.1 - w działaniu 2.......................................................................................................................11

Rysunek 11 - Wartość Mean Square Error (MSE) od epok, dla wsp. uczenia=0.001, 800 neuronów....................13

Strona 32

You might also like