Skip to content
Snippets Groups Projects
BP_Radek_Pus_2019.tex 33.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Radek Puš's avatar
    Radek Puš committed
    % arara: pdflatex
    % arara: pdflatex
    % arara: pdflatex
    
    % options:
    % thesis=B bachelor's thesis
    % thesis=M master's thesis
    % czech thesis in Czech language
    % slovak thesis in Slovak language
    % english thesis in English language
    % hidelinks remove colour boxes around hyperlinks
    
    \documentclass[thesis=B,czech]{FITthesis}[2019/03/06]
    
    \usepackage[utf8]{inputenc} % LaTeX source encoded as UTF-8
    
    \usepackage{enumerate}
    \usepackage{float}
    \usepackage{amsmath}
    \usepackage{hyperref}
    
    Radek Puš's avatar
    Radek Puš committed
    % \usepackage{amssymb} %additional math symbols
    
    \usepackage{dirtree} %directory tree visualisation
    
    % % list of acronyms
    % \usepackage[acronym,nonumberlist,toc,numberedsection=autolabel]{glossaries}
    % \iflanguage{czech}{\renewcommand*{\acronymname}{Seznam pou{\v z}it{\' y}ch zkratek}}{}
    % \makeglossaries
    
    \newcommand{\tg}{\mathop{\mathrm{tg}}} %cesky tangens
    \newcommand{\cotg}{\mathop{\mathrm{cotg}}} %cesky cotangens
    
    % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
    % ODTUD DAL VSE ZMENTE++
    % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
    
    \department{Katedra softwarového inženýrství}
    
    \title{Aplikace pro předpovídání transakcí na základě finančních akcí}
    
    Radek Puš's avatar
    Radek Puš committed
    \authorGN{Radek} %(křestní) jméno (jména) autora
    \authorFN{Puš} %příjmení autora
    \authorWithDegrees{Radek Puš} %jméno autora včetně současných akademických titulů
    \author{Radek Puš} %jméno autora bez akademických titulů
    
    \supervisor{Ing. Miroslav Balík, Ph.D.}
    
    Radek Puš's avatar
    Radek Puš committed
    \acknowledgements{Děkuji společnosti Trask Solutions a.s., zejména pak Ing. Petru Hnízdilovi a Ing. Pavlu Svobodovi,  za veškeré konzultace a datové podklady k práci. Dále děkuji své přítelkyni Mariyi Tsanko, za dodání doplňujících dat ze svých bankovních účtů.}
    
    Radek Puš's avatar
    Radek Puš committed
    \abstractCS
    
    {V Bakalářské práci byl řešen problém předpovídání budoucích transakcí klientovi, na základě jeho uplynulé finanční historie. Cílem práce je pokusit se implementovat toto předvídání pomocí umělé inteligence spolu s vytvořením webového rozhraní. Toho bylo dosaženo pomocí  Angularu JS, tvořící klienskou aplikaci, frameworkem .NET Core, který tuto aplikaci obsluhuje ve spojení s databází Microsoft SQL. Zabezpečení využívá JWT tokenu a o šifrování uživatelských hesel se stará RFC~2898/SHA512. Umělá inteligence byla řešena jako lineární regrese.
    
    Radek Puš's avatar
    Radek Puš committed
    %=============
    % <= mělo by obsahovat mojí vlastní implementaci problému
    
    \newline  Umělá inteligence je implementována jako několik po sobě jdoucích vrstev, jejichž počet neuronů se postupně snižuje na jeden jediný, který dává informaci, zdali se bude transakce opakovat, či nikoli. Aby se posléze mohlo vyhodnotit, zda se transakce opravdu opakovala, porovnávala se velikosti transakcí po jednotlivých týdnech a ty částkou si nejvíce podobné byly označeny za opakující se.
    \newline Tento způsob předvídání je dále doplněn o odfiltrování trvalých transakcí, jež se už ze své podstaty vždy opakují.
    
    }
    %=============
    
    Radek Puš's avatar
    Radek Puš committed
    \abstractEN{
    
    In the Bachelor thesis was solved the problem of forecasting future transactions to the client, based on his past financial history. The aim of this work is to try to implement this prediction by using artificial intelligence together with creating a web interface. This was achieved by using Angular JS, a client application, with the .NET Core framework, which runs the application in conjunction with the Microsoft SQL database. Security uses the JWT token and RFC~2898/SHA512 takes care of user password encryption. Artificial intelligence was solved as linear regression.
    \newline I have implemented artificial intelligence as several consecutive layers, the number of neurons gradually decreasing to one, which gives me information whether the transaction will repeat or not. In order to assess whether the transaction was actually recurring, I compared the size of the transactions on a week-by-week basis and described the amount most similar as recurring.
    \newline I have further supplemented this way of anticipation by filtering out permanent transactions, which by their very nature always repeat themselves.
    
    Radek Puš's avatar
    Radek Puš committed
    }
    %ing
    
    Radek Puš's avatar
    Radek Puš committed
    \placeForDeclarationOfAuthenticity{V~Praze}
    \declarationOfAuthenticityOption{4} %volba Prohlášení (číslo 1-6)
    
    \keywordsCS{webový portál, předvídání finančních transakcí, analýza finančních transakcí, umělá inteligence, .NET Core, Entity Framework, Angular JS}
    \keywordsEN{web portal, anticipating financial transactions, financial transaction analysis, artificial intelligence, .NET Core, Entity Framework, Angular JS}
    \website{https://gitlab.fit.cvut.cz/pusradek/bakalarka} %volitelná URL práce, objeví se v tiráži - úplně odstraňte, nemáte-li URL práce
    
    Radek Puš's avatar
    Radek Puš committed
    
    \begin{document}
    
    % \newacronym{CVUT}{{\v C}VUT}{{\v C}esk{\' e} vysok{\' e} u{\v c}en{\' i} technick{\' e} v Praze}
    % \newacronym{FIT}{FIT}{Fakulta informa{\v c}n{\' i}ch technologi{\' i}}
    
    \begin{introduction}
    
    	%sem napište úvod Vaší práce ( 1 - 1,5 strany)
    
    %TODO
    
    % - možná přidat něco jako "aktuálnost tématu"
    % - možná - čím se nezabývám
    % - nepatří se podnadpisy!
    Ve své práci řeším problém zpracování finančních transakcí. Při výběru jsem využil možného zájmu bankovní instituce o odkoupení výsledného produktu. Ta by mohla využít mou práci k zobrazování pravděpodobných transakcí vlastním uživatelům. Případně by mohla lépe porozumět chování a potřeby klientů samotných. Tím by mohla produkty lépe cílené na zakazníky. Mě osobně navíc vždy zajímal vývoj v oblasti umělé inteligence a chtěl jsem si proto své znalosti prohloubit.
    \newline Technologie, které jsem využil pro svou práci, jsem si vybral na základě svého současného zaměstnání. Skrze společnost Trask Solutions a.s. pracuji jako externista a software developer ve společnosti ČSOB Leasing. Zde pomáhám vyvíjet aplikaci právě v jazyce C\# a frameworku ASP.NET. Avšak framework jsem použil novější (.NET Core ve spojení s Entity Frameworkem). Práci bych rád využil ke zvýšení své kvalifikace v oboru. Pro Frontend jsem zvolil Angular JS, protože jsem se chtěl také naučit něco nového. Navíc spolupracuji s týmem, který v tomto frameworku vyvíjí aplikace a v případě potřeby mi mohou obratem pomoci.
    
    %TODO Představení struktury celé práce –obsah jednotlivých kapitol
    
    Radek Puš's avatar
    Radek Puš committed
    \end{introduction}
    
    \chapter{Cíl práce}
    
    Cílem práce je vytvoření webové aplikace, která bude pro skupinu uživatelů poskytovat službu předvídání finančních transakcí na základě jimi nahraného výpisu z účtu.
    \newline Cílem teoretické části práce je nastudování Angular frameworku, Typescriptu a Entity Frameworku Core / .NET Core. Dále je třeba zjistit možnosti využití umělé inteligence, která bude muset alespoň z části předpovědět chování uživatelů. Tato umělá inteligence bude předpovídat chování uživatelů na základě předem získaných (anonymizovaných) a obohacených dat jejich finanční historie.
    \newline Cílem praktické části je implementovat tuto webovou aplikaci, včetně zabezpečení, a pokusit se implementovat a integrovat umělou inteligenci, která bude vytěžovat údaje z uživatelem nahraných dat.
    
    Radek Puš's avatar
    Radek Puš committed
    
    
    Radek Puš's avatar
    Radek Puš committed
    
    %\chapter{Analýza a návrh}
    \chapter{Analýza}
    Projekt je webová aplikace. Musí se proto skládat ze dvou částí: Backendu a Frontendu. Frontend je webovým rozhraním a Backend zpracovává údaje uživatele a dodává webovému rozhraní data.
    
    Radek Puš's avatar
    Radek Puš committed
    \section{Webové rozhraní}
    Pro webové rozhraní se nabízejí dvě možná řešení. Single Page Website a Multiple Page website. Každé má své pro a proti.
    \subsection{One Page website}
    Jak už název napovídá, je to web, skládající se z jediné stránky. Stránka obvykle neobsahuje příliš mnoho informací a je založena zejména na dynamičnosti prvků. Velmi často jsou to doprovodné stránky nebo krátké informativní stránky, s jejichž pomocí se subjekty na webu prezentují.
    \subsection{Multiple Page website}
    Tyto weby, vývojově starší, obsahují zpravidla hodně informací. Obsahují nějakou formu routování - ať už složitější, dynamickou, či jednodušší, statickou. Uživateli podávají poměrně velké množství informací. Jsou to zpravidla nejrůznější blogy, e-shopy, fóra. Jejich implementace je často snazší (zejména u statických webů), jsou schopny, často přehledněji, zprostředkovat uživateli více informací a jsou (i z historických důvodů) běžnější.
    
    \section{Zabezpečení}
    
    V aplikaci bude nutné zabezpečit REST API. To je možné pomocí Session anebo pomocí, novějšího, JWT tokenu. Tyto dva přístupy se v zásadě liší způsobem ukládání informace o autentifikaci uživatele. Session tuto informaci ukládá do databáze, kdežto JWT tokeny jsou uloženy u uživatele. 
    Ukládání u uživatele má tu výhodu, že se nemusí ukládat na serveru tolik dat do mezipaměti. Ukládání na straně serveru, v případě několika uživatelů, není nijak zásadní, avšak u většího množství to přináší podstatně vyšší nároky na server.\cite{JWTvsSessionPerformance} Navíc JWT tokeny jsou imunní vůči CSRF útoku\cite{JWTvsSessionCSRF}.
    Výhodou ukládání na server je zase fakt, že je mnohem snazší znevalidnit uživatelské přihlášení - stačí odebrat záznam z databáze. U JWT je nutné vyčkat na vypršení tokenu anebo vytvořit nějakou formu blacklistu (seznam neplatných tokenů).
    
    \section{Ukládání dat}
    
    %TODO přepracovat v závislosti na konečném výsledku
    
    \subsection{NoSQL}
    
    %TODO screen z excelu
    
    Tento přístup je vhodný pro nestrukturované informace a zvažoval jsem ho jako první. Veškeré záznamy, ve výpisu z účtu, jsou tedy vlastně jen jedna \mbox{"velká tabulka"/super-entita.} Záznamy mohou být nevyplněné (př. jednotlivé symboly) a na první pohled nijak nesouvislé. Pokud se ale na data zaměřím více, mohu si všimnout, že transakce lze rozdělit například na Trvalé a jednorázové příkazy, poplatky~atp. Použití NoSQL databáze pro transakční historii i tak ale nic nebrání. Nakonec zmíněná data dokonce vždy dostanu jako jednu jednu jedinou, nic neříkající, tabulku.
    \subsection{SQL}
    Druhým přístupem, který jsem nakonec zvolil, jsou standardní  SQL databáze. Tento přístup vyžaduje strukturování dat a to, jak jsem již zmínil výše, je splněno. Lze zde nalézt různé závislosti. Pro vstupy pro mnou implementovanou umělou inteligenci je navíc mnohem lepší jasně definované vstupy, což SQL přístup nabízí. Navíc veškerou historii transakcí všech uživatelů nechci ukládat do databáze, ale raději v *.csv souborech na disk a zaregistrovat jen některé transakce. V opačném případě by se celá databáze stala zbytečně velkou a pomalou.
    %\newpage
    
    Radek Puš's avatar
    Radek Puš committed
    \section{Umělá inteligence}
    
    Na českém trhu je, co se týče předpovídání transakcí, velmi pravděpodobně zatím jediné finanční bankovnictví České Spořitelny, zvané "\textit{George}." a její doplněk "\textit{Moje zdravé finance}."\cite{George} Aplikace je přístupná pouze klientům České spořitelny a zobrazuje pouze příjmy a výdaje. V části "Moje zdravé finance" lze pak vidět, jak dlouho mi vystačí současné úspory nebo například odhadnout výši mého budoucího důchodu. Je ale schopna předpovědět některé mé budoucí transakce, tedy funkci, kterou mám za úkol implementovat. Aplikace byla spuštěna v průběhu května 2018\cite{vznikGeorge_Investujeme},\cite{vznikGeorge_Mesec} (ačkoli přesné datum jsem nebyl schopen dohledat), tedy chvíli po schválení zadání mé Bakalářské práce. To tedy dokazuje, že o témá je v praxi zájem, ale bohužel také to, že v mezičase mého vypracovávání, byl problém zpracován jinde.
    \newline Na zahraničním trhu pak existují aplikace, které umožňují klientům sledovat např. jejich měsíční útratu a na základě výpočtu jim poskytnout informaci, jestli a jak moc, překročili průměrné výdaje v tom kterém měsíci.\cite{zahranicni_aplikace}. Ve využití umělé inteligence je tedy asi Česká spořitelna, resp. Erste Group.
    
    \begin{figure}\centering
     	\includegraphics[width=0.75\textwidth]{img/Moje_zdrave_finance_anonymized.png}
     	\caption[Moje zdravé finance]{Moje zdravé finance - předpovídání transakcí České spořitelny}\label{fig:float}
     \end{figure}
    
    \section{Obohacení dat}
    Pro obohacení dat by bylo možné využít teoreticky využít veřejně dostupnou databázi MFČR - ARES (Adminstrativní registr ekonomických subjektů)\cite{ARES_zip}. Bohužel data v ní nejsou ukládána jednotným způsobem. Je sice zadefinována základní struktura dokumentu\cite{ARES_struktura}, avšak data v ní nejsou nijak strukturována. Živnosti jsou zadaný naprosto nahodile a není využito žádného oficiálního klíče. Nedefinované hodnoty obsahují výrázay jako: "0", "null", "NULL", "prázdné", "nic", "není", "nedefinováno",... Jako nejlepší příklad záznamu v databázi by pak mohla dobře posloužit Komerční banka. Ta nemá dokonce definováno vůbec nic, až na popis, který obsahuje přibližně 1500 znaků. Lze tedy usoudit, že využití tohoto zdroje je téměř nemožné a pro obohacení se nehodí.
    
    Další možnost, která by se nabízela je využití bankovních symbolů. Variabilní a specifické symboly opět neobsahují žádné informace. Někdy do nich bývá zadáváno IČO, které by se dalo napojit na ARES, ale jak už je zmíněno výše, toto napojení nepřipadá v úvahu.
    
    Zbývají tedy už jen Konstantní symboly. Ty se bohužel využívají pouze v rámci České Republiky, ale mají alespoň částečně definovanou strukturu. A ačkoli její použití již není povinné, ve výpisech z účtů, které byly pro tuto práci získány, se vyskytují hojně a mohou o transakcích něco říci.
    
    Radek Puš's avatar
    Radek Puš committed
    
    \chapter{Realizace}
    
    Radek Puš's avatar
    Radek Puš committed
    \section{Webové rozhraní}
    
    Pro webové rozhraní byla zvolena, One Page website, doplněná o stránky s registrací a přihlášením. Není potřeba uživateli předávat velké množství informací. V zásadě jen zobrazovat grafy a předpoklady. Nemusí se tedy vytvářet rozsáhlý web a jen jednoduché routování. V případě malého množství stránek se navíc snadněji pracuje s responzivitou, protože ji stačí vyladit na jednu, resp. tři stránky webu. Jakákoli práce s responzivitou pro každou další stránku pak zvětšuje prostor na chybu.
    %TODO highcharts, bootstrap, angularmaterial
    
    \section{Zabezpečení}
    V případě zabezpečení komunikace mezi backendem a frotendem (API) bylo využito JWT tokenu. Kromě výhod, uvedených v analýze, je tento přístup k zabezpečení i novější (dle Wikipedie poprvé vydán 28.12.2010\cite{JWT_published} - v průběhu psaní práce starý necelých osm let) a umožní vyzkoušet si novou technologii.
    Pro zabezpečení routování na straně Klienta bylo využito tzv. Guardů - součást zabezpečení přímo v Angular frameworku. A konečně k zabezpečení uživatelských hesel se využilo hashovacího algoritmu RFC~2898/SHA512. Zároveň se pro každé heslo generuje jiná sůl a proto by nemělo být možné v databázi najít dvě stejná hesla se stejným hashem.
    
    
    \section{Import CSV souborů}
    \subsection{Import}
    \subsection{Parsování}
    \subsection{Ukládání}
    \subsection{Obohacení}
    
    \section{Tvrdá repetitivnost}
    \section{Umělá inteligence}
    Pro předpovídání budoucích transakcí je využita neuronová síť. Tedy síť, na způsob lidského mozku, která obsahuje množství neuronů. Celá tato síť pak funguje tak, že pokud dojde k aktivaci nějakého neuronu, tak ten postupně ovlivní jeden, či více dalších neuronů a ty zase další. Míru aktivace pak ovlivňují tzv. váhy pro každý z předchozích neuronů (vstupů). Způsob jejího fungování velmi názorně ukazuje např. Grant Sanderson ve svém videu "But what is a Neural Network?"\cite{ANN_Understanding}
    
    Aby tedy neuronová síť mohla fungovat, potřebuje nějaká data, která by aktivovala vstupní neurony. Tato data musí být přizpůsobená tak, aby se tvářil, že byla výstupem jiných neuronů - musí být "normalizovaná".
    
    Dále potřebuje nějaká data za pomoci kterých, by si mohla nadefinovat, na kolik budou jednotlivé neurony ovlivňovat ty ostaní. Jinýmy slovy data, podle kterých se bude síť učit předvídat. To jsou v této aplikaci veškeré transakce, jež se opakují.
    
    Lze tedy pozorovat, že implementace předpovídání transakcí je poměrně rozsáhlá. Proto byla rozdělena do několika konzolových aplikací. Každou z těchto částí je tak možné nezávisle implementovat i testovat. V případě potřeby je možné takto i jeden modul reimplementovat a nedojde k ovlivnění dalších. Ve výsledku byla proto umělá inteligence rozdělena následovně:
    \begin{enumerate}
    	\item Datafeeder
    		\begin{enumerate}[--]
    			\item část aplikace, která slouží k postupnému čtení dat z databáze a k předání dalším objektům (částem aplikace)
    			\item tato část má na starost zároveň i normalizaci dat
    		\end{enumerate}
    	\item Komparátor
    		\begin{enumerate}[--]
    			\item udává, které transakce se opakovaly a které nikoli
    		\end{enumerate}
    	\item Neuronová síť
    		\begin{enumerate}[--]
    			\item na základě vstupních dat se pokusí předpovědět výsledek
    		\end{enumerate}
    \end{enumerate}
    
    \subsection{Implementace základní části neuronové sítě}
    Samotná neuronová síť je stále velký celek, který bylo potřeba rozdělit na podobjekty. Bylo tak tedy učiněno dle logických celků - nejdříve se dělí na jednotlivé vrstvy. Vrstvy mohou být:
    \begin{enumerate}[a)]
    	\item Vstupní vrstva
    		\begin{enumerate}[--]
    			\item prochází přes ni veškeré vstupy do neuronové sítě.
    			\item svůj výstup předává vnitřním vrstvám
    			\item je první a zároveň, v rámci sítě, unikátní vrstvou
    		\end{enumerate}
    	\item Vnitřní/skrytá vrstva (vstupně-výstupní)
    		\begin{enumerate}[--]
    			\item přijímá vstup z předchozí vrstvy, zpracovává jej a předává dál
    			\item vstup může být buď přijímán buď ze vstupní vrstvy, popř. z jiné vnitřní vrstvy.
    			\item výstup je předán buď opět do další, vnitřní vrstvy, anebo konečné výstupní.
    		\end{enumerate}
    	\item Výstupní
    		\begin{enumerate}[--]
    			\item stejně jako vstupní vrstva je unikátní
    			\item přijímá vstupy z vnitřní vrstvy vyhodnocuje je
    		\end{enumerate}
    \end{enumerate}
    
    Každá z těchto vrstev následně obsahuje sadu neuronů a každý neuron obsahuje právě jednu sadu vah. Tato sada je složena z desetinných čísel jejichž počet je ekvivalentní množství neuronů v předchozí vrstvě. Jedinou výjimkou je vrstva vstupní. Ta má neurony nahrazeny sadou vstupů (jeden vstup je ekvivalentem jednoho neuronu).
    
    Tímto způsobem je vytvořen tzv. úplný k-partitní graf.
    
    \begin{figure}[h]
     	\includegraphics[width=0.75\textwidth]{img/artificial-neural-network.png}
     	\centering
     	\caption[Struktura neuronové sítě]{Struktura neuronové sítě\cite{ANN_structure}}
    \end{figure}
    
    \subsubsection{Předvídání}
    %TODO zkontrolovat číslo obrázku - je to opravdu 3.2???
    Při předvídání výsledku se do počáteční (vstupní) vrstvy vloží vstupy. Tato vrstva je pošle do vrstvy vnitřní. V této vnitřní vrstvě se v každém neuronu všechny vstupy vynásobí s korespondujícími váhami a následně se sečtou. Výsledné číslo projde přes nějakou formu aktivační funkce ("squashing function"), která sníží velikost hodnoty na číslo v intervalu \textless -1;1 \textgreater .
    
    Vzhledem k náročnosti na pochopení výroku výše, je pro lepší ilustraci, přiložen obrázek č. 3.2. Na obrázku jsou znázorněny jednotlivé vstupy neuronu (kompletní sada vstupů vrstvy) pomocí značek X1 - X3. W1 - W3 označuje váhy, kterými se vstupy násobí. Váhy směřují do aktivační funkce, která udržuje hodnotu výstupu v daném intervalu. Y je označuje výstupní hodnotu.
    \begin{figure}[h]
     	\includegraphics[width=0.75\textwidth]{img/neural-network-single-neuron.png}
     	\centering
     	\caption[Průchod neuronem]{Průchod neuronem\cite{ANN_neuron}}
    \end{figure}
    
    Výstup jednotlivých neuronů vytváří sadu dalších vstupů pro další jednu vrstvu v pořadí. Tímto způsobem se postupně prochází veškeré vrstvy, až po vrstvu výstupní. Výstupní vrstva se liší od všech ostatních pouze tím, že obsahuje jeden neuron. Výstup toho neuronu lze uvažovat jako pravděpodobnost, na kolik je něco pravda či nikoli. V kontextu současné práce to znamená, jestli se daná transakce opakovala, či nikoli.
    Příkladem by se dalo uvést následující: Pokud získám ze sítě hodnotu blízkou -1, transakce se pravděpodobně nebude opakovat. Analogicky pokud získám hodnotu blízkou 1, transakce by se měla opakovat. Zároveň platí, že čím více je výsledná hodnota blíže 0, tím menší je pravděpodobnost správné předpovědi.
    
    Při bližší pohledu na fungovaní algoritmu si lze všimnout, že při násobení a sčítání vah platí následující vztah:
    \begin{figure}[h]
    	\[ \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ \vdots \\ x_{n} \end{bmatrix} \cdot
    	\begin{bmatrix} w_{1}, w_{2}, w_{3} \dots w_{n} \end{bmatrix} =
    	S
    	\]
    \end{figure}
    
    Kde 'x' značí vstupy a 'w' váhy. 'S' je výsledek před vstupem do aktivační funkce.
    
    %TODO opravdu použít href???
    Právě z toho to důvodu jsou v řešení uvažovány váhy i vstupy jako vektory, které se navzájem násobí. K násobení vektorů je využito externí knihovny
    \href{https://numerics.mathdotnet.com/}{[Math.NET Numerics]}. Aktivační funkce je pouhá hyperbolická funkce tangens z integrované knihovny Math.Tangh()
    
    \subsubsection{Učení}
    
    
    \subsection{Testování základní části}
    \subsection{Komprátor}
    \subsection{Testování komparátoru}
    \subsection{Datafeeder}
    
    \subsection{Normalizace}
    \subsection{Napojení Umělé inteligence na databázi a komparátor}
    
    \section{Propojení importů a umělé inteligence}
    
    
    \section{Databáze}
    Při výběru druhu databáze jsem se musel rozhodnout mezi strukturovaným a nestrukturovaným přístupem k datům. První ze zmíněných je reprezentován SQL, druhý pomocí NoSQL
    \subsection{NoSQL}
    % TODO screen z excelu
    Tento přístup je vhodný pro nestrukturované informace a zvažoval jsem ho jako první. Veškeré záznamy, ve výpisu z účtu, jsou tedy vlastně jen jedna \mbox{"velká tabulka"/super-entita.} Záznamy mohou být nevyplněné (př. jednotlivé symboly) a na první pohled nijak nesouvislé. Pokud se ale na data zaměřím více, mohu si všimnout, že transakce lze rozdělit například na Trvalé a jednorázové příkazy, poplatky~atp. Použití NoSQL databáze pro transakční historii i tak ale nic nebrání. Nakonec zmíněná data dokonce vždy dostanu jako jednu jednu jedinou, nic neříkající, tabulku.
    \subsection{SQL}
    Druhým přístupem, který jsem nakonec zvolil, jsou standardní  SQL databáze. Tento přístup vyžaduje strukturování dat a to, jak jsem již zmínil výše, je splněno. Lze zde nalézt různé závislosti. Pro vstupy pro mnou implementovanou umělou inteligenci je navíc mnohem lepší jasně definované vstupy, což SQL přístup nabízí. Navíc veškerou historii transakcí všech uživatelů nechci ukládat do databáze, ale raději v *.csv souborech na disk a zaregistrovat jen některé transakce. V opačném případě by se celá databáze stala zbytečně velkou a pomalou.
    
    Radek Puš's avatar
    Radek Puš committed
    \section{Backend}
    Při výběru formy zpracování umělé inteligence jsem se rozhodl pro využití neuronových sítí. Tato forma zpracování je novější, ale jinak nemá žádné výrazné výhody.\cite{DynamicCF}. Vybral jsem si ji tedy hlavně proto, že se mi zdá zajímavější. Pro zjištění, který model je přesnější, bych ale musel implementovat obě varianty, což je výrazně časově náročný problém a rozdíl by patrně nebyl markantní. Navíc lze jen těžko odhadnout, jak přesně by se jednotlivé modely chovaly v horizontu let.
    %\section{Technologie}
    %Jako technologický základ pro webovou část jsem zvolil AngularJS framework ve spojení s BootStrapem pro snazší responzivní stylování stránky. Pro grafy jsem využil knihovnu HighCharts, protože %obsahuje kvalitní dokumentaci, je responzivní a lze ji snadno zakomponovat do kódu.
    
    
    %\section{Example} Cellý projekt který vytvářím by se dal rozdělit do dvou samostatných částí. První, pro uživatele viditelná, je frontend. Ten musí být schopen správně komunikovat s uživatelem. %Druhou autonomí částí je umělá inteligence. Ta tvoří backend a uživatel se k ní přímo nedostane. 
    %\newline Pro druhou, backendovou část, jsem zvolil jazyk C\#
    
    
    \chapter{Možnosti rozšíření}
    \chapter{Testování}
    
    Radek Puš's avatar
    Radek Puš committed
    
    \begin{conclusion}
    	%sem napište závěr Vaší práce
    
    Radek Puš's avatar
    Radek Puš committed
    Pro svou práci jsem si nastudoval syntaxi a použití jazyků, jmenovitě Typescriptu, Angularu a C\# ve spojení z Entity frameworkem, na kterém jsem založil webovou aplikaci jako takovou. Od firmy Trask Solutions a.s. jsem si zajistil data a ty obohatil o druhy konstantních symbolů. Následně jsem na nich učil umělou inteligenci.
    \newline V práci se mi podařilo umělou umělou inteligenci vytrénovat do té míry, že je schopna do jisté míry předpovědět chování uživatelů. Bohužel, bez přístupu k reálným datům, se mi nepodařilo určit správnost mého rekomandačního modelu dostatečně obsáhle.
    \newline Jako možná další možné vylepšení bych uvedl analýzu transakčních poznámek. Toto by šlo implementovat pravděpodobně nejlépe rozhodovacím stromem. V případě přístupu k neanonymizovaným datům, by se daly doplnit další možné souvislosti pro učení umělé inteligence. Protože je aplikace nezávislá, tak by pro pohodlí uživatelů byla také vhodná nějaká forma automatického importu transakcí (například formou pravidelného zasílání emailů do aplikace).
    
    
    Radek Puš's avatar
    Radek Puš committed
    \end{conclusion}
    
    \bibliographystyle{csn690}
    \bibliography{mybibliographyfile}
    
    \appendix
    
    
    Radek Puš's avatar
    Radek Puš committed
    %============= seznam zkratek disabled ===================
    
    \chapter{Seznam použitých zkratek}
    %\printglossaries
    \begin{description}
    	\item [JSON] JavaScript Object Notation
    	\item [JWT] JSON Web Token
    	\item [SQL] Structured Query Language
    	\item [NoSQL] non SQL
    	\item [CSRF] Cross-site request forgery
    	\item [ARES] Administrativní registr ekonomických subjektů
    \end{description}
    
    Radek Puš's avatar
    Radek Puš committed
    
    
    % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
    % % Tuto kapitolu z výsledné práce ODSTRAŇTE.
    % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
    % 
    % \chapter{Návod k~použití této šablony}
    % 
    % Tento dokument slouží jako základ pro napsání závěrečné práce na Fakultě informačních technologií ČVUT v~Praze.
    % 
    % \section{Výběr základu}
    % 
    % Vyberte si šablonu podle druhu práce (bakalářská, diplomová), jazyka (čeština, angličtina) a kódování (ASCII, \mbox{UTF-8}, \mbox{ISO-8859-2} neboli latin2 a nebo \mbox{Windows-1250}). 
    % 
    % V~české variantě naleznete šablony v~souborech pojmenovaných ve formátu práce\_kódování.tex. Typ může být:
    % \begin{description}
    % 	\item[BP] bakalářská práce,
    % 	\item[DP] diplomová (magisterská) práce.
    % \end{description}
    % Kódování, ve kterém chcete psát, může být:
    % \begin{description}
    % 	\item[UTF-8] kódování Unicode,
    % 	\item[ISO-8859-2] latin2,
    % 	\item[Windows-1250] znaková sada 1250 Windows.
    % \end{description}
    % V~případě nejistoty ohledně kódování doporučujeme následující postup:
    % \begin{enumerate}
    % 	\item Otevřete šablony pro kódování UTF-8 v~editoru prostého textu, který chcete pro psaní práce použít -- pokud můžete texty s~diakritikou normálně přečíst, použijte tuto šablonu.
    % 	\item V~opačném případě postupujte dále podle toho, jaký operační systém používáte:
    % 	\begin{itemize}
    % 		\item v~případě Windows použijte šablonu pro kódování \mbox{Windows-1250},
    % 		\item jinak zkuste použít šablonu pro kódování \mbox{ISO-8859-2}.
    % 	\end{itemize}
    % \end{enumerate}
    % 
    % 
    % V~anglické variantě jsou šablony pojmenované podle typu práce, možnosti jsou:
    % \begin{description}
    % 	\item[bachelors] bakalářská práce,
    % 	\item[masters] diplomová (magisterská) práce.
    % \end{description}
    % 
    % \section{Použití šablony}
    % 
    % Šablona je určena pro zpracování systémem \LaTeXe{}. Text je možné psát v~textovém editoru jako prostý text, lze však také využít specializovaný editor pro \LaTeX{}, např. Kile.
    % 
    % Pro získání tisknutelného výstupu z~takto vytvořeného souboru použijte příkaz \verb|pdflatex|, kterému předáte cestu k~souboru jako parametr. Vhodný editor pro \LaTeX{} toto udělá za Vás. \verb|pdfcslatex| ani \verb|cslatex| \emph{nebudou} s~těmito šablonami fungovat.
    % 
    % Více informací o~použití systému \LaTeX{} najdete např. v~\cite{wikilatex}.
    % 
    % \subsection{Typografie}
    % 
    % Při psaní dodržujte typografické konvence zvoleného jazyka. České \uv{uvozovky} zapisujte použitím příkazu \verb|\uv|, kterému v~parametru předáte text, jenž má být v~uvozovkách. Anglické otevírací uvozovky se v~\LaTeX{}u zadávají jako dva zpětné apostrofy, uzavírací uvozovky jako dva apostrofy. Často chybně uváděný symbol "{} (palce) nemá s~uvozovkami nic společného.
    % 
    % Dále je třeba zabránit zalomení řádky mezi některými slovy, v~češtině např. za jednopísmennými předložkami a spojkami (vyjma \uv{a}). To docílíte vložením pružné nezalomitelné mezery -- znakem \texttt{\textasciitilde}. V~tomto případě to není třeba dělat ručně, lze použít program \verb|vlna|.
    % 
    % Více o~typografii viz \cite{kobltypo}.
    % 
    % \subsection{Obrázky}
    % 
    % Pro umožnění vkládání obrázků je vhodné použít balíček \verb|graphicx|, samotné vložení se provede příkazem \verb|\includegraphics|. Takto je možné vkládat obrázky ve formátu PDF, PNG a JPEG jestliže používáte pdf\LaTeX{} nebo ve formátu EPS jestliže používáte \LaTeX{}. Doporučujeme preferovat vektorové obrázky před rastrovými (vyjma fotografií).
    % 
    % \subsubsection{Získání vhodného formátu}
    % 
    % Pro získání vektorových formátů PDF nebo EPS z~jiných lze použít některý z~vektorových grafických editorů. Pro převod rastrového obrázku na vektorový lze použít rasterizaci, kterou mnohé editory zvládají (např. Inkscape). Pro konverze lze použít též nástroje pro dávkové zpracování běžně dodávané s~\LaTeX{}em, např. \verb|epstopdf|.
    % 
    % \subsubsection{Plovoucí prostředí}
    % 
    % Příkazem \verb|\includegraphics| lze obrázky vkládat přímo, doporučujeme však použít plovoucí prostředí, konkrétně \verb|figure|. Například obrázek \ref{fig:float} byl vložen tímto způsobem. Vůbec přitom nevadí, když je obrázek umístěn jinde, než bylo původně zamýšleno -- je tomu tak hlavně kvůli dodržení typografických konvencí. Namísto vynucování konkrétní pozice obrázku doporučujeme používat odkazování z~textu (dvojice příkazů \verb|\label| a \verb|\ref|).
    % 
    % \begin{figure}\centering
    % 	\includegraphics[width=0.5\textwidth, angle=30]{cvut-logo-bw}
    % 	\caption[Příklad obrázku]{Ukázkový obrázek v~plovoucím prostředí}\label{fig:float}
    % \end{figure}
    % 
    % \subsubsection{Verze obrázků}
    % 
    % % Gnuplot BW i barevně
    % Může se hodit mít více verzí stejného obrázku, např. pro barevný či černobílý tisk a nebo pro prezentaci. S~pomocí některých nástrojů na generování grafiky je to snadné.
    % 
    % Máte-li například graf vytvořený v programu Gnuplot, můžete jeho černobílou variantu (viz obr. \ref{fig:gnuplot-bw}) vytvořit parametrem \verb|monochrome dashed| příkazu \verb|set term|. Barevnou variantu (viz obr. \ref{fig:gnuplot-col}) vhodnou na prezentace lze vytvořit parametrem \verb|colour solid|.
    % 
    % \begin{figure}\centering
    % 	\includegraphics{gnuplot-bw}
    % 	\caption{Černobílá varianta obrázku generovaného programem Gnuplot}\label{fig:gnuplot-bw}
    % \end{figure}
    % 
    % \begin{figure}\centering
    % 	\includegraphics{gnuplot-col}
    % 	\caption{Barevná varianta obrázku generovaného programem Gnuplot}\label{fig:gnuplot-col}
    % \end{figure}
    % 
    % 
    % \subsection{Tabulky}
    % 
    % Tabulky lze zadávat různě, např. v~prostředí \verb|tabular|, avšak pro jejich vkládání platí to samé, co pro obrázky -- použijte plovoucí prostředí, v~tomto případě \verb|table|. Například tabulka \ref{tab:matematika} byla vložena tímto způsobem.
    % 
    % \begin{table}\centering
    % 	\caption[Příklad tabulky]{Zadávání matematiky}\label{tab:matematika}
    % 	\begin{tabular}{|l|l|c|c|}\hline
    % 		Typ		& Prostředí		& \LaTeX{}ovská zkratka	& \TeX{}ovská zkratka	\tabularnewline \hline \hline
    % 		Text		& \verb|math|		& \verb|\(...\)|	& \verb|$...$|		\tabularnewline \hline
    % 		Displayed	& \verb|displaymath|	& \verb|\[...\]|	& \verb|$$...$$|	\tabularnewline \hline
    % 	\end{tabular}
    % \end{table}
    % 
    % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
    
    
    Radek Puš's avatar
    Radek Puš committed
    %============================== temporary disabled =======================
    %\chapter{Obsah přiloženého CD}
    
    Radek Puš's avatar
    Radek Puš committed
    
    %upravte podle skutecnosti
    
    
    Radek Puš's avatar
    Radek Puš committed
    %\begin{figure}
    %	\dirtree{%
    %		.1 readme.txt\DTcomment{stručný popis obsahu CD}.
    %		.1 exe\DTcomment{adresář se spustitelnou formou implementace}.
    %		.1 src.
    %		.2 impl\DTcomment{zdrojové kódy implementace}.
    %		.2 thesis\DTcomment{zdrojová forma práce ve formátu \LaTeX{}}.
    %		.1 text\DTcomment{text práce}.
    %		.2 thesis.pdf\DTcomment{text práce ve formátu PDF}.
    %		.2 thesis.ps\DTcomment{text práce ve formátu PS}.
    %	}
    %\end{figure}
    
    Radek Puš's avatar
    Radek Puš committed
    
    \end{document}