Computer Breakers Analyza - NEUROINFORMATICS-GROUP-FAV-KIV-ZCU/guess_the_number GitHub Wiki
#OBJEKTOVÝ NÁVRH APLIKACE
Projekt: Srovnání klasifikační algoritmů pro aplikaci Hádání čísel
Tým: Computer Breakers
Členové:
Vedoucí - Vladimír Láznička, E-mail - [email protected]
Člen - Jaroslav Klaus, E-mail - [email protected]
Člen - Michal Medek, E-mail - [email protected]
Člen - Karel Šilhavý, E-mail - [email protected]
2. Kontext a architektura systému
3. Typy informací zpracovávané systémem
5. Přiřazení tříd/modulů programátorům
Tento dokument slouží ke znázornění návrhu systému a analýze jeho částí pro následnou implementaci. Postupně bude popsán účel systému, jeho kontext spolu s přehledem jednotlivých částí a odůvodněním volby jednotlivých technologií a co za data budou systémem zpracovány. Nakonec budou detailněji rozepsány jednotlivé části na úroveň samotných tříd a také rozpis, který programátor z týmu je bude řešit.
Účel systému (resp. cíl projektu) je klasifikace EEG buď z poskytnutých offline dat (soubory) nebo z probíhajícího měření. Měření spočívá v zobrazovaní čísla v rozmezí 1 až 9 testované osobě a ta bude na vjem reagovat stimulem, který je zachycen a odeslán ke zpracování. Aplikace pak bude schopna zpracovat vstupní data, ty vyhodnotit implementovanými algoritmy, vypočítat skóre pro možná čísla a určit, na které měřená osoba pravděpodobně myslela.
Zkratka / Výraz | Popis |
EEG | "Electroencephalography" - proces měření elektrické aktivity na povrchu hlavy. |
Epocha | Pevně dané okolí stimulu v měřeném signálu. |
Komponenta P300 | Typ ERP komponenty vznikající při rozhodovacím procesu mozku. |
ERP | "Event related potencial" - zaznamenaná odpověď mozku na nějakou vnímatelnou událost. |
- https://docs.google.com/document/d/1gimpqBbgiPabslO3duygEv6Q5XNT2SdJE5AbaxqCkUI/edit?invite=CMu5uIMM – odkaz na dokument s popisem algoritmů pro extrakci příznaku signálu a jeho klasifikaci. Obsahuje odkazy na další dokumenty nebo internetové zdroje.
Na následujícím digramu je znázorněn kontext systému a jeho využití uživatelem.
Aktuální systém se obecně skládá z následujících částí:
- Uživatelské rozhraní programu
- Komunikační rozhraní pro vstup dat (TCP protokol)
- Zpracování vstupních dat
- Třídy s algoritmy pro extrakci příznaku ze signálu a následnou klasifikaci
- Rozhraní pro trénování zmíněných algoritmů a jejich testování
- Třídy pro dodatečnou práci s daty (výpočty, konstantní atributy atd.)
Z uživatelského rozhraní se vyvolávají jednotlivé požadavky na činnost systému, což typicky bývá výběr zdroje dat, který je pak obsloužen komunikačním rozhraním. Přijatá data jsou poté zpracována a signál rozdělen na jednotlivé epochy, které se předávají třídám pro extrakci příznaku a klasifikaci (algoritmy pro klasifikaci také vyžadují vytvoření trénovacích dat). Výsledky klasifikace jsou pak zase vráceny na uživatelské rozhraní. Část pro trénování algoritmů lze pak spouštět mimo hlavní část programu, přičemž využívá již vytvořených vstupních souborů pro trénování, které aplikuje na algoritmy obsažené v části s třídami klasifikace.
Předmětem našeho projektu je pak část uživatelského rozhraní a práce se třídami pro extrakci příznaku a klasifikaci, tyto části tedy budou popsány v kapitole Návrh systému.
Systém je dle požadavků specifikace vyvíjen v programovacím jazyce Java s JDK 1.6. Další požadavky na technologie jsou od toho odvíjeny.
Systém pracuje s několika typy vstupních souborů. Konkrétně se jedná o:
- konfigurační soubory tříd a knihoven na extrakci příznaku a klasifikaci ve formátu XML
- soubory s naměřenými daty (pro offline testování aplikace) označené koncovkami .avg, .vhdr a .vmrk
- soubor s daty pro trénování klasifikačních algoritmů - set2
Mezi výstupní data pak patří logy aplikace a výstupy procesu trénování klasifikačních algoritmů (typycky mají koncovku .txt).
Systém vyvíjený v rámci tohoto projektu má za úkol zprostředkovat postup pro extrakci příznaku ze získaných epoch a následnou klasifikaci vektoru příznaku. Úprava stávající aplikace proběhne v balíku icp.application.classification, kam budou přidány třídy zajišťující výše zmíněnou funkčnost. Tyto třídy budou sloužit jako samostatné moduly, nemělo by být zapotřebí provádět úpravy na okolních již implementovaných třídách. Uživatelské rozhraní poté bude upraveno přidáním potřebné funkčnosti do třídy MainFrame v balíku icp.online.gui a vytvořením nové třídy řešící vytvořené nových ovládacích prvků.
Schéma systému je znázorněno na následujícím diagramu:
Balík icp.application.classification:
- HilbertHuangTransformationFeatureExtraction
- WaveletTransformFeatureExtraction
- MatchingPursuitFeatureExtraction
- KNearestNeighborsClassifier
- LinearDiscriminantAnalysisClassifier
- SVMClassifier
- CorrelationClassifier
- KNearestNeighboursLocal
- LinearDiscriminantAnalysisAlgorithms
- SupportVectorMachines
- Correlation
Balík icp.online.gui:
- MainFrame
- ClassificationSelector
Třída implementující již připravené rozhraní IFeatureExtraction. Slouží k přípravě vektoru příznaku pomocí algoritmu Hilbert-Huangovi transformace z poskytnuté knihovny. Rozhraní stanovuje metody, které bude třída obsahovat.
Žádný není specifikován (zděděný od třídy Object).
- public double[] extractFeatures(double[][] epoch)
Metoda přejme epochu, kterou po jednotlivých kanálech (řádkách dvourozměrného pole) předá příslušné metodě z knihovny zajišťující potřebné algoritmy. Do proměnné typu double[] si pak uloží vektor extrahovaného příznaku a tuto hodnotu pak vrátí.
- public int getFeatureDimension()
Metoda vracející velikost vektoru extrahovaného příznaku.
Třída implementující již připravené rozhraní IFeatureExtraction. Slouží k extrakci příznaků pomocí algoritmu Diskrétní waveletové transformace z poskytnuté knihovny. Rozhraní stanovuje metody, které bude třída obsahovat.
-
public WaveletTransformFeatureExtraction()
Konstruktor, který nastaví defaultní jméno waveletu.
-
public WaveletTransformFeatureExtraction(int name)
Nastaví jméno waveletu získané jako parametr.
-
public double[] extractFeatures(double[][] epoch)
Metoda přejme epochu, kterou po jednotlivých kanálech (řádkách dvourozměrného pole) předá příslušné metodě z knihovny zajišťující potřebné algoritmy. Do proměnné typu double[] si pak uloží příznakový vektor a tuto hodnotu pak vrátí.
-
public int getFeatureDimension()
Metoda vracející velikost příznakového vektoru.
-
public void setWaveletName(int name)
Metoda nastavující jméno waveletu.
Třída implementující již připravené rozhraní IFeatureExtraction. Slouží k přípravě vektoru příznaku pomocí algoritmu MatchingPursuit z poskytnuté knihovny. Rozhraní stanovuje metody, které bude třída obsahovat.
- public MatchingPursuitFeatureExtraction()
Bezparametrický konstruktor nastavující počet iterací na výchozí hodnotu(4).
- public MatchingPursuitFeatureExtraction(int numberOfIterations)
Kontruktor umožňující nastavit počet iterací. V každé iteraci je přidán jeden Gaborův atom.
- public double[] extractFeatures(double[][] epoch)
Metoda přejme epochu, kterou po jednotlivých kanálech (řádkách dvourozměrného pole) předá příslušné metodě z knihovny zajišťující potřebné algoritmy. Do proměnné typu double[] si pak uloží příznakový vektor a tuto hodnotu pak vrátí.
- public int getFeatureDimension()
Metoda vracející velikost příznakového vektoru.
- public int setIterationCount(int iterationCount)
Metoda nastavující počet iterací. V každé iteraci je přidán jeden Gaborův atom.
Tato třída bude dědit od ERPClassifierAdapter (programová struktura typu adaptér implementující rozhraní IERPClassifier) a řešit konkrétní implementaci jednotlivých metod. Samotný účel třídy je zprostředkovat algoritmus a metody třídy KNearestNeighboursAlgorithms pro klasifikaci extrahovaného příznaku.
- public KNearestNeighboursClassifier()
Bezparametrický konstruktor volající ten parametrický, kterému předá defaultní počet nejbližších sousedních prvků (uložený jako konstantní hodnota mezi atributy třídy).
- public KNearestNeighboursClassifier(int k)
Konstruktor, který bude přejímat počet nejbližších sousedních prvků pro klasifikaci příznaku. Bude vytvářet instanci třídy KNearestNeighboursAlgorithms s tím, že jí předá počet nejbližších sousedních prvků.
- public void setFeatureExtraction(IFeatureExtraction fe)
Metoda pro nastavení instance třídy pro extrakci příznaku tomuto klasifikátoru.
- public double classify(double[][] epoch)
Metoda zajišťující klasifikaci vektoru příznaku extrahovaného s předávané epochy. Nejprve je zavolána metoda pro samotnou extrakci, jejíž výsledek je uložen do pole typu double[]. S tímto polem se pak dále pracuje pomocí metod třídy KNearestNeighboursAlgorithms, která nakonec vrátí výsledek představující skóre daného příznaku. Tento výsledek je pak vrácen i touto metodou.
- public void train(List<double[][]> epochs, List targets, int numberOfiter, IFeatureExtraction fe)
Metoda zajišťující natrénování algoritmu K Nearest Neighbours a vytvoření souboru, podle kterého bude probíhat klasifikace.
- public ClassificationStatistics test(List<double[][]> epochs, List targets)
Metoda zpřístupňující testovací rozhraní pro tento klasifikátor. Vrací objekt typu ClassificationStatistics obsahující potřebné výsledky.
- public void save(String file)
Metoda pro uložení výsledku trénování klasifikátoru do souboru.
- public void load(String file)
Metoda pro načtení natrénovaných dat ze souboru pro klasifikaci.
Tato třída bude dědit od ERPClassifierAdapter (programová struktura typu adaptér implementující rozhraní IERPClassifier) a řešit konkrétní implementaci jednotlivých metod. Samotný účel třídy je zprostředkovat algoritmus a metody třídy LinearDiscriminantAnalysisAlgorithms pro klasifikaci extrahovaného příznaku.
-
public LinearDiscriminantAnalysisClassifier()
Bezparamterický konstruktor, který vytvoří novou instanci třídy LinearDiscriminantAnalysisAlgorithms.
-
public void setFeatureExtraction(IFeatureExtraction fe)
Nastavuje klasifikátoru metodu pro extrakci příznaku, kterou dostane jako parametr.
-
public double classify(double[][] epoch)
Metoda zajišťující klasifikaci příznakového vektoru extrahovaného z předávané epochy. Nejprve je zavolána metoda pro samotnou extrakci, jejíž výsledek je uložen do pole typu double[]. S tímto polem se pak dále pracuje pomocí metod třídy LinearDiscriminantAnalysisAlgorithms, která nakonec vrátí výsledek představující skóre daného příznaku. Tento výsledek je pak vrácen i touto metodou.
-
public void train(List<double[][]> epochs, List targets, int numberOfiter, IFeatureExtraction fe)
Metoda zajišťující natrénování algoritmu Linear Discriminant Analysis a vytvoření souboru, podle kterého bude probíhat klasifikace.
-
public ClassificationStatistics test(List<double[][]> epochs, List targets)
Metoda zpřístupňující testovací rozhraní pro tento klasifikátor. Vrací objekt typu ClassificationStatistics obsahující potřebné výsledky.
-
public void save(String file)
Metoda, která volá metodu třídy LinearDiscriminantAnalysisAlgorithms pro uložení natrénovaného klasifikátoru do souboru.
-
public void load(String file)
Metoda, která volá metodu třídy LinearDiscriminantAnalysisAlgorithms pro načtení dat ze souboru pro klasifikaci.
-
public void load(InputStream is)
Metoda, která volá metodu třídy LinearDiscriminantAnalysisAlgorithms pro načtení dat v případě on-line použití aplikace.
Tato třída bude dědit od ERPClassifierAdapter (programová struktura typu adaptér implementující rozhraní IERPClassifier) a řešit konkrétní implementaci jednotlivých metod. Samotný účel třídy je zprostředkovat algoritmus a metody třídy SupportVectorMachinesAlgorithms pro klasifikaci extrahovaného příznaku. Bude využívat knihovny libsvm.
- Doplní se po dalším prozkoumání
- public double classify(double[][] epoch)
Metoda zajišťující klasifikaci vektoru příznaku extrahovaného s předávané epochy. Nejprve je zavolána metoda pro samotnou extrakci, jejíž výsledek je uložen do pole typu double[]. S tímto polem se pak dále pracuje pomocí metod třídy SupportVectorMachinesAlgorithms, která nakonec vrátí výsledek představující skóre daného příznaku. Tento výsledek je pak vrácen i touto metodou.
- public void train(List<double[][]> epochs, List targets, int numberOfiter, IFeatureExtraction fe)
Metoda zajišťující natrénování algoritmu Support Vector Machines a vytvoření souboru, podle kterého bude probíhat klasifikace.
- public ClassificationStatistics test(List<double[][]> epochs, List targets)
Metoda zpřístupňující testovací rozhraní pro tento klasifikátor. Vrací objekt typu ClassificationStatistics obsahující potřebné výsledky.
- public void save(String file)
Metoda pro uložení výsledku klasifikace do souboru.
- public void load(String file)
Metoda pro načtení dat ze souboru pro klasifikaci.
- public void load(InputStream is)
Metoda pro načtení dat v případě on-line použití aplikace.
Tato třída bude dědit od ERPClassifierAdapter (programová struktura typu adaptér implementující rozhraní IERPClassifier) a řešit konkrétní implementaci jednotlivých metod. Samotný účel třídy je zprostředkovat algoritmus a metody třídy CorrelationAlgorithms pro klasifikaci extrahovaného příznaku.
- public CorrelationClassifier()
Bezparamterický konstruktor, který vytvoří novou instanci třídy CorrelationAlgorithm.
- public void setFeatureExtraction(IFeatureExtraction fe)
Nastavuje klasifikátoru metodu pro extrakci příznaku, kterou dostane jako parametr.
- public void train()
Metoda volající metodu public void loadP300() ze třídy CorrelationAlgorithm.
- public void train(List<double[][]> epochs, List targets, int numberOfiter, IFeatureExtraction fe)
Přetížená metoda volající metodu public void train().
- public double classify(double[][] epoch)
Metoda zajišťující klasifikaci příznakového vektoru extrahovaného z předávané epochy. Nejprve je zavolána metoda pro samotnou extrakci, jejíž výsledek je uložen do pole typu double[]. Toto pole je pak předáno metodě public double getScore(double[] feature) třídy CorrelationAlgorithms, která nakonec vrátí výsledek představující skóre daného příznaku. Tento výsledek je pak vrácen i touto metodou.
- public void load(String file)
Metoda pro načtení natrénovaných dat ze souboru pro klasifikaci.
- public void save(String file)
Metoda pro uložení výsledku trénování klasifikátoru do souboru.
Tato třída bude obsahovat implementaci algoritmu K Nearest Neighbours a bude poskytovat své metody příslušnému klasifikátoru.
- public KNearestNeighboursAlgorithms(int k)
Kontruktor přejme počet nejbližších sousedních prvků, podle kterých bude probíhat klasifikace, a inicializuje kolekci pro uložení jednotlivých trénovacích prvků (instance třídy Neighbor).
- public void addNeighbor(double[] vector, double classValue)
Metoda pro vkládání trénovacích prvků (instance třídy Neighbor), bude volána během trénování klasifikátoru. Přejímá vektor s příznaky a jeho příslušnou klasifikační třídu (target).
- public double getScore(double[] featureVector)
Metoda zajišťující samotnou klasifikaci předávaného vektoru s příznaky. Nejprve si zavolá soukromé metody třídy na vypočtení euklidovských vzdáleností mezi předaným vektorem a vektry v kolekci natrénovaných dat a seřazení těchto trénovacích vektorů podle vypočtené vzdálenosti. Následně provede vyhodnocení podle nastaveného počtu nejbližších sousedů a určí výsledné skóre jako poměr mezi target a non-target sousedy.
- Gettery a settery pro soukromé atributy pro případnou práci s objektem klasifikátoru.
Tato třída bude obsahovat implementaci algoritmu Linear Discriminant Analysis a bude poskytovat své metody příslušnému klasifikátoru.
-
public LinearDiscriminantAnalysisAlgorithms()
Bezparametrický konstruktor pro vytvoření instance této třídy.
-
public void train(List<double[][]> input, List targets, IFeatureExtraction fe)
Metoda, která volá další metody potřebné pro natrénování klasifikátoru.
-
public double classify(double[] featureVector)
Metoda pro klasifikaci příznakového vektoru, která vrací double pravděpodobnost, s jakou je daný vektor target nebo non-target.
-
public void save(String file)
Metoda pro uložení natrénovaných dat klasifikátoru potřebných pro klasifikaci do souboru.
-
public void load(String file)
Metoda pro načtení natrénovaných dat klasifikátoru potřebných pro klasifikaci ze souboru.
-
private void init()
Metoda volaná metodou train, která inicializuje privátní proměnné třídy potřebné pro natrénování klasifikátoru.
-
private int[] determineSizeOfInput()
Metoda, která zjistí velikost matice s trénovacími daty.
-
private void createInputAndTargetMatrix(List<double[][]> input, List targets, IFeatureExtraction fe)
Metoda, která z předaných parametrů vytvoří struktury potřebné k natrénování klasifikátoru.
-
private double[] determineClasses()
Metoda, která ze struktury targets zjistí, jaké jsou různé cíle.
-
private int determineClassCount()
Metoda, která zjistí, kolik je různých cílů.
-
private void calculateW()
Metoda pro vytvoření pomocných struktur a vytvoření matice W, která obsahuje koeficienty Lineární diskriminační analýzy.
-
private double calculateMean(Matrix group, int i, int j)
Metoda, která spočte průměr pro jeden sloupec matice, ale pouze pro ty řádky, které odpovídají právě zpracovávané třídě.
-
private double calculateCovariance(Matrix group, int i, int j)
Metoda, která vypočítá kovarianci pro jeden sloupec matice, ale pouze pro ty řádky, které odpovídají právě zpracovávané třídě.
-
private Matrix calculateGroup(Matrix group, int i)
Metoda zjistí, které řádky odpovídají právě zpracovávané třídě.
-
private void calculateNGroup(Matrix group, int i)
Metoda spočítá, kolik řádků patří zpracovávané třídě.
-
private void createW(int i)
Metoda, která pro zpracovávanou třídu vytvoří část matice W.
-
private Matrix multiplyVectorWithMatrix(Matrix v, Matrix m)
Metoda pro násobení matice vektorem.
-
private void calculateL()
Metoda, která spočítá matici L pro právě klasifikovaný vektor.
-
private void calculateP()
Metoda, která spočítá pravděpodobnostní matici P pro právě klasifikovaný vektor.
-
private Matrix createExpL()
Metoda, která vytvoří matici expL, která má prvkek (i, j) s hodnotou e^L(i, j).
-
private void createSumL(Matrix expL, Matrix sumL)
Vytvoří matici, která má prvky rovny součtům jednotlivých řádků matice L.
-
private void createRepmatL(Matrix repmatL, Matrix sumL)
Vytvoří matici, která bude mít vedle sebe dvě matice sumL.
Třída, která bude obsahovat implementaci algoritmu Support Vector Machines a bude poskytovat své metody příslušnému klasifikátoru.
- Doplní se po dalším prozkoumání
- Doplní se po dalším prozkoumání
Třída, která bude implementovat algoritmus pro korelaci signálů a bude poskytovat své metody příslušnému klasifikátoru.
- public CorrelationAlgorithms()
Prázdný bezparametrický konstruktor.
- public double getScore(double[] feature)
Metoda zajišťující samotnou klasifikaci předávaného vektoru s příznaky. Nejprve zkontroluje, jestli signál uložený v privátním atributu double[] signal1 je kratší než signál v double[] signal2, pokud ne, signály prohodí pomocí privátní metody void switchSignals(). Potom signal1 posouvá po signal2 a pro každý posun vypočítává skalární součin. Podíl největšího skalárního součinu a cílového (tedy skalární součit signal1 se sebou samým) je vrácen touto metodou jako skóre daného příznakového vektoru.
- private void switchSignals()
Metoda prohazující obsah proměnné signal1 a signal2. Pro možnost posouvání signálu je předpoklad, že kratší signál je v proměnné signal1.
- public void loadP300()
Načítá vzorovou vlnu P300 ze souboru do proměnné double[] signal1.
- private double countGoalRating(double[] signal)
Vypočítá a vrátí skalární součin předaného signálu se sebou samým.
Třída MainFrame je již stávající aplikací implementována, naším cílem bude přidat odkaz a vytvořit instanci pro naší vlastní část GUI (třída GUIForParameters)
- public MainFrame()
Již implementovaný kontruktor, nemělo by být zapotřebí do něj zasahovat.
- public void setClassifier(IERPClassifier classifier)
Metoda pro nastavení konkrétního klasifikátoru, bude volána v rámci nějaké akce na novém GUI. Zároveň bude zapotřebí zrušit parametr final u atributu pro uchování klasifikátoru.
Pozn.: v konstruktoru je aktuálně přiřazen jeden z již implementovaných klasifikátorů... ten bude nastaven defaultně pro případ, že uživatel pomocí GUI, žádný nezvolí.
- public void setFeatureExtraction(IFeatureExtraction fe)
Metoda pro nastavení konkrétní instance třídy pro extrakci příznaku danému klasifikátoru. Bude z ní zavolána metoda public void setFeatureExtraction(IFeatureExtraction fe) z daného klasifikátoru.
Pozn.: podobně jako u klasifikátoru je i u extrakce příznaku jedna z jichž implementovaných tříd přiřazena defaultně v konstruktoru.
Bude doplněno po zpracování návrhu GUI.
Třída | Programátor |
HilbertHuangTransformationFeatureExtraction | Michal Medek / Vladimír Láznička |
WaveletTransformFeatureExtraction | Jaroslav Klaus |
MatchingPursuitFeatureExtraction | Karel Šilhavý |
KNNClassifier | Vladimír Láznička |
LinearDiscriminantAnalysisClassifier | Jaroslav Klaus |
SVMClassifier | Michal Medek |
CorrelationClassifier | Karel Šilhavý |
KNearestNeighbours | Vladimír Láznička |
LinearDiscriminantAnalysisAlgorithms | Jaroslav Klaus |
SupportVectorMachines | Michal Medek |
Correlation | Karel Šilhavý |
MainFrame | Vladimír Láznička |
ClassificationSelector | Michal Medek |