diff --git a/Latex/BP_Radek_Pus_2019.pdf b/Latex/BP_Radek_Pus_2019.pdf index fe63b8cc2aa69a4fa13f6f74fcf9f3529624e718..3f09704ebee6905851d799a4b9992031e086c375 100644 Binary files a/Latex/BP_Radek_Pus_2019.pdf and b/Latex/BP_Radek_Pus_2019.pdf differ diff --git a/Latex/BP_Radek_Pus_2019.tex b/Latex/BP_Radek_Pus_2019.tex index 408f2a72663300ce4e1300089a335b96907a3888..dec1fdb3560cee05bde1a535b405205dbb031135 100644 --- a/Latex/BP_Radek_Pus_2019.tex +++ b/Latex/BP_Radek_Pus_2019.tex @@ -36,7 +36,7 @@ % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % \department{Katedra softwarovĂ©ho inĹľenĂ˝rstvĂ} -\title{Aplikace pro pĹ™edpovĂdánĂ transakcĂ na základÄ› finanÄŤnĂch akcĂ} +\title{Aplikace pro doporuÄŤovánĂ na základÄ› finanÄŤnĂch akcĂ} \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ĹŻ @@ -44,23 +44,23 @@ \supervisor{Ing. Miroslav BalĂk, Ph.D.} \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ĹŻ, PaeDr. JiĹ™inÄ› MališovĂ© za korekturu anglicky psanĂ©ho abstraktu a svĂ˝m rodiÄŤĹŻm, za veškerou podporu pĹ™i psanĂ práce.} \abstractCS -{V bakalářskĂ© práci je Ĺ™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, tvoĹ™ĂcĂho klientskou aplikaci, frameworkem .NET Core, kterĂ˝ tuto aplikaci obsluhuje ve spojenĂ s~databázĂ Microsoft SQL. Pro zabezpeÄŤenĂ komunikace je vyuĹľito 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. +{V bakalářskĂ© práci je Ĺ™ešen problĂ©m pĹ™edpovĂdánĂ budoucĂch vĂ˝dajĹŻ klientovi, na základÄ› jeho uplynulĂ© finanÄŤnĂ historie. CĂlem práce je implementovat toto pĹ™edpovĂdánĂ zejmĂ©na pomocĂ umÄ›lĂ© inteligence a vytvoĹ™it webovĂ© rozhranĂ, kterĂ© by zobrazovalo vĂ˝sledky pĹ™edpovÄ›dĂ. Celá aplikace je vytvoĹ™ena pomocĂ tĹ™ĂvrstvĂ© architektury, kde frontend je tvoĹ™en frameworkem Angular, backend pomocĂ .NET Core frameworku a databáze je zaloĹľená na Microsoft SQL. -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, zda se bude transakce opakovat, ÄŤi nikoli. Aby se poslĂ©ze dalo vyhodnotit, zda se transakce opravdu opakovala, byly porovnávány velikosti transakcĂ po jednotlivĂ˝ch tĂ˝dnech, a ty, částkou si nejvĂce podobnĂ©, byly oznaÄŤeny za opakujĂcĂ se. +UmÄ›lá inteligence je implementována jako nÄ›kolik po sobÄ› jdoucĂch vrstev neuronĹŻ, pĹ™iÄŤemĹľ vrstvy jsou uspořádány tak, Ĺľe mnoĹľstvĂ neuronĹŻ se v kaĹľdĂ© dalšà vrstvÄ› postupnÄ› sniĹľuje na jeden jedinĂ˝, kterĂ˝ dává informaci, zda se bude transakce opakovat, ÄŤi nikoli. Aby se poslĂ©ze dalo vyhodnotit, zda se transakce opravdu opakovala, byly porovnávány velikosti transakcĂ po jednotlivĂ˝ch tĂ˝dnech, a ty, částkou si nejvĂce podobnĂ©, byly oznaÄŤeny za opakujĂcĂ se. -Toto pĹ™edpovĂdánĂ bylo dále doplnÄ›no o pĹ™edvĂdánĂ na základÄ› prĹŻmÄ›rĹŻ a porovnávánĂ velikosti jednotlivĂ˝ch částek, z uĹľivatelem nahranĂ© transakÄŤnĂ historie. +Toto pĹ™edpovĂdánĂ bylo dále doplnÄ›no o pĹ™edpovĂdánĂ na základÄ› prĹŻmÄ›rĹŻ a~porovnávánĂ velikosti jednotlivĂ˝ch částek, z uĹľivatelem nahranĂ© transakÄŤnĂ historie. } \abstractEN{ -In the bachelor thesis is 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, 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. +In the bachelor thesis is solved the problem of forecasting future transactions to the client, based on his past financial history. The aim of this work is to implement this prediction especially using artificial intelligence and to create a web interface that would display the results of predictions. The whole application is created using a three-tier architecture, where the frontend consists of the Angular framework, the backend is using the .NET Core framework and the database is based on Microsoft SQL. -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. +Artificial intelligence is implemented as several successive layers of neurons, the layers being arranged such that the amount of neurons in each additional layer is gradually reduced to one, which gives information whether the transaction will repeat or not. Then, in order to evaluate whether the transaction was actually repeating, the size of the transactions was compared on a~week-by-week basis, and those with the most similar amount were identified as recurring. This prediction was further supplemented by averaging based on a comparison of the size of individual amounts from the user's imported transaction history. } \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} +\keywordsCS{webovĂ˝ portál, pĹ™edpovĂdánĂ finanÄŤnĂch transakcĂ, analĂ˝za finanÄŤnĂch transakcĂ, umÄ›lá inteligence, .NET Core, Entity Framework, Angular} \keywordsEN{web portal, anticipating financial transactions, financial transaction analysis, artificial intelligence, .NET Core, Entity Framework, Angular} \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 @@ -75,20 +75,20 @@ This prediction was further supplemented by averaging based on a comparison of t % - 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 pĹ™edvĂdánĂ finanÄŤnĂch transakcĂ. PĹ™i vĂ˝bÄ›ru tĂ©matu jsem vyuĹľil zájmu jednĂ© bankovnĂ instituce o odkoupenĂ vĂ˝slednĂ©ho produktu. Banka by nabĂdla svĂ˝m klientĹŻm moĹľnost zobrazit si svĂ© pravdÄ›podobnĂ© transakce a zĂskat tak komplexnÄ›jšà pĹ™ehled o vĂ˝dajĂch. Na základÄ› toho by klienti dostali moĹľnost napĹ™Ăklad vylouÄŤit nebo omezit nÄ›kterĂ© transakce a tĂm ušetĹ™it svĂ© finanÄŤnĂ prostĹ™edky. BankovnĂ instituce tĂm navýšà komfort klientĹŻ na svĂ©m webu, coĹľ by mÄ›lo pĹ™ispÄ›t k jejich vÄ›tšà celkovĂ© spokojenosti. +Ve svĂ© práci Ĺ™ešĂm problĂ©m pĹ™edpovĂdánĂ finanÄŤnĂch transakcĂ. PĹ™i vĂ˝bÄ›ru tĂ©matu jsem vyuĹľil zájmu jednĂ© bankovnĂ instituce o odkoupenĂ vĂ˝slednĂ©ho produktu. Banka by nabĂdla svĂ˝m klientĹŻm moĹľnost zobrazit si svĂ© pravdÄ›podobnĂ© transakce a zĂskat tak komplexnÄ›jšà pĹ™ehled o vĂ˝dajĂch. Na základÄ› toho by klienti dostali moĹľnost napĹ™Ăklad vylouÄŤit nebo omezit nÄ›kterĂ© transakce a tĂm ušetĹ™it svĂ© finanÄŤnĂ prostĹ™edky. BankovnĂ instituce tĂm navýšà komfort klientĹŻ na svĂ©m webu, coĹľ by mÄ›lo pĹ™ispÄ›t k jejich vÄ›tšà celkovĂ© spokojenosti. -V prĹŻbÄ›hu tvorby tĂ©to práce jsem si zároveĹ prohloubil znalosti v oboru umÄ›lĂ© inteligence, která dokáže pĹ™edvĂdat chovánĂ uĹľivatelĹŻ na základÄ› pĹ™edem zĂskanĂ˝ch dat. VĂ˝voj v tĂ©to oblasti mne vĹľdy zajĂmal a to bylo takĂ© mou motivacĂ pĹ™i vĂ˝bÄ›ru tĂ©matu. +V prĹŻbÄ›hu tvorby tĂ©to práce jsem si zároveĹ prohloubil znalosti v oboru umÄ›lĂ© inteligence, která dokáže pĹ™edpovĂdat chovánĂ uĹľivatelĹŻ na základÄ› pĹ™edem zĂskanĂ˝ch dat. VĂ˝voj v tĂ©to oblasti mne vĹľdy zajĂmal a to bylo takĂ© mou motivacĂ pĹ™i vĂ˝bÄ›ru tĂ©matu. -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 a podĂlĂm se na vĂ˝voji aplikace právÄ› v jazyce C\# a frameworku ASP.NET. Pro účely práce jsem zvolil .NET Core ve spojenĂ s~Entity Frameworkem, coĹľ je nová a navazujĂcĂ technologie na ASP.NET. Pro frontend jsem vyuĹľil Angular. S~tÄ›mito technologiemi navĂc pracuje tĂ˝m, se kterĂ˝m v práci spolupracuji na rozvoji aplikace. Zkušenosti nabytĂ© pĹ™i tvorbÄ› bakalářskĂ© práce, bych rád vyuĹľil ke zvýšenĂ svĂ© kvalifikace v~oboru. +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 a podĂlĂm se na vĂ˝voji aplikace právÄ› v jazyce C\# a frameworku ASP.NET. Pro účely práce jsem zvolil .NET Core ve spojenĂ s~Entity Frameworkem, coĹľ je nová a navazujĂcĂ technologie na ASP.NET. Pro frontend jsem vyuĹľil framework Angular. S~tÄ›mito technologiemi navĂc pracuje tĂ˝m, se kterĂ˝m v práci spolupracuji na rozvoji aplikace. Zkušenosti nabytĂ© pĹ™i tvorbÄ› bakalářskĂ© práce, bych rád vyuĹľil ke zvýšenĂ svĂ© kvalifikace v~oboru. Práci jsem rozÄŤlenil do pÄ›ti kapitol. V prvnĂ jsem analyzoval problĂ©m a~zkoumal, jestli jiĹľ byl Ĺ™ešen dĹ™Ăve. Ve druhĂ© kapitole, realizaci, popisuji, jak jsem vše Ĺ™ešil. AĹĄ uĹľ web, umÄ›lou inteligenci nebo databázi. V následujĂcĂ kapitole popisuji vĂ˝slednĂ© uĹľivatelskĂ© rozhranĂ, potĂ©, v kapitole testovánĂ, zkoumám, jestli se aplikace chová korektnÄ›. V poslednĂ kapitole jsem se pak zabĂ˝val, jakĂ˝m zpĹŻsobem by šlo aplikaci rozšĂĹ™it. \end{introduction} \chapter{CĂl práce} -CelkovĂ˝m cĂlem je vytvoĹ™enĂ webovĂ© aplikace, která bude registrovanĂ˝m uĹľiva-telĹŻm poskytovat sluĹľbu pĹ™edvĂdánĂ finanÄŤnĂch transakcĂ na základÄ› jimi nahranĂ©ho vĂ˝pisu z účtu. Tohoto cĂle je dosaĹľeno splnÄ›nĂm dvou dĂlÄŤĂch částĂ: rešeršnĂ a praktickĂ©. +CelkovĂ˝m cĂlem je vytvoĹ™enĂ webovĂ© aplikace, která bude registrovanĂ˝m uĹľiva-telĹŻm poskytovat sluĹľbu pĹ™edpovĂdánĂ finanÄŤnĂch transakcĂ na základÄ› jimi nahranĂ©ho vĂ˝pisu z účtu. Tohoto cĂle je dosaĹľeno splnÄ›nĂm dvou dĂlÄŤĂch částĂ: rešeršnĂ a praktickĂ©. \section{Rešeršnà část} -CĂlem teoretickĂ© části práce je nastudovánĂ Angular frameworku, Typescriptu, Entity Frameworku Core / .NET Core a analĂ˝za funkÄŤnĂch i nefunkÄŤnĂch poĹľadavkĹŻ aplikace. Dále je tĹ™eba analyzovat moĹľnosti autentizace a zabe-zpeÄŤenĂ uĹľivatelskĂ˝ch dat a stejnÄ› tak ukládánĂ a obohacovánĂ dat uĹľivatelem nahranĂ© finanÄŤnĂ historie. TakĂ© je nutnĂ© zĂskat pĹ™ehled existujĂcĂch Ĺ™ešenĂ a zjistit moĹľnosti vyuĹľitĂ umÄ›lĂ© inteligence, která bude muset alespoĹ zčásti pĹ™ed-povÄ›dÄ›t chovánĂ uĹľivatelĹŻ. Tato umÄ›lá inteligence bude pĹ™edpovĂdat chovánĂ uĹľivatelĹŻ právÄ› na základÄ› pĹ™edem zĂskanĂ˝ch a obohacenĂ˝ch dat jejich finanÄŤnĂ historie. +CĂlem teoretickĂ© části práce je nastudovánĂ frameworku Angular, Typescriptu, Entity Frameworku Core / .NET Core a analĂ˝za funkÄŤnĂch i nefunkÄŤnĂch poĹľadavkĹŻ aplikace. Dále je tĹ™eba analyzovat moĹľnosti autentizace a zabe-zpeÄŤenĂ uĹľivatelskĂ˝ch dat a stejnÄ› tak ukládánĂ a obohacovánĂ dat uĹľivatelem nahranĂ© finanÄŤnĂ historie. TakĂ© je nutnĂ© zĂskat pĹ™ehled existujĂcĂch Ĺ™ešenĂ a zjistit moĹľnosti vyuĹľitĂ umÄ›lĂ© inteligence, která bude muset alespoĹ zčásti pĹ™ed-povÄ›dÄ›t chovánĂ uĹľivatelĹŻ. Tato umÄ›lá inteligence bude pĹ™edpovĂdat chovánĂ uĹľivatelĹŻ právÄ› na základÄ› pĹ™edem zĂskanĂ˝ch a obohacenĂ˝ch dat jejich finanÄŤnĂ historie. \section{Praktická část} 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. @@ -104,25 +104,25 @@ Aplikace musĂ splĹovat jistĂ© poĹľadavky. Ty se dajĂ rozdÄ›lit na poĹľadavky \begin{enumerate}[a)] \item FunkÄŤnĂ poĹľadavky \begin{enumerate}[--] - \item registrace a pĹ™ihlašovánĂ uĹľivatelĹŻ - \item zmÄ›na hesla - \item smazánà účtu - \item nahrávánĂ finanÄŤnĂ historie ve formátu csv - \item zobrazenĂ historie plateb - \item odhad vĂ˝dajĹŻ neuronovou sĂtĂ - \item odhad vĂ˝dajĹŻ prĹŻmÄ›rovánĂm vĂ˝dajĹŻ - \item odhad vĂ˝dajĹŻ porovnávánĂm vĂ˝dajĹŻ - \item šifrovánĂ hesel + \item registrace a pĹ™ihlašovánĂ uĹľivatelĹŻ, + \item zmÄ›na hesla, + \item smazánà účtu, + \item nahrávánĂ finanÄŤnĂ historie ve formátu csv, + \item zobrazenĂ historie plateb, + \item odhad budoucĂch vĂ˝dajĹŻ (z finanÄŤnĂ historie) neuronovou sĂtĂ, + \item odhad budoucĂch vĂ˝dajĹŻ prĹŻmÄ›rovánĂm historickĂ˝ch vĂ˝dajĹŻ, + \item odhad budoucĂch vĂ˝dajĹŻ porovnávánĂm částek historickĂ˝ch vĂ˝dajĹŻ. \end{enumerate} \item NefunkÄŤnĂ poĹľadavky \begin{enumerate}[--] - \item .NET Core 2.2 - \item Microsoft SQL Server 2019 - \item http-server + \item .NET Core 2.2, + \item Microsoft SQL Server 2019, + \item http-server, + \item šifrovánĂ hesel. \end{enumerate} \end{enumerate} -ProdukÄŤnĂ verzi aplikace bude moĹľnĂ© alternativnÄ› spustit v pomocĂ Dockeru, kterĂ˝ jednotlivĂ© nástroje pro bÄ›h bude zastĹ™ešovat v nadefinovanĂ©m kontejneru. +ProdukÄŤnĂ verzi aplikace bude moĹľnĂ© alternativnÄ› spustit pomocĂ Dockeru, kterĂ˝ jednotlivĂ© nástroje pro bÄ›h bude zastĹ™ešovat v nadefinovanĂ©m kontejneru. \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. @@ -138,8 +138,8 @@ UkládánĂ u uĹľivatele má tu vĂ˝hodu, Ĺľe se nemusĂ ukládat na serveru toli 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{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Ă© \uv{\textit{George}}~a jejĂ doplnÄ›k \uv{\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 \uv{\textit{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Ă©ma 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. +\section{ExistujĂcĂ Ĺ™ešenĂ} +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Ă© \uv{\textit{George}}~a jejĂ doplnÄ›k \uv{\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 \uv{\textit{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Ă©ma 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. 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}. @@ -148,8 +148,8 @@ Na zahraniÄŤnĂm trhu pak existujĂ aplikace, kterĂ© umoĹľĹujĂ klientĹŻm sledo \caption[Moje zdravĂ© finance]{Moje zdravĂ© finance - pĹ™edpovĂdánĂ transakcĂ ÄŚeskĂ© spoĹ™itelny}\label{fig:float} \end{figure} -\subsection{ObdobnĂ© frameworky pro umÄ›lou inteligenci} -Existuje mnoho externĂch knihoven, kterĂ© implementujĂ neuronovĂ© sĂtÄ›. VÄ›tšina je však placená a nenabĂzĂ rozhranĂ pro C\#, ÄŤasto se takĂ© omezujĂ pouze na Python pĹ™ĂpadnÄ› C++. PĹ™Ăkladem mĹŻĹľe bĂ˝t Opennn\cite{OpenNN}, PyTorch\cite{PyTorch}, Keras\cite{Keras}, Tensorflow\cite{TensorFlow} ÄŤi Machine Learning od AWS (dceĹ™iná spoleÄŤnost Amazonu)\cite{AmazonML}. +\subsection{ExistujĂcĂ implementace neuronovĂ© sĂtÄ›} +Existuje mnoho externĂch knihoven, kterĂ© implementujĂ neuronovĂ© sĂtÄ›. VÄ›tšina je však placená a nenabĂzĂ rozhranĂ pro C\#, ÄŤasto se takĂ© omezujĂ pouze na Python, pĹ™ĂpadnÄ› C++. PĹ™Ăkladem mĹŻĹľe bĂ˝t Opennn\cite{OpenNN}, PyTorch\cite{PyTorch}, Keras\cite{Keras}, Tensorflow\cite{TensorFlow} ÄŤi Machine Learning od AWS (dceĹ™iná spoleÄŤnost Amazonu)\cite{AmazonML}. UmÄ›lá inteligence urÄŤená pro C\# je vyvĂjena hlavnÄ› spoleÄŤnostĂ Microsoft. Ta vyvinula dva frameworky CNTK a ML.NET. @@ -157,8 +157,10 @@ CNTK je framework zaměřenĂ˝ na neuronovĂ© sĂtÄ›\cite{CNTK}. Zpočátku obsaho ML.NET je zaměřen na .NET vĂ˝vojáře\cite{MLNET}. ZároveĹ se snažà bĂ˝t vĂce multifunkÄŤnĂ (obsahuje i algoritmy jako K-Means\cite{MLNET_Iris}). TakĂ© umoĹľĹuje základnĂ generovánĂ kĂłdu pro veĹ™ejnost (pomocĂ AutoML\cite{MLNET_AutoML}), která se nezabĂ˝vá detailnĂ funkÄŤnostĂ umÄ›lĂ© inteligence. +V dobÄ› rozhodovánĂ o formÄ› implementace neuronovĂ© sĂtÄ› došlo i k pokusu o jeho implementaci pomocĂ CNTK. V tĂ© dobÄ› však ještÄ› nebyla plnÄ› dokonÄŤena dokumentace C\# API, coĹľ zpĹŻsobovalo znaÄŤnĂ© problĂ©my s porozumÄ›nĂm tomuto frameworku. U frameworku ML.NET bylo prvnĂ preview vydáno v zářà 2019\cite{MLNET_preview}, tedy v dobÄ›, kdy uĹľ bylo nutnĂ© bakalářskou práci vyvĂjet. Z tÄ›chto dĹŻvodĹŻ došlo k pĹ™iklonÄ›nĂ se k vytvoĹ™enĂ vlastnĂ implementace neuronovĂ© sĂtÄ›. + \section{ObohacenĂ dat}\label{ObohaceniDat} -Pro obohacenĂ dat by bylo moĹľnĂ© teoreticky vyuĹľĂt veĹ™ejnÄ› dostupnou databázi MFÄŚR - ARES (AdminstrativnĂ registr ekonomickĂ˝ch subjektĹŻ), resp. veĹ™ejnÄ› dostupnou odnoĹľ databáze \uv{VREO} (elektronickĂ˝ opis VeĹ™ejnĂ©ho rejstĹ™Ăku), na kterou se sluĹľba odkazuje.\cite{ARES_zip}. BohuĹľel data v tĂ©to databázi 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 zadány naprosto nahodile a nenĂ vyuĹľito žádnĂ©ho oficiálnĂho klĂÄŤe. NedefinovanĂ© hodnoty obsahujĂ vĂ˝razy jako: "0", "null", "NULL", "prázdnĂ©", "nic", "nenĂ", "nedefinováno"~apod. 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 necelĂ˝ch 8000 znakĹŻ. Lze tedy usoudit, Ĺľe vyuĹľitĂ tohoto zdroje je tĂ©měř nemoĹľnĂ© a pro obohacenĂ se nehodĂ. +Pro obohacenĂ dat by bylo moĹľnĂ© teoreticky vyuĹľĂt veĹ™ejnÄ› dostupnou databázi MFÄŚR - ARES (AdminstrativnĂ registr ekonomickĂ˝ch subjektĹŻ), resp. veĹ™ejnÄ› dostupnou odnoĹľ databáze \uv{VREO} (elektronickĂ˝ opis VeĹ™ejnĂ©ho rejstĹ™Ăku), na kterou se sluĹľba odkazuje.\cite{ARES_zip}. BohuĹľel data v tĂ©to databázi 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 zadány naprosto nahodile a nenĂ vyuĹľito žádnĂ©ho oficiálnĂho klĂÄŤe. NedefinovanĂ© hodnoty obsahujĂ vĂ˝razy jako: \uv{0}, \uv{null}, \uv{NULL}, \uv{prázdnĂ©}, \uv{nic}, \uv{nenĂ}, \uv{nedefinováno}~apod. 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 necelĂ˝ch 8000 znakĹŻ (snĂmek dat z databáze pro KomerÄŤnĂ banku v pĹ™Ăloze \uv{\textit{KB\textunderscore VREO.xml}}). 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 VREO, ale jak uĹľ je zmĂnÄ›no výše, toto napojenĂ nepĹ™ipadá v Ăşvahu. @@ -183,35 +185,35 @@ Aplikace bude muset umoĹľĹovat ukládat uĹľivatelskĂ© účty a zároveĹ k nim Za prvnà část databáze by se dala povaĹľovat data o uĹľivatelĂch, kteřà budou do~aplikace pĹ™istupovat. Je nutnĂ© si pro nÄ› pamatovat uĹľivatelskĂ© jmĂ©no a heslo. Heslo samozĹ™ejmÄ› musĂ bĂ˝t uloĹľeno v šifrovanĂ© podobÄ›. \subsection{UĹľivatelská data} -Druhá část, ukládánĂ uĹľivatelskĂ˝ch dat, je nároÄŤnÄ›jšĂ. Je potĹ™eba zvážit, jak je ukládat. Veškerá data totiĹľ budou pĹ™Ăstupná z csv souborĹŻ ("\textit{Comma-Separated Values}"~-- čárkou oddÄ›lenĂ© hodnoty)\cite{csv_name}. Z toho dĹŻvodu se nabĂzĂ dvÄ› moĹľnosti: +Druhá část, ukládánĂ uĹľivatelskĂ˝ch dat, je nároÄŤnÄ›jšĂ. Je potĹ™eba zvážit, jak je ukládat. Veškerá data totiĹľ budou pĹ™Ăstupná z csv souborĹŻ (\uv{\textit{Comma-Separated Values}}~-- čárkou oddÄ›lenĂ© hodnoty)\cite{csv_name}. Z toho dĹŻvodu se nabĂzĂ dvÄ› moĹľnosti: \begin{enumerate}[a)] - \item UkládánĂ ve formÄ› NoSQL + \item UkládánĂ ve formÄ› NoSQL. \item ParsovánĂ transakcĂ do podoby nÄ›jakĂ©ho relaÄŤnĂho modelu a uloĹľenĂ v nÄ›m. \end{enumerate} -UkládánĂm ve formÄ› NoSQL je myšleno ukládánĂ dat, jak pĹ™ijdou od uĹľiva-tele s minimálnĂmi Ăşpravami (as-is). Pro veškerĂ© operace s uĹľivatelskĂ˝mi daty by se vyuĹľĂvala jedna \mbox{"velká tabulka"~(super--entita).} Z transakcĂ samotnĂ˝ch lze vyvodit nÄ›jakou jistou strukturu a v tom pĹ™ĂpadÄ› bude docházet k zbyteÄŤnÄ› velkĂ© redundanci dat. +UkládánĂm ve formÄ› NoSQL je myšleno ukládánĂ dat, jak pĹ™ijdou od uĹľiva-tele s minimálnĂmi Ăşpravami (as-is). Pro veškerĂ© operace s uĹľivatelskĂ˝mi daty by se vyuĹľĂvala jedna \mbox{\uv{velká tabulka}~(super--entita).} Z transakcĂ samotnĂ˝ch lze vyvodit nÄ›jakou jistou strukturu a v tom pĹ™ĂpadÄ› bude docházet k zbyteÄŤnÄ› velkĂ© redundanci dat. Druhou moĹľnostĂ je transakci rozdÄ›lit na nÄ›kolik částĂ (tabulek) a s tÄ›mi následnÄ› pracovat. VĂ˝hodou zde je práce s menšĂmi daty i menšà databázĂ. \subsection{Neuronová sĂĹĄ} -Neuronová sĂĹĄ je tvoĹ™ena pomocĂ vrstev, neuronĹŻ a vah vstupĹŻ. UkládánĂ tÄ›chto dat pĹ™Ămo vybĂzĂ k uloĹľenĂ ve strukturovanĂ© databázi, rozdÄ›lenĂ© pĹ™Ămo na tyto samostatnĂ© celky. +Neuronová sĂĹĄ je tvoĹ™ena pomocĂ vrstev neuronĹŻ a vah vstupĹŻ. UkládánĂ tÄ›chto dat pĹ™Ămo vybĂzĂ k uloĹľenĂ ve strukturovanĂ© databázi, rozdÄ›lenĂ© pĹ™Ămo na tyto samostatnĂ© celky. \chapter{Realizace} \section{WebovĂ© rozhranĂ} -Pro webovĂ© rozhranĂ byla zvolena single 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Ä› je nutnĂ© jen zobrazovat grafy a pĹ™edpoklady. NemusĂ se tedy vytvářet rozsáhlĂ˝ web, ale jen jednoduchĂ© smÄ›rová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. +Pro webovĂ© rozhranĂ byla zvolena single 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Ä› je nutnĂ© jen zobrazovat grafy a pĹ™edpoklady. NemusĂ se tedy vytvářet rozsáhlĂ˝ web, ale jen jednoduchĂ© smÄ›rová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 chyby. %TODO highcharts, bootstrap, angularmaterial, interceptor, \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. +V pĹ™ĂpadÄ› zabezpeÄŤenĂ komunikace mezi backendem a frontendem (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Ă autorovi vyzkoušet si novou technologii. K zabezpeÄŤenĂ smÄ›rovánĂ na stranÄ› klienta bylo vyuĹľito tzv. guardĹŻ, jeĹľ jsou součástĂ Angular frameworku. A koneÄŤnÄ› k zabezpeÄŤenĂ uĹľivatelskĂ˝ch hesel se vyuĹľilo hashovacĂho algoritmu RFC~2898/SHA512. Pro kaĹľdĂ© heslo se navĂc 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ĹŻ} -Aby bylo moĹľnĂ© ÄŤinit nÄ›jakĂ© pĹ™edpovÄ›di, je nutnĂ© od uĹľivatele zĂskat urÄŤitá data. Toho bylo docĂleno na základÄ› nahránĂ vyexportovanĂ© transakÄŤnĂ historie z banky uĹľivatele. Ta musĂ bĂ˝t zároveĹ vyexportována ve formátu CSV. +Aby bylo moĹľnĂ© ÄŤinit nÄ›jakĂ© pĹ™edpovÄ›di, je nutnĂ© od uĹľivatele zĂskat urÄŤitá data. Toho bylo docĂleno na základÄ› nahránĂ vyexportovanĂ© transakÄŤnĂ historie z banky uĹľivatele. ZároveĹ se pĹ™edpokládá, Ĺľe historie bude ve validnĂm CSV formátu \subsection{Import} -CelĂ˝ import zaÄŤĂná na webovĂ©m rozhranĂ. Zde uĹľivatel vybere soubor a stiskne tlaÄŤĂtko "nahrát". To zpĹŻsobĂ zahájenĂ celĂ©ho procesu parsovánĂ dokumentu a~jeho ukládánĂ do databáze. +MoĹľnost importu souborĹŻ je pĹ™Ăstupná z hlavnĂ stránky (stránka po pĹ™ihlášenĂ uĹľivatele). Zde uĹľivatel vybere soubor a stiskne tlaÄŤĂtko \uv{nahrát}. To zpĹŻsobĂ zahájenĂ celĂ©ho procesu parsovánĂ dokumentu a~jeho ukládánĂ do databáze. -InternÄ› celĂ˝ proces probĂhá tak, Ĺľe dojde k zavolánĂ nÄ›jakĂ© funkce, která pĹ™evezme danĂ˝ soubor a pĹ™es API pošle na server. PĹ™i tomto poĹľadavku se~pak automaticky (jako pĹ™i kaĹľdĂ©m volánĂ API) zavolá tzv. "Interceptor". Ten vložà do hlaviÄŤky volánĂ ještÄ› Ăşdaj o JWT tokenu, aby server mohl rozpoznat, jestli je volánĂ oprávnÄ›nĂ© ÄŤi nikoli. JWT token navĂc obsahuje Ăşdaje s informacĂ, kterĂ©mu uĹľivateli tento poĹľadavek náleĹľĂ. +InternÄ› celĂ˝ proces probĂhá tak, Ĺľe dojde k zavolánĂ nÄ›jakĂ© funkce, která pĹ™evezme danĂ˝ soubor a pĹ™es API pošle na server. PĹ™i tomto poĹľadavku se~pak automaticky (jako pĹ™i kaĹľdĂ©m volánĂ API) zavolá tzv. \uv{Interceptor}. Ten vložà do hlaviÄŤky volánĂ ještÄ› Ăşdaj o JWT tokenu, aby server mohl rozpoznat, jestli je volánĂ oprávnÄ›nĂ© ÄŤi nikoli. JWT token navĂc obsahuje Ăşdaje s informacĂ, kterĂ©mu uĹľivateli tento poĹľadavek náleĹľĂ. Po zpracovánĂ poĹľadavku na frontendu, dojde ke zpracovánĂ poĹľadavku na serveru. Ten ověřĂ, jestli je uĹľivatel pĹ™ihlášen, soubor je v pořádku, a zároveĹ, zda jiĹľ nebyl nahrán soubor se stejnĂ˝m jmĂ©nem pro danĂ©ho uĹľivatele. Pokud ano, pošle soubor dále ke zpracovánĂ. V opaÄŤnĂ©m pĹ™ĂpadÄ› vrátĂ HTTP status BadRequest a dál nepokraÄŤuje. @@ -221,84 +223,84 @@ Pokud došlo k ĂşspěšnĂ©mu zpracovánĂ poĹľadavku, dojde k parsovánĂ soubor Tato knihovna potĹ™ebuje k ĂşspěšnĂ©mu zpracovánĂ dokumentu nadefinovanou tĹ™Ădu, jeĹľ obsahuje veškerĂ© poloĹľky, kterĂ© majĂ bĂ˝t v dokumentu vybrány. PĹ™estoĹľe by pro extrakci staÄŤilo vybrat pouze částku, datum a KS, bylo naÄŤteno podstatnÄ› vĂce ĂşdajĹŻ pro pĹ™ĂpadnĂ© rozšĂĹ™enĂ aplikace. VeškerĂ© naÄŤĂtanĂ© Ăşdaje jsou proto následujĂcĂ: \begin{itemize}[--] - \item typ účtu - \item ÄŤĂslo účtu (vÄŤetnÄ› kĂłdu banky) - \item datum zaúčtovánĂ - \item částka - \item mÄ›na - \item zĹŻstatek - \item ÄŤĂslo protiúčtu (vÄŤetnÄ› kĂłdu banky) - \item konstantnĂ, specifickĂ˝, variabilnĂ symbol - \item typ operace - \item ID transakce v bance - \item poznámka + \item typ účtu, + \item ÄŤĂslo účtu (vÄŤetnÄ› kĂłdu banky), + \item datum zaúčtovánĂ, + \item částka, + \item mÄ›na, + \item zĹŻstatek, + \item ÄŤĂslo protiúčtu (vÄŤetnÄ› kĂłdu banky), + \item konstantnĂ, specifickĂ˝, variabilnĂ symbol, + \item typ operace, + \item ID transakce v bance, + \item poznámka. \end{itemize} -K výše zmĂnÄ›nĂ©mu výčtu je však nutno zdĹŻraznit, Ĺľe ne všechny poloĹľky jsou povinnĂ©. V práci došlo na omezenĂ se na pouze dvÄ› povinnĂ© poloĹľky a totiĹľ datum zaúčtovánĂ a částka. V pĹ™ĂpadÄ› chybÄ›jĂcĂho ÄŤĂsla účtu docházĂ k jeho nahrazenĂ ID uĹľivatele s kĂłdem banky "857368". Tato hodnota je ekvivalentnĂ textu "UID"~(User ID - uĹľivatelskĂ© ID) v ASCII tabulce (kĂłdová tabulka pro znaky anglickĂ© abecedy). +K výše zmĂnÄ›nĂ©mu výčtu je však nutno zdĹŻraznit, Ĺľe ne všechny poloĹľky jsou povinnĂ©. V práci došlo na omezenĂ se na pouze dvÄ› povinnĂ© poloĹľky a totiĹľ datum zaúčtovánĂ a částka. V pĹ™ĂpadÄ› chybÄ›jĂcĂho ÄŤĂsla účtu docházĂ k jeho nahrazenĂ ID uĹľivatele s kĂłdem banky \uv{857368}. Tato hodnota je ekvivalentnĂ textu \uv{UID}~(User ID - uĹľivatelskĂ© ID) v ASCII tabulce (kĂłdová tabulka pro znaky anglickĂ© abecedy). %TODO ref csv soubory -PĹ™i realizaci bylo myšleno i na rĹŻzná pojmenovánĂ napĹ™ĂÄŤ jednotlivĂ˝mi bankami, a k pokusu o vytvoĹ™enĂ maximálnĂ univerzálnosti Ĺ™ešenĂ. Proto se pro nÄ›kterĂ© poloĹľky definovalo vĂce názvĹŻ. PĹ™Ăkladem tak mĹŻĹľe bĂ˝t poloĹľka "oznaÄŤenĂ operace", jak je pojmenována v ÄŚSOB a "typ transakce", coĹľ je ekvivalent v ÄŚeskĂ© spoĹ™itelnÄ›. +PĹ™i realizaci bylo myšleno i na rĹŻzná pojmenovánĂ napĹ™ĂÄŤ jednotlivĂ˝mi bankami, a k pokusu o vytvoĹ™enĂ maximálnĂ univerzálnosti Ĺ™ešenĂ. Proto se pro nÄ›kterĂ© poloĹľky definovalo vĂce názvĹŻ. PĹ™Ăkladem tak mĹŻĹľe bĂ˝t poloĹľka \uv{oznaÄŤenĂ operace}, jak je pojmenována v ÄŚSOB a \uv{typ transakce}, coĹľ je ekvivalent v ÄŚeskĂ© spoĹ™itelnÄ›. -RelativnÄ› pĹ™ekvapivĂ˝m problĂ©mem je však parsovánà částky transakce. PĹ™i exportu dat totiĹľ mĹŻĹľe bĂ˝t ve formátu "1 234.56"~- s mezerou, oddÄ›lujĂcà řády. TakĂ© ale mĹŻĹľe obsahovat rozdĂlnĂ© oddÄ›lovaÄŤe desetinnĂ˝ch mĂst, pĹ™. "12,35". ProblĂ©m mezery však lze snadno vyĹ™ešit povolenĂm tĂ©to skuteÄŤnosti pĹ™i parsovánĂ pomocĂ metody, v .NET frameworku, System.Parse. +RelativnÄ› pĹ™ekvapivĂ˝m problĂ©mem je však parsovánà částky transakce. PĹ™i exportu dat totiĹľ mĹŻĹľe bĂ˝t ve formátu \uv{1 234.56}~- s mezerou, oddÄ›lujĂcà řády. TakĂ© ale mĹŻĹľe obsahovat rozdĂlnĂ© oddÄ›lovaÄŤe desetinnĂ˝ch mĂst, pĹ™. \uv{12,35}. ProblĂ©m mezery však lze snadno vyĹ™ešit povolenĂm tĂ©to skuteÄŤnosti pĹ™i parsovánĂ pomocĂ metody, v .NET frameworku, System.Parse. -ProblĂ©m desetinnĂ© čárky nenĂ o tolik těžšĂ. PĹ™ed parsovánĂm stačà částku projĂt a nahradit znak ","~znakem "."~. TĂm dojde k unifikaci ÄŤĂsla. +ProblĂ©m desetinnĂ© čárky nenĂ o tolik těžšĂ. PĹ™ed parsovánĂm stačà částku projĂt a nahradit znak ','~znakem '.'~. TĂm dojde k unifikaci ÄŤĂsla. \subsection{UkládánĂ} Po parsovánĂ dokumentu docházĂ k ukládánĂ pouze tÄ›ch záznamĹŻ, kterĂ© se podaĹ™ilo ĂşspěšnÄ› zpracovat. Všechny neĂşspěšnĂ© záznamy jsou pĹ™eskoÄŤeny. TĂm docházĂ k zaloĹľenĂ záznamu o nahranĂ©m souboru. Ten obsahuje jen jmĂ©no souboru a identifikaci uĹľivatele, kterĂ˝ ho nahrál. K tomuto záznamu se poslĂ©ze pĹ™iĹ™adĂ veškerĂ© transakce, kterĂ© byly tĂmto souborem nahrány. DÄ›je se tak z~dĹŻvodu, Ĺľe by uĹľivatel chtÄ›l danĂ˝ soubor smazat. \subsection{ObohacenĂ}\label{RealizaceObohaceni} -ProtoĹľe data z VREO nelze smysluplnÄ› zpracovat, došlo k obohacenĂ data na základÄ› konstantnĂch symbolĹŻ. Tento prvek sice nemusĂ bĂ˝t pĹ™Ătomen v~transakci, pro operace, jeĹľ má na starosti banka (karetnĂ operace, vĂ˝bÄ›ry z bankomatu,...), jsou však ÄŤasto pĹ™Ătomny. +ProtoĹľe data z VREO nelze smysluplnÄ› zpracovat, došlo k obohacenĂ data na základÄ› konstantnĂch symbolĹŻ. Tento prvek sice nemusĂ bĂ˝t pĹ™Ătomen v~transakci, pro operace, jeĹľ má na starosti banka (karetnĂ operace, vĂ˝bÄ›ry z bankomatu atp.), jsou však ÄŤasto pĹ™Ătomny. PĹ™idánĂ závislostĂ na konstantnĂch symbolech bylo zaloĹľeno na ÄŤĂselnĂku MFÄŚR. V práci pak byl konkrĂ©tnÄ› vyuĹľit jeho souhrn ze serveru Finance.cz\cite{ConstantSymbolList}. ÄŚĂselnĂk byl zároveĹ rozdÄ›len do následujĂcĂch kategoriĂ: \begin{enumerate}[a)] \item Druh \begin{itemize} [--] - \item oznaÄŤenĂ druhu transakce - \item platby za zbožà a sluĹľby, mzdovĂ© náklady,... + \item OznaÄŤenĂ druhu transakce. + \item NapĹ™. platby za zbožà a sluĹľby, mzdovĂ© náklady. \item []\newpage \end{itemize} \item Dle vĂ˝znamu poslednĂ ÄŤĂslice \begin{itemize} [--] - \item oznaÄŤenĂ druhu platby - \item hotovost, dobropisy, pĹ™ednostnĂ platby,.. + \item OznaÄŤenĂ druhu platby. + \item NapĹ™. hotovost, dobropisy, pĹ™ednostnĂ platby. \end{itemize} \item SpravovanĂ© MFÄŚR \begin{itemize} [--] - \item popisujĂ vztahy ke státnĂmu rozpoÄŤtu a rozpoÄŤtĹŻm mĂstnĂch samospráv - \item dotace, danÄ›, cla, pokuty, penále,... + \item PopisujĂ vztahy ke státnĂmu rozpoÄŤtu a rozpoÄŤtĹŻm mĂstnĂch samospráv. + \item NapĹ™. dotace, danÄ›, cla, pokuty, penále. \end{itemize} \item RezervovanĂ© symboly \begin{itemize} [--] - \item symboly rezervovanĂ© pro mezibankovnĂ styk - \item platby kartou, šekem, platby na neexistujĂcà účet,... + \item Symboly rezervovanĂ© pro mezibankovnĂ styk. + \item NapĹ™. platby kartou, šekem, platby na neexistujĂcà účet. \end{itemize} \end{enumerate} Dále existuje ještÄ› i sada zahraniÄŤnĂch konstantnĂch symbolĹŻ. Sada shrnuje rĹŻznĂ© druhy plateb do dvaceti rĹŻznĂ˝ch kategoriĂ. Vzhledem k faktu, Ĺľe se pro práci nepodaĹ™ilo zajistit žádnĂ© vĂ˝pisy z účtu, jeĹľ by obsahovaly zahraniÄŤnĂ platby, tato sada nebyla vyuĹľita. Byla však definována pro pĹ™ĂpadnĂ© pozdÄ›jšà rozšĂĹ™enĂ dat. \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 "\textit{But what is a Neural Network?}"\cite{ANN_Understanding} +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 \uv{\textit{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ĹŻsobena tak, aby vypadala jako vĂ˝stup jinĂ˝ch neuronĹŻ - musĂ bĂ˝t "normalizovaná". +Aby tedy neuronová sĂĹĄ mohla fungovat, potĹ™ebuje nÄ›jaká data, která by aktivovala vstupnĂ neurony. Tato data musĂ bĂ˝t pĹ™izpĹŻsobena tak, aby vypadala jako vĂ˝stup jinĂ˝ch neuronĹŻ - musĂ bĂ˝t \uv{normalizovaná}. -Dále potĹ™ebuje nÄ›jaká data, za pomoci kterĂ˝ch by si mohla nadefinovat, nakolik budou jednotlivĂ© neurony ovlivĹovat ty ostatnĂ. JinĂ˝mi 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Ă. +Dále potĹ™ebuje nÄ›jaká data, za pomoci kterĂ˝ch by si mohla nadefinovat, nakolik budou jednotlivĂ© neurony ovlivĹovat ty ostatnĂ. JinĂ˝mi slovy data, podle kterĂ˝ch se bude sĂĹĄ uÄŤit pĹ™edpovĂ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Ä›ch-to čá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Ä›: \newpage \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 + \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 + \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 + \item Na základÄ› vstupnĂch dat se pokusĂ pĹ™edpovÄ›dÄ›t vĂ˝sledek. \end{enumerate} \end{enumerate} @@ -307,37 +309,55 @@ Samotná neuronová sĂĹĄ je stále velkĂ˝ celek, kterĂ˝ bylo potĹ™eba rozdÄ›lit \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 + \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Ă. + \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 ze vstupnĂ vrstvy nebo 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 a vyhodnocuje je + \item StejnÄ› jako vstupnĂ vrstva je unikátnĂ. + \item PĹ™ijĂmá vstupy z poslednĂ vnitĹ™nĂ vrstvy a 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Ă}\label{predvidani} -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 pĹ™Ăslušnou formu aktivaÄŤnĂ funkce, která snĂžà velikost hodnoty na ÄŤĂslo v intervalu \textless -1;1 \textgreater . Tato funkce bĂ˝vá tĂ©Ĺľ nazĂ˝vána "squashing function", z angl. zmáčknout/slisovat. +\subsubsection{UÄŤenĂ} +Aby sĂĹĄ mÄ›la nÄ›jakou vypovĂdacĂ hodnotu, musĂ se nejdĹ™Ăve nauÄŤit, co má pĹ™edpovĂdat. PrvotnĂ pĹ™edpovÄ›di jsou ÄŤistÄ› náhodnĂ©. DÄ›je se tak proto, Ĺľe pĹ™i inicializaci jsou váhy v jednotlivĂ˝ch neuronech ÄŤistÄ› náhodnĂ©. Je tedy nutnĂ© provĂ©st korekci vah a tĂm sĂĹĄ uÄŤit. Tomuto procesu se Ĺ™Ăká zpÄ›tná propagace (\uv{backpropagation}). Nutnou podmĂnkou pro takovĂ© uÄŤenĂ je pak samozĹ™ejmĂ©, Ĺľe je známĂ˝ korektnĂ vĂ˝stup pro danĂ˝ vstup. + +Korekce probĂhá tak, Ĺľe sĂĹĄ nejdĹ™Ăve vyhodnotĂ nÄ›jakĂ˝ vstup. PotĂ© jĂ je Ĺ™eÄŤeno, jakĂ˝ byl oÄŤekávanĂ˝ vĂ˝sledek. Na základÄ› rozdĂlu oÄŤekávanĂ©ho vĂ˝sledku a skuteÄŤnĂ©ho vĂ˝sledku se vyhodnotĂ chyba pro vĂ˝stup. Ta se následnÄ› musĂ propagovat napĹ™ĂÄŤ celou sĂtĂ. MusĂ se ale takĂ© brát v Ăşvahu, Ĺľe ne kaĹľdĂ˝ neuron pĹ™ispÄ›l stejnou mÄ›rou k vĂ˝slednĂ© chybÄ›. Je nutnĂ© najĂt pĹ™esnou chybu pro kaĹľdĂ˝ z neuronĹŻ. +K tomuto vĂ˝poÄŤtu se dá vyuĹľĂt vzorec: +\begin{figure}[H] + \[ \gamma = error \cdot (1 - output^2) \] +\end{figure} +PĹ™iÄŤemĹľ \textit{error} je chyba neuronu, \textit{output} vĂ˝stup neuronu po prĹŻchodu aktivaÄŤnĂ funkcĂ a $\gamma$ by se dala pochopit jako chyba vstupu souÄŤasnĂ©ho neuronu. Chybu jednotlivĂ˝ch vah lze najĂt vynásobenĂm vstupĹŻ do neuronu (vektorem) a vypoÄŤĂtanĂ©, skalárnĂ, hodnoty $\gamma$, dĂky ÄŤemuĹľ vznikne novĂ˝ vektor. Tento vektor uĹľ potĂ© staÄŤĂ jen pĹ™iÄŤĂst ke korespondujĂcĂ váze, ÄŤĂmĹľ dojde k jejĂ opravÄ›. -Vzhledem k nároÄŤnosti na pochopenĂ vĂ˝roku výše, je pro lepšà ilustraci pĹ™iloĹľen obrázek ÄŤ. \ref{single-neuron}. Na obrázku jsou pomocĂ znakĹŻ X1 - X3 znázornÄ›ny jednotlivĂ© vstupy neuronu (kompletnĂ sada vstupĹŻ vrstvy). Znaky W1 - W3 oznaÄŤujĂ 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. PĂsmeno Y oznaÄŤuje vĂ˝stupnĂ hodnotu neuronu. +Je však stále tĹ™eba zjistit chybu kaĹľdĂ©ho celĂ©ho neuronu ve vnitĹ™nĂ vrstvÄ›, aby bylo moĹľnĂ© vyuĹľĂt výše zmĂnÄ›nĂ˝ vzorec. Ve vĂ˝stupnĂ vrstvÄ› je toho dosaĹľeno, jiĹľ zmĂnÄ›nĂ˝m odeÄŤtenĂm referenÄŤnĂho vĂ˝sledku od pĹ™edpokládanĂ©ho. Pro vnitĹ™nĂ vrstvy tento zpĹŻsob ale pouĹľĂt nelze. Zde toho je dosaĹľeno tak, Ĺľe se v kaĹľdĂ© vrstvÄ› násobĂ vypoÄŤtená hodnota $\gamma$ ~s korespondujĂcĂmi váhami neuronu a vektorovÄ› se tyto hodnoty seÄŤtou. VĂ˝slednĂ˝ vektor se vĹľdy pĹ™edá pĹ™edcházejĂcĂ vrstvÄ› jako seznam chyb kaĹľdĂ©ho z neuronĹŻ. CelĂ˝ proces pĹ™edá-vánĂ vektoru chyb funguje na obdobnĂ©m principu jako pĹ™edchozĂ vyhodnocovánĂ pravdÄ›podobnosti. V tomto pĹ™ĂpadÄ› je ale postup opaÄŤnĂ˝, a vyhodnocuje se postupnÄ› od vĂ˝stupnĂ vrstvy ke vstupnĂ. + +DetailnĂ odvozenĂ vzorce (aÄŤkoli pro odlišnou implementaci neuronovĂ© sĂtÄ›) pĹ™ehlednÄ› vysvÄ›tluje uĹľivatel, vystupujĂcĂ pod pĹ™ezdĂvkou \textit{The One} na svĂ©m videu o tvorbÄ› neuronovĂ˝ch stĂ.\cite{ANN_BackPropagation} + +JednĂm z problĂ©mĹŻ pĹ™i uÄŤenĂ neuronovĂ© sĂtÄ› mohou bĂ˝t takĂ© vstupy samotnĂ©. Pokud se sĂĹĄ bude uÄŤit po samostatnĂ˝ch vstupech a tyto vstupy budou rozdÄ›leny na samostatnĂ© celky, mĹŻĹľe se sĂĹĄ nauÄŤit nejdĹ™Ăve jeden, a~pozdÄ›ji pĹ™euÄŤit na druhĂ˝. + +Pokud se naopak vyuĹľijĂ všechny vstupy najednou, mĹŻĹľe u velkĂ˝ch datasetĹŻ dojĂt ke znaÄŤnĂ˝m problĂ©mĹŻm s mezipamÄ›tĂ. To mĹŻĹľe zpĹŻsobit naÄŤĂtánĂ vstupnĂch dat samotnĂ˝ch, ale mnohem pravdÄ›podobnÄ›ji alokaci prostĹ™edkĹŻ ve~vnitĹ™nĂch strukturách kaĹľdĂ©ho neuronu. KonkrĂ©tnÄ› jde o ukládánĂ, vypoÄŤĂ-tanĂ˝ch korekcĂ jednotlivĂ˝ch vah, v generickĂ© kolekci \textit{List}. Ta se pĹ™i dosaĹľenĂ maxima svĂ©ho objemu automaticky realokuje na násobek souÄŤasnĂ©ho. TĂm vzniknou nÄ›kolikanásobky velikosti pĹŻvodnĂho setu dat. NavĂc se zjistilo, Ĺľe tento pĹ™Ăstup nenĂ ani pĹ™Ăliš efektivnĂ z hlediska uÄŤenĂ.\cite{minibatchVsFullBatch} Pro uÄŤenĂ je tedy vyuĹľit pĹ™Ăstup, kterĂ˝ rozdÄ›luje data do nÄ›kolika, ne nutnÄ› stejnÄ› velkĂ˝ch, ale relativnÄ› malĂ˝ch celkĹŻ (\uv{minibatch}). Tento celek se nejdĹ™Ăve celĂ˝ vyhodnotĂ a váhy jsou upraveny na základÄ› prĹŻmÄ›ru všech korekcĂ v nÄ›m. + +Tento pĹ™Ăstup uspořà paměť, je schopen se lĂ©pe uÄŤit a zároveĹ tĂm lze eliminovat problĂ©m, kdy chodĂ data jednoho druhu a poslĂ©ze jinĂ©ho (nemajĂ uniformnĂ rozdÄ›lenĂ). SĂĹĄ by se totiĹľ pĹ™ipravila jen na jeden druh dat. CoĹľ je zároveĹ problĂ©m, ke kterĂ©mu došlo kvĹŻli porovnávánĂ transakcĂ (detailnÄ› rozebráno v sekci \ref{komparator}). + +\subsubsection{PĹ™edpovĂdánĂ}\label{predvidani} +PĹ™i pĹ™edpovĂ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 pĹ™Ăslušnou formu aktivaÄŤnĂ funkce, která snĂžà velikost hodnoty na ÄŤĂslo v intervalu \textless -1;1 \textgreater . Tato funkce bĂ˝vá tĂ©Ĺľ nazĂ˝vána \uv{squashing function}, z angl. zmáčknout/slisovat. + +Vzhledem k nároÄŤnosti na pochopenĂ vĂ˝roku výše, je pro lepšà ilustraci pĹ™iloĹľen obrázek ÄŤ. \ref{single-neuron}. Na obrázku jsou pomocĂ znakĹŻ X1 - X3 znázornÄ›ny jednotlivĂ© vstupy neuronu (kompletnĂ sada vstupĹŻ vrstvy). Znaky W1 - W3 oznaÄŤujĂ 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. PĂsmeno Y oznaÄŤuje vĂ˝stup-nĂ hodnotu neuronu. \begin{figure}[h] \includegraphics[width=0.75\textwidth]{img/neural-network-single-neuron.png} \centering @@ -359,27 +379,7 @@ PĹ™i bližšĂm pohledu na fungovanĂ algoritmu si lze všimnout, Ĺľe pĹ™i náso \newline kde 'x' znaÄŤĂ vstupy a 'w' váhy. 'S' je vĂ˝sledek pĹ™ed vstupem do aktivaÄŤnĂ funkce. -PrávÄ› z tohoto 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 Math.NET Numerics (dostupnĂ© z \url{https://numerics.mathdotnet.com/}). AktivaÄŤnĂ funkce je pouhá hyperbolická funkce tangens z integrovanĂ© knihovny Math.Tangh() - -\subsubsection{UÄŤenĂ} -Aby sĂĹĄ mÄ›la nÄ›jakou vypovĂdacĂ hodnotu, musĂ se nejdĹ™Ăve nauÄŤit, co má pĹ™edpovĂdat. PrvotnĂ pĹ™edpovÄ›di jsou ÄŤistÄ› náhodnĂ©. DÄ›je se tak proto, Ĺľe pĹ™i inicializaci jsou váhy v jednotlivĂ˝ch neuronech ÄŤistÄ› náhodnĂ©. Je tedy nutnĂ© provĂ©st korekci vah a tĂm sĂĹĄ uÄŤit. Tomuto procesu se Ĺ™Ăká zpÄ›tná propagace ("backpropagation"). Nutnou podmĂnkou pro takovĂ© uÄŤenĂ je pak samozĹ™ejmĂ©, Ĺľe je známĂ˝ korektnĂ vĂ˝stup pro danĂ˝ vstup. - -Korekce probĂhá tak, Ĺľe sĂĹĄ nejdĹ™Ăve vyhodnotĂ nÄ›jakĂ˝ vstup. PotĂ© jĂ je Ĺ™eÄŤeno, jakĂ˝ byl oÄŤekávanĂ˝ vĂ˝sledek. Na základÄ› rozdĂlu oÄŤekávanĂ©ho vĂ˝sledku a skuteÄŤnĂ©ho vĂ˝sledku se vyhodnotĂ chyba pro vĂ˝stup. Ta se následnÄ› musĂ propagovat napĹ™ĂÄŤ celou sĂtĂ. MusĂ se ale takĂ© brát v Ăşvahu, Ĺľe ne kaĹľdĂ˝ neuron pĹ™ispÄ›l stejnou mÄ›rou k vĂ˝slednĂ© chybÄ›. Je nutnĂ© najĂt pĹ™esnou chybu pro kaĹľdĂ˝ z neuronĹŻ. -K tomuto vĂ˝poÄŤtu se dá vyuĹľĂt vzorec: -\begin{figure}[H] - \[ \gamma = error \cdot (1 - output^2) \] -\end{figure} -PĹ™iÄŤemĹľ \textit{error} je chyba neuronu, \textit{output} vĂ˝stup neuronu po prĹŻchodu aktivaÄŤnĂ funkcĂ a \textit{\textgamma} by se dala pochopit jako chyba vstupu souÄŤasnĂ©ho neuronu. Chybu jednotlivĂ˝ch vah lze najĂt vynásobenĂm vstupĹŻ do neuronu (vektorem) a vypoÄŤĂtanĂ©, skalárnĂ, hodnoty \textgamma, dĂky ÄŤemuĹľ vznikne novĂ˝ vektor. Tento vektor uĹľ potĂ© staÄŤĂ jen pĹ™iÄŤĂst ke korespondujĂcĂ váze, ÄŤĂmĹľ dojde k jejĂ opravÄ›. - -Je však stále tĹ™eba zjistit chybu kaĹľdĂ©ho celĂ©ho neuronu ve vnitĹ™nĂ vrstvÄ›, aby bylo moĹľnĂ© vyuĹľĂt výše zmĂnÄ›nĂ˝ vzorec. Ve vĂ˝stupnĂ vrstvÄ› je toho dosaĹľeno, jiĹľ zmĂnÄ›nĂ˝m odeÄŤtenĂm referenÄŤnĂho vĂ˝sledku od pĹ™edpokládanĂ©ho. Pro vnitĹ™nĂ vrstvy tento zpĹŻsob ale pouĹľĂt nelze. Zde toho je dosaĹľeno tak, Ĺľe se v kaĹľdĂ© vrstvÄ› násobĂ vypoÄŤtená hodnota \textgamma ~s korespondujĂcĂmi váhami neuronu a vektorovÄ› se tyto hodnoty seÄŤtou. VĂ˝slednĂ˝ vektor se vĹľdy pĹ™edá pĹ™edcházejĂcĂ vrstvÄ› jako seznam chyb kaĹľdĂ©ho z neuronĹŻ. CelĂ˝ proces pĹ™edá-vánĂ vektoru chyb funguje na obdobnĂ©m principu jako pĹ™edchozĂ vyhodnocovánĂ pravdÄ›podobnosti. V tomto pĹ™ĂpadÄ› je ale postup opaÄŤnĂ˝, a vyhodnocuje se postupnÄ› od vĂ˝stupnĂ vrstvy ke vstupnĂ. - -DetailnĂ odvozenĂ vzorce (aÄŤkoli pro odlišnou implementaci neuronovĂ© sĂtÄ›) pĹ™ehlednÄ› vysvÄ›tluje uĹľivatel, vystupujĂcĂ pod pĹ™ezdĂvkou \textit{The One} na svĂ©m videu o tvorbÄ› neuronovĂ˝ch stĂ.\cite{ANN_BackPropagation} - -JednĂm z problĂ©mĹŻ pĹ™i uÄŤenĂ neuronovĂ© sĂtÄ› mohou bĂ˝t takĂ© vstupy samotnĂ©. Pokud se sĂĹĄ bude uÄŤit po samostatnĂ˝ch vstupech a tyto vstupy budou rozdÄ›leny na samostatnĂ© celky, mĹŻĹľe se sĂĹĄ nauÄŤit nejdĹ™Ăve jeden, a~pozdÄ›ji pĹ™euÄŤit na druhĂ˝. - -Pokud se naopak vyuĹľijĂ všechny vstupy najednou, mĹŻĹľe u velkĂ˝ch datasetĹŻ dojĂt ke znaÄŤnĂ˝m problĂ©mĹŻm s mezipamÄ›tĂ. To mĹŻĹľe zpĹŻsobit naÄŤĂtánĂ vstupnĂch dat samotnĂ˝ch, ale mnohem pravdÄ›podobnÄ›ji alokaci prostĹ™edkĹŻ ve~vnitĹ™nĂch strukturách kaĹľdĂ©ho neuronu. KonkrĂ©tnÄ› jde o ukládánĂ, vypoÄŤĂ-tanĂ˝ch korekcĂ jednotlivĂ˝ch vah, v generickĂ© kolekci \textit{List}. Ta se pĹ™i dosaĹľenĂ maxima svĂ©ho objemu automaticky realokuje na násobek souÄŤasnĂ©ho. TĂm vzniknou nÄ›kolikanásobky velikosti pĹŻvodnĂho setu dat. NavĂc se zjistilo, Ĺľe tento pĹ™Ăstup nenĂ ani pĹ™Ăliš efektivnĂ z hlediska uÄŤenĂ.\cite{minibatchVsFullBatch} Pro uÄŤenĂ je tedy vyuĹľit pĹ™Ăstup, kterĂ˝ rozdÄ›luje data do nÄ›kolika, ne nutnÄ› stejnÄ› velkĂ˝ch, ale relativnÄ› malĂ˝ch celkĹŻ ("minibatch"). Tento celek se nejdĹ™Ăve celĂ˝ vyhodnotĂ a váhy jsou upraveny na základÄ› prĹŻmÄ›ru všech korekcĂ v nÄ›m. - -Tento pĹ™Ăstup uspořà paměť, je schopen se lĂ©pe uÄŤit a zároveĹ tĂm lze eliminovat problĂ©m, kdy chodĂ data jednoho druhu a poslĂ©ze jinĂ©ho (nemajĂ uniformnĂ rozdÄ›lenĂ). SĂĹĄ by se totiĹľ pĹ™ipravila jen na jeden druh dat. CoĹľ je zároveĹ problĂ©m, ke kterĂ©mu došlo kvĹŻli porovnávánĂ transakcĂ (detailnÄ› rozebráno v sekci \ref{komparator}). +PrávÄ› z tohoto 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 Math.NET Numerics (dostupnĂ© z \url{https://numerics.mathdotnet.com/}). AktivaÄŤnĂ funkcĂ je hyperbolickĂ˝ tangens z integrovanĂ© knihovny Math.Tangh() \subsection{Export, import sĂtÄ›}\label{ANNexportImport} Aby bylo moĹľnĂ© vyuĹľĂt uĹľ jednou natrĂ©novanou sĂĹĄ, je nutnĂ© si ji nÄ›jakĂ˝m zpĹŻsobem zapamatovat. Pro sĂĹĄ jsou dĹŻleĹľitĂ© pouze dvÄ› vÄ›ci a totiĹľ váhy neuronĹŻ spoleÄŤnÄ› s tvarem sĂtÄ›. Tvarem sĂtÄ› se rozumĂ mnoĹľstvĂ vrstev a poÄŤet neuronĹŻ v nich obsaĹľenĂ˝ch. @@ -387,12 +387,12 @@ Aby bylo moĹľnĂ© vyuĹľĂt uĹľ jednou natrĂ©novanou sĂĹĄ, je nutnĂ© si ji nÄ›jak Pro Ĺ™ešenĂ uloĹľenĂ sĂtÄ› si ji lze pĹ™edstavit jako 3D objekt. PrvnĂm rozmÄ›rem jsou vrstvy, druhĂ˝m poÄŤet neuronĹŻ v kaĹľdĂ© vrstvÄ›, a tĹ™etĂ jsou váhy v kaĹľdĂ©m neuronu. StejnĂ˝m zpĹŻsobem se proto ukládajĂ, resp. naÄŤĂtajĂ do/z databáze. \subsection{TestovánĂ funkÄŤnosti neuronovĂ© sĂtÄ›} -Pro zjištÄ›nĂ funkÄŤnosti sĂtÄ› musely bĂ˝t vytvoĹ™eny nÄ›jakĂ© dva primitivnĂ problĂ©-my, na základÄ› kterĂ˝ch by se dalo ověřit, Ĺľe opravdu funguje. Bylo tedy zvoleno pĹ™edvĂdánĂ sudĂ˝ch a lichĂ˝ch ÄŤĂsel, spoleÄŤnÄ› s testovánĂm operátoru XOR pro dvÄ› ÄŤĂsla. +Pro zjištÄ›nĂ funkÄŤnosti sĂtÄ› byly urÄŤeny nÄ›jakĂ© dva primitivnĂ problĂ©my, kterĂ© majĂ ověřit, Ĺľe sĂĹĄ opravdu funguje. PrvnĂm problĂ©mem/testem bylo pĹ™edpovĂdánĂ sudĂ˝ch a lichĂ˝ch ÄŤĂsel, druhĂ˝m testovánĂ operátoru XOR pro dvÄ› ÄŤĂsla. Dále bylo tĹ™eba zjistit, zda pĹ™i exportu sĂtÄ› a následnĂ©m importu nedojde k porušenĂ struktury sĂtÄ›, a bude fungovat i nadále. \subsubsection{Sudá a lichá ÄŤĂsla} -PrvnĂm bylo rozhodovánĂ se, jestli je ÄŤĂslo mezi nulou a sedmi sudĂ© nebo lichĂ©. ÄŚĂsla 0-7 byla zvolena, protoĹľe je lze v binárnĂ soustavÄ› zapsat pomocĂ třà cifer. JedinĂ˝ rozdĂl byl, Ĺľe se ÄŤĂslo 0 zapisovalo jako -1. To je z dĹŻvodu, Ĺľe nula nenĂ neutrálnĂ ÄŤĂslo pro násobenĂ, a tĂm pádem by nedocházelo ke správnĂ©mu vyhodnocovánĂ vah. VyuĹľitĂ ÄŤĂsel -1 a 1 bylo doporuÄŤeno i na konferenci Microsoftu \textit{Build 2013 - Developing Neural Networks using Visual Studio}\cite{MicrosoftBuild2013}. PĹ™i testovánĂ se podaĹ™ilo sĂti pĹ™edpovÄ›dÄ›t, jestli je ÄŤĂslo sudĂ© ÄŤi lichĂ© na 100\% (viz. obr. ÄŤ. \ref{OddEvenTest}). SĂĹĄ byla ve formÄ› 3 - 3 - 3 - 1 s 1000 vstupy a minibatchem o~velikosti 100. Vzhledem k jednoduchosti testu (vĂ˝sledek závisĂ jen a pouze na~jednom vstupu - ostatnĂ jsou nepodstatnĂ©), zmÄ›ny na tvaru sĂtÄ› nemÄ›ly žádnĂ˝ vÄ›tšà vliv. +PrvnĂm bylo rozhodovánĂ se, jestli je ÄŤĂslo mezi nulou a sedmi sudĂ© nebo lichĂ©. ÄŚĂsla 0-7 byla zvolena, protoĹľe je lze v binárnĂ soustavÄ› zapsat pomocĂ třà cifer. JedinĂ˝ rozdĂl byl, Ĺľe se ÄŤĂslice 0 zapisovala jako -1. To je z dĹŻvodu, Ĺľe nula zpĹŻsobĂ vynulovánĂ, a tĂm pádem by nedocházelo ke správnĂ©mu vyhodnocovánĂ vah. VyuĹľitĂ ÄŤĂslic -1 a 1 bylo doporuÄŤeno i na konferenci Microsoftu \textit{Build 2013 - Developing Neural Networks using Visual Studio}\cite{MicrosoftBuild2013}. PĹ™i testovánĂ se podaĹ™ilo sĂti pĹ™edpovÄ›dÄ›t, jestli je ÄŤĂslo sudĂ© ÄŤi lichĂ© na 100\% (viz. obr. ÄŤ. \ref{OddEvenTest}). SĂĹĄ byla ve formÄ› 3 - 3 - 3 - 1 s velikostĂ trĂ©novacĂ mnoĹľiny 1000 a~minibatchem o~velikosti 100. Vzhledem k jednoduchosti testu (vĂ˝sledek závisĂ jen a pouze na~jednom vstupu - ostatnĂ jsou nepodstatnĂ©), zmÄ›ny na tvaru sĂtÄ› nemÄ›ly žádnĂ˝ vÄ›tšà vliv. \begin{figure}[h] \includegraphics[width=0.75\textwidth]{img/Odd_Even_Test_Evaluation.png} \centering @@ -402,7 +402,7 @@ PrvnĂm bylo rozhodovánĂ se, jestli je ÄŤĂslo mezi nulou a sedmi sudĂ© nebo l \subsubsection{XOR} DruhĂ˝m problĂ©mem byl operátor XOR. Tento operátor oznaÄŤuje mnoĹľinovou operaci která je pravdou pouze pokud jedno z ÄŤĂsel má nulovou, resp. zápornou (-1), hodnotu a druhĂ© kladnou (1). Jak uĹľ bylo naznaÄŤeno, pro test byla nulová hodnota nahrazena zápornou ze stejnĂ˝ch dĹŻvodĹŻ, jako v pĹ™edchozĂm testu. -PrvnĂ test probĂhal na sĂti ve tvaru 2 - 3 - 3 - 1 s 1000 vstupy a minibatchem o velikosti 100. Zde prvnĂ ÄŤĂslo (2) znaÄŤĂ vstupy a poslednĂ (1) znaÄŤĂ vĂ˝stupy. VĂ˝sledek testovánĂ dosáhl Ăşspěšnosti 67.1\% (viz. obr. ÄŤ. \ref{XORTest}). +PrvnĂ test probĂhal na sĂti ve tvaru 2 - 3 - 3 - 1 (vstupem jsou dvÄ› ÄŤĂsla) s velikostĂ trĂ©novacĂ mnoĹľiny 1000 a~minibatchem o velikosti 100. Zde prvnĂ ÄŤĂslo (2) znaÄŤĂ vstupy a poslednĂ (1) znaÄŤĂ vĂ˝stupy. VĂ˝sledek testovánĂ dosáhl Ăşspěšnosti 67.1\% (viz. obr. ÄŤ. \ref{XORTest}). \begin{figure}[h] \includegraphics[width=0.7\textwidth]{img/XOR_Test_Evaluation.png} \centering @@ -410,7 +410,7 @@ PrvnĂ test probĂhal na sĂti ve tvaru 2 - 3 - 3 - 1 s 1000 vstupy a minibatche \label{XORTest} \end{figure} -Bylo by moĹľnĂ© tedy uvaĹľovat, Ĺľe tĂ©měř 3/4 vstupu byly odhadnuty správnÄ›, vĂ˝sledek je proto lepšà neĹľ ÄŤistĂ˝ odhad, a lze jej povaĹľovat za dostateÄŤnĂ˝. ProblĂ©m ale je, Ĺľe sĂti byly poskytnuty veškerĂ© moĹľnĂ© vstupy a tudĂĹľ musĂ pĹ™edpovÄ›dÄ›t 100\%.\cite{XORProblem} ĹešenĂm tedy je pĹ™idat vÄ›tšà mnoĹľstvĂ neuronĹŻ a dat pro uÄŤenĂ. Byl proto zvolen tvar 2-3-4-2-1 s 10 000 vstupy a minibatchem opÄ›t o velikosti 100. Tentokrát bylo dosaĹľeno lepšĂho vĂ˝sledku (obr. ÄŤ. \ref{XORTestSuccess}). +Bylo by moĹľnĂ© tedy uvaĹľovat, Ĺľe tĂ©měř 3/4 vstupu byly odhadnuty správnÄ›, vĂ˝sledek je proto lepšà neĹľ ÄŤistĂ˝ odhad, a lze jej povaĹľovat za dostateÄŤnĂ˝. ProblĂ©m ale je, Ĺľe sĂti byly poskytnuty veškerĂ© moĹľnĂ© vstupy a tudĂĹľ musĂ pĹ™edpovÄ›dÄ›t 100\%.\cite{XORProblem} ĹešenĂm tedy je pĹ™idat vÄ›tšà mnoĹľstvĂ neuronĹŻ a dat pro uÄŤenĂ. Byl proto zvolen tvar 2-3-4-2-1 s velikostĂ trĂ©novacĂ mnoĹľiny 10 000 a minibatchem opÄ›t o velikosti 100. Tentokrát bylo dosaĹľeno lepšĂho vĂ˝sledku (obr. ÄŤ. \ref{XORTestSuccess}). \begin{figure}[h] \includegraphics[width=0.75\textwidth]{img/XOR_Test_EvaluationSuccess.png} \centering @@ -421,7 +421,7 @@ Bylo by moĹľnĂ© tedy uvaĹľovat, Ĺľe tĂ©měř 3/4 vstupu byly odhadnuty správnÄ› ZároveĹ na zmĂnÄ›nĂ©m testu lze i vidÄ›t, Ĺľe tvar a velikost sĂtÄ› majĂ vliv na~jejĂ vĂ˝stup. \subsubsection{Export, Import} -Export a import sĂtÄ› lze ověřit snad jen jedinĂ˝m zpĹŻsobem. A totiĹľ exportovánĂm jiĹľ natrĂ©novanĂ© sĂtÄ› a jejĂm následnĂ˝m naimportovánĂm zpÄ›t. Pokud došlo ke korektnĂmu importu, sĂĹĄ bude nadále správnÄ› pĹ™edvĂdat testovaná data. +Export a import sĂtÄ› lze ověřit snad jen jedinĂ˝m zpĹŻsobem. A totiĹľ exportovánĂm jiĹľ natrĂ©novanĂ© sĂtÄ› a jejĂm následnĂ˝m naimportovánĂm zpÄ›t. Pokud došlo ke korektnĂmu importu, sĂĹĄ bude nadále správnÄ› pĹ™edpovĂdat testovaná data. Bylo tedy implementováno simulovanĂ© exportovánĂ a importovánĂ sĂtÄ› a~ověřeno, jestli se pĹ™edpovÄ›di nezmÄ›nily. VĂ˝sledek opÄ›t dosáhl 100\%, proto lze pĹ™edpokládat, Ĺľe funkÄŤnost je bezchybná (viz obr. ÄŤ. \ref{ImportExportTest}). \begin{figure}[h] \includegraphics[width=0.75\textwidth]{img/test_export_import.png} @@ -448,7 +448,7 @@ Pokud tedy budou uvaĹľovány transakce ze dvou rĹŻznĂ˝ch tĂ˝dnĹŻ, mÄ›la by se op Pro pĹ™iĹ™azovánĂ do párĹŻ se transakce procházejĂ v cyklu, a ke kaĹľdĂ© transakci se vybere ta, která je ji hodnotou nejblĂĹľe. V kaĹľdĂ©m prĹŻchodu cyklu se pro kaĹľdou transakci z menšà mnoĹľiny hledá transakce z mnoĹľiny vÄ›tšà taková, Ĺľe rozdĂl v jejich částce je nejmenšà (tzv. vzdálenost musĂ bĂ˝t nejkratšĂ). PĹ™i hledánĂ tÄ›chto dvojic mĹŻĹľe dojĂt k duplicitnĂmu propojenĂ (dvÄ› a vĂce transakcĂ z jednĂ© mnoĹľiny, povaĹľujĂ jednu transakci z druhĂ© mnoĹľiny za nejbližšĂ). V tom pĹ™ĂpadÄ› se vezmou dvÄ› nejkratšà vzdálenosti z tohoto vztahu. CelĂ˝ cyklus se opakuje, dokud nejsou pĹ™iĹ™azeny všechny transakce z menšà mnoĹľiny k~mnoĹľinÄ› vÄ›tšĂ. \subsubsection{PorovnávánĂ vzdálenosti} -S touto implementacĂ však vyvstává jeden problĂ©m. Toto "optimistickĂ©" pĹ™i-Ĺ™azovánĂ transakcĂ ve skuteÄŤnosti Ĺ™Ăká, Ĺľe tĂ˝den s menšà aktivitou je pod-mnoĹľinou tĂ˝dne s aktivitou vÄ›tšĂ. JinĂ˝mi slovy - všechny platby jednoho z~tĂ˝dnĹŻ jsou bezezbytku obsaĹľeny v druhĂ©m. To zcela jistÄ› nenĂ správnÄ›. OpakujĂcĂ se transakce jsou spĂše prĹŻnikem tÄ›chto dvou tĂ˝dnĹŻ (ne všechny se opakujĂ). Je tedy opÄ›t tĹ™eba se zamyslet, jakĂ˝m zpĹŻsobem toto vyĹ™ešit. +S touto implementacĂ však vyvstává jeden problĂ©m. Toto \uv{optimistickĂ©} pĹ™i-Ĺ™azovánĂ transakcĂ ve skuteÄŤnosti Ĺ™Ăká, Ĺľe tĂ˝den s menšà aktivitou je pod-mnoĹľinou tĂ˝dne s aktivitou vÄ›tšĂ. JinĂ˝mi slovy - všechny platby jednoho z~tĂ˝dnĹŻ jsou bezezbytku obsaĹľeny v druhĂ©m. To zcela jistÄ› nenĂ správnÄ›. OpakujĂcĂ se transakce jsou spĂše prĹŻnikem tÄ›chto dvou tĂ˝dnĹŻ (ne všechny se opakujĂ). Je tedy opÄ›t tĹ™eba se zamyslet, jakĂ˝m zpĹŻsobem toto vyĹ™ešit. PrvnĂ moĹľnostĂ by bylo omezit poÄŤet opakovánĂ v cyklu, kdy se párujĂ transakce. AĹĄ uĹľ Ĺ™Ăci, Ĺľe se cyklus nesmĂ procházet napĹ™. vĂce neĹľ tĹ™ikrát anebo musĂ zĹŻstat alespoĹ pÄ›t nerozhodnutĂ˝ch transakcĂ. PĹ™i vyuĹľitĂ tÄ›chto pĹ™ĂstupĹŻ ale nenà žádná kontrola nad samotnĂ˝mi transakcemi. Mohou zbĂ˝t transakce, kterĂ© si jsou částkou blĂzkĂ© - to nastává tĹ™eba v pĹ™ĂpadÄ›, Ĺľe dotyÄŤnĂ˝ ÄŤlovÄ›k jednoduše nenakupoval nic navĂc a částky jsou si opravdu podmnoĹľinou. Tak je moĹľnĂ©, Ĺľe mezi jednotlivĂ˝mi tĂ˝dny nebyl finanÄŤnÄ› pĹ™Ăliš aktivnĂ a plateb je málo - všechny by se mohly vyfiltrovat jako neopakujĂcĂ se. To tedy nepoukazuje na dobrĂ© Ĺ™ešenĂ. @@ -459,7 +459,7 @@ Za Ĺ™ešenĂ lze povaĹľovat pohled z hlediska pomÄ›rĹŻ. Pokud se zĹŻstane u~pĹ™e Za povšimnutĂ však ještÄ› stojĂ, Ĺľe je tĹ™eba poměřovat vĹľdy částku vÄ›tšà vĹŻÄŤi menšĂ, pĹ™ĂpadnÄ› naopak. Je však nutnĂ© dodrĹľovat poĹ™adĂ velikostĂ. Po samotnĂ©m pĹ™iĹ™azenĂ párĹŻ navĂc nenĂ garantováno, která z částek je vÄ›tšĂ. Mohlo by tedy dojĂt k tomu, Ĺľe by se porovnávala ÄŤĂsla normalizovaná do velikosti menšà neĹľ jedna, s ÄŤĂsly vÄ›tšĂmi neĹľ jedna. TakovĂ© porovnávánĂ by dávalo zcela nesmyslnĂ© vĂ˝sledky. \subsection{TestovánĂ komparátoru} -AÄŤkoli komparátor je pomÄ›rnÄ› sloĹľitĂ˝, jeho vĂ˝stup uĹľ tak sloĹľitĂ˝ nenĂ. Vše lze porovnat pouhĂ˝m okem z vĂ˝pisu. PĹ™Ăklad vygenerovanĂ©ho vĂ˝pisu, s daty z poskytnutĂ© transakÄŤnĂ historie, je na obr. ÄŤ. \ref{ComparatorTest}. +AÄŤkoli komparátor je pomÄ›rnÄ› sloĹľitĂ˝, jeho vĂ˝stup uĹľ tak sloĹľitĂ˝ nenĂ. Vše lze snadno porovnat z vĂ˝pisu. PĹ™Ăklad vygenerovanĂ©ho vĂ˝pisu, s daty z poskytnutĂ© transakÄŤnĂ historie, je na obr. ÄŤ. \ref{ComparatorTest}. \begin{figure}[h] \includegraphics[width=0.75\textwidth]{img/ComparatorTest.png} \centering @@ -467,14 +467,14 @@ AÄŤkoli komparátor je pomÄ›rnÄ› sloĹľitĂ˝, jeho vĂ˝stup uĹľ tak sloĹľitĂ˝ nenĂ \label{ComparatorTest} \end{figure} -Lze zde pozorovat, jak se jednotlivĂ© částky na sebe namapovaly (oznaÄŤeno šipkou) a jak jsou od sebe vzdáleny (v závorce). Transakce, kterĂ© se nepodaĹ™ilo pĹ™iĹ™adit, jsou vypsány v části "Major". Ty jsou tedy oznaÄŤeny za neopakujĂcĂ se. +Lze zde pozorovat, jak se jednotlivĂ© částky na sebe namapovaly (oznaÄŤeno šipkou) a jak jsou od sebe vzdáleny (v závorce). Transakce, kterĂ© se nepodaĹ™ilo pĹ™iĹ™adit, jsou vypsány v části \uv{Major}. Ty jsou tedy oznaÄŤeny za neopakujĂcĂ se. \subsection{Datafeeder} -Část, v práci pojmenovaná jako Datafeeder, vycházĂ z anglickĂ˝ch slov \textit{"data"} a \textit{"feeder"} -- v doslovnĂ©m pĹ™ekladu "data-krmĂtko". Tato funkcionalita sloužà pro naÄŤĂtánĂ dat do neuronovĂ© sĂtÄ›. Je takĂ© pomÄ›rnÄ› jednoduchá. Jako vstupnĂ parametry dostane uĹľivatele, jehoĹľ data má naÄŤĂtat, a poÄŤet "\textit{epoch}", kterĂ© má projĂt. Epochou se rozumĂ urÄŤitĂ© ÄŤasovĂ© obdobĂ. Z výše zmĂnÄ›nĂ˝ch dĹŻvodĹŻ byla pro účely tĂ©to práce jedna epocha definována jako tĂ˝den. +Část, v práci pojmenovaná jako Datafeeder, vycházĂ z anglickĂ˝ch slov \textit{\uv{data}} a \textit{\uv{feeder}} -- v doslovnĂ©m pĹ™ekladu \uv{data-krmĂtko}. Tato funkcionalita sloužà pro naÄŤĂtánĂ dat do neuronovĂ© sĂtÄ›. Je takĂ© pomÄ›rnÄ› jednoduchá. Jako vstupnĂ parametry dostane uĹľivatele, jehoĹľ data má naÄŤĂtat, a poÄŤet \uv{\textit{epoch}}, kterĂ© má projĂt. Epochou se rozumĂ urÄŤitĂ© ÄŤasovĂ© obdobĂ. Z výše zmĂnÄ›nĂ˝ch dĹŻvodĹŻ byla pro účely tĂ©to práce jedna epocha definována jako tĂ˝den. Po naÄŤtenĂ vstupnĂch parametrĹŻ, se vytvořà dotaz do databáze, kterĂ˝ naÄŤte dvÄ› epochy a pomocĂ komparátoru doplnĂ oznaÄŤenĂ o opakujĂcĂch se transakcĂch (viz. sekce \ref{komparator} Komparátor). Dále data normalizuje a pĹ™edá neuronovĂ© sĂti, jeĹľ tyto transakce postupnÄ› po jednĂ© zpracuje. \subsection{Normalizace dat}\label{normalization} -Pro vyhodnocovánĂ neuronovou sĂtĂ je dĹŻleĹľitĂ© mĂt data v rozmezĂ nÄ›jakĂ©ho konstantnĂho intervalu. Zde byl konkrĂ©tnÄ› zvolen ve velikosti \textless -1,1\textgreater . Interval je definován z toho dĹŻvodu, Ĺľe pokud by došlo k jeho pĹ™ekroÄŤenĂ nÄ›kterĂ˝mi ze vstupnĂch dat, mohlo by to zpĹŻsobit "pĹ™ebĂjenĂ"~ostatnĂch vah v neuronu. JinĂ˝mi slovy, výše aktivace neuronu by závisela na nÄ›kolika vstupnĂch datech a ostatnĂ by se ignorovala. +Pro vyhodnocovánĂ neuronovou sĂtĂ je dĹŻleĹľitĂ© mĂt data v rozmezĂ nÄ›jakĂ©ho konstantnĂho intervalu. Zde byl konkrĂ©tnÄ› zvolen ve velikosti \textless -1,1\textgreater . Interval je definován z toho dĹŻvodu, Ĺľe pokud by došlo k jeho pĹ™ekroÄŤenĂ nÄ›kterĂ˝mi ze vstupnĂch dat, mohlo by to zpĹŻsobit \uv{pĹ™ebĂjenĂ}~ostatnĂch vah v neuronu. JinĂ˝mi slovy, výše aktivace neuronu by závisela na nÄ›kolika vstupnĂch datech a ostatnĂ by se ignorovala. PrvnĂ poloĹľkou, která se normalizuje, je datum transakce. Datum samo o~sobÄ› nenĂ pĹ™Ăliš vypovĂdajĂcĂ, proto by se tato akce dala povaĹľovat i za lehkĂ© obohacenĂ dat. Pro normalizaci je totiĹľ vyuĹľito skuteÄŤnosti, Ĺľe tĂ˝den se dÄ›lĂ do sedmi dnĹŻ (pondÄ›lĂ -- pátek). Z data transakce se tedy zjistĂ, v kterĂ˝ den v~tĂ˝dnu transakce probÄ›hla, a zároveĹ se vytvořà sedm neuronĹŻ. KaĹľdĂ˝ z~nich bude mĂt hodnotu 1 nebo -1 (krajnĂ body intervalu) podle toho, kterĂ˝ den transakce probÄ›hla. @@ -488,20 +488,20 @@ Dalšà poloĹľkou jsou KonstantnĂ symboly. KonstantnĂ symbol je, obdobnÄ› jako PoslednĂ poloĹľka k normalizaci je výška transakce. Správnou hodnotu nenĂ lehkĂ© urÄŤit. NenĂ totiĹľ moĹľnĂ© urÄŤit maximálnĂ velikost transakce. Ăšvaha pro normalizace byla tedy zaloĹľena na základÄ› výše škody, dle trestnĂho práva. Z~hlediska trestnĂho práva jsou částky rozdÄ›leny následovnÄ›: \begin{enumerate}[1)] - \item Ĺ koda nikoli nepatrná – nejmĂ©nÄ› 5 000 KÄŤ - \item Ĺ koda nikoli malá – nejmĂ©nÄ› 25 000 KÄŤ - \item VÄ›tšà škoda – nejmĂ©nÄ› 50 000 KÄŤ - \item ZnaÄŤná škoda – nejmĂ©nÄ› 500 000 KÄŤ - \item Ĺ koda velkĂ©ho rozsahu – nejmĂ©nÄ› 5 000 000 KÄŤ\cite{velikostSkody} + \item Ĺ koda nikoli nepatrná – nejmĂ©nÄ› 5 000 KÄŤ, + \item Ĺ koda nikoli malá – nejmĂ©nÄ› 25 000 KÄŤ, + \item VÄ›tšà škoda – nejmĂ©nÄ› 50 000 KÄŤ, + \item ZnaÄŤná škoda – nejmĂ©nÄ› 500 000 KÄŤ, + \item Ĺ koda velkĂ©ho rozsahu – nejmĂ©nÄ› 5 000 000 KÄŤ.\cite{velikostSkody} \end{enumerate} K rozdÄ›lenĂ byla pĹ™idána ještÄ› jedna částka 500 KÄŤ. Ta vycházĂ z limitu pro bezkontaktnĂ platby kartou, kdy nenĂ tĹ™eba zadávat kĂłd PIN.\cite{wirelessLimit}. TĂmto principem zároveĹ došlo k rozdÄ›lenĂ pĹ™esnÄ› na šest druhĹŻ transakcĂ. ÄŚĂslo šest je sudĂ©, a vzhledem k tomu, Ĺľe je částky potĹ™eba normalizovat do intervalu \textless -1,1\textgreater , pĹ™Ămo se vybĂzĂ rozdÄ›lit tyto kategorie na dvÄ› části. KonkrĂ©tnÄ› 0~--~25~000~KÄŤ v intervalu \textless -1;0), a vše od 25~000~KÄŤ výše v~intervalu (0;1\textgreater . -Částky jsou však stále vysokĂ©. Aby je bylo moĹľnĂ© vyuĹľĂt, bylo tĹ™eba vytvoĹ™it nÄ›jakou funkci, která by je rozprostĹ™ela do jednotlivĂ˝ch ĂşsekovĂ˝ch intervalĹŻ. K tomu se vĂ˝bornÄ› hodĂ obdoba aktivaÄŤnĂ funkce (squashing function) ze sekce \ref{predvidani} PĹ™edvĂdánĂ. Ta částku sniĹľuje na~velikost v intervalu (0,1). +Částky jsou však stále vysokĂ©. Aby je bylo moĹľnĂ© vyuĹľĂt, bylo tĹ™eba vytvoĹ™it nÄ›jakou funkci, která by je rozprostĹ™ela do jednotlivĂ˝ch ĂşsekovĂ˝ch intervalĹŻ. K tomu se vĂ˝bornÄ› hodĂ obdoba aktivaÄŤnĂ funkce (squashing function) ze sekce \ref{predvidani} PĹ™edpovĂdánĂ. Ta částku sniĹľuje na~velikost v intervalu (0,1). -Aby byly částky rozdÄ›leny do zmĂnÄ›nĂ˝ch šesti kategoriĂ, staÄŤĂ funkci rozdÄ›lit na šestiny, s aktivaÄŤnĂ funkcĂ pĹ™izpĹŻsobenou jednotlivĂ˝m částkám. Pro aktivaÄŤnĂ funkci byl zvolen tanh a částky roztaĹľeny na celĂ˝ interval pomocĂ "magickĂ˝ch konstant"~následovnÄ›: +Aby byly částky rozdÄ›leny do zmĂnÄ›nĂ˝ch šesti kategoriĂ, staÄŤĂ funkci rozdÄ›lit na šestiny, s aktivaÄŤnĂ funkcĂ pĹ™izpĹŻsobenou jednotlivĂ˝m částkám. Pro aktivaÄŤnĂ funkci byl zvolen tanh a částky roztaĹľeny na celĂ˝ interval pomocĂ \uv{magickĂ˝ch konstant}. Tyto konstanty byly voleny tak, Ĺľe se pro kaĹľdĂ˝ Ăşsek postupnÄ› zkoušela náhodná ÄŤĂsla tak, aby poslednĂ ÄŤĂslo intervalu bylo co nejblĂĹľe začátku intervalu navazujĂcĂho. VĂ˝sledkem mÄ›la bĂ˝t co moĹľná nejvĂce souvislá funkce. VĂ˝poÄŤet pro jednotlivĂ© Ăşseky vznikl následujĂcĂ: \begin{enumerate}[1)] \item 0 -- 500 KÄŤ \begin{enumerate}[] @@ -540,26 +540,26 @@ DetailnĂ rozloĹľenĂ lze tĂ©Ĺľ pozorovat na obr. ÄŤ. \ref{ExpenseNormalization} \label{ExpenseNormalization} \end{figure} -\section{PĹ™edvĂdánĂ bez umÄ›lĂ© inteligence} +\section{PĹ™edpovĂdánĂ bez umÄ›lĂ© inteligence} JednotlivĂ© pĹ™edpovÄ›di byly ještÄ› rozšĂĹ™eny o pĹ™edpovÄ›di bez strojovĂ©ho uÄŤenĂ. Ty procházĂ data a pokoušà se z nich zĂskat dalšà závislosti. -\subsection{PĹ™edvĂdánĂ na základÄ› velikostĂ transakce} +\subsection{PĹ™edpovĂdánĂ na základÄ› velikostĂ transakce} Pro tuto pĹ™edpověď bylo vyuĹľito komparátoru ze sekce \ref{komparator}. NaÄŤtou se data za poslednĂ tĂ˝den a porovná se jejich částka s tĂ˝dnem pĹ™edchozĂm. Na základÄ› dĹ™Ăve popsanĂ˝ch pomÄ›rĹŻ rozdĂlu v poÄŤtu transakcĂ se pak rozhodne, jestli došlo k opakovánĂ transakce, ÄŤi nikoli. -Z transakcĂ urÄŤenĂ˝ch jako opakujĂcĂ se, se urÄŤĂ kategorie na základÄ› hodnot konstantnĂch symbolĹŻ, jimiĹľ byla data obohacena. KonkrĂ©tnÄ› se vyuĹľĂvá jednotlivĂ˝ch tĹ™Ăd (tĹ™etĂ cifry v konstantnĂm symbolu). Pokud tato tĹ™Ăda nenĂ k dispozici nebo se konstantnĂ symbol Ĺ™adĂ mezi tzv. "rezervovanĂ© symboly", kategorie se oznaÄŤĂ jako "nerozhodnutá." +Z transakcĂ urÄŤenĂ˝ch jako opakujĂcĂ se, se urÄŤĂ kategorie na základÄ› hodnot konstantnĂch symbolĹŻ, jimiĹľ byla data obohacena. KonkrĂ©tnÄ› se vyuĹľĂvá jednotlivĂ˝ch tĹ™Ăd (tĹ™etĂ cifry v konstantnĂm symbolu). Pokud tato tĹ™Ăda nenĂ k dispozici nebo se konstantnĂ symbol Ĺ™adĂ mezi tzv. \uv{rezervovanĂ© symboly}, kategorie se oznaÄŤĂ jako \uv{nerozhodnutá}. Dalšà kategoriĂ je pak rozdÄ›lenĂ dle velikosti jako takovĂ©. RozdÄ›lenĂ se v~tomto pĹ™ĂpadÄ› Ĺ™ĂdĂ velikostmi ze sekce \ref{normalization} Normalizace. Názvy pak byly zvoleny následovnÄ›: \begin{enumerate}[1)] - \item do 500 KÄŤ = DrobnĂ© - \item 500 -- 5 000 KÄŤ = MalĂ© - \item 5 000 -- 25 000 KÄŤ = StĹ™ednĂ - \item 25 000 -- 50 000 KÄŤ = VelkĂ© - \item 50 000 -- 500 000 KÄŤ = Velmi velkĂ© - \item nad 500 000 KÄŤ = ZnaÄŤnÄ› velkĂ© + \item do 500 KÄŤ = DrobnĂ©, + \item 500 -- 5 000 KÄŤ = MalĂ©, + \item 5 000 -- 25 000 KÄŤ = StĹ™ednĂ, + \item 25 000 -- 50 000 KÄŤ = VelkĂ©, + \item 50 000 -- 500 000 KÄŤ = Velmi velkĂ©, + \item nad 500 000 KÄŤ = ZnaÄŤnÄ› velkĂ©. \end{enumerate} -\subsection{PĹ™edvĂdánĂ na základÄ› prĹŻmÄ›ru} -PĹ™i pĹ™edvĂdánĂ na základÄ› prĹŻmÄ›ru byla data rozdÄ›lena do třà dimenzĂ. PrvnĂ dimenzĂ je rok. Ten byl rozdÄ›len do po sobÄ› jdoucĂch, ÄŤtyĹ™tĂ˝dennĂch celkĹŻ, reprezentujĂcĂch mÄ›sĂce. KaĹľdĂ˝ tĂ˝den byl následnÄ› rozdÄ›len na jednotlivĂ© dny (pondÄ›lĂ -- nedÄ›le). Tedy kaĹľdĂ˝ rok má tĹ™ináct ÄŤtyĹ™tĂ˝dennĂch celkĹŻ, rozdÄ›lenĂ˝ch dále na dny v tĂ˝dnu. +\subsection{PĹ™edpovĂdánĂ na základÄ› prĹŻmÄ›ru} +PĹ™i pĹ™edpovĂdánĂ na základÄ› prĹŻmÄ›ru byla data rozdÄ›lena do třà dimenzĂ. PrvnĂ dimenzĂ je rok. Ten byl rozdÄ›len do po sobÄ› jdoucĂch, ÄŤtyĹ™tĂ˝dennĂch celkĹŻ, reprezentujĂcĂch mÄ›sĂce. KaĹľdĂ˝ tĂ˝den byl následnÄ› rozdÄ›len na jednotlivĂ© dny (pondÄ›lĂ -- nedÄ›le). Tedy kaĹľdĂ˝ rok má tĹ™ináct ÄŤtyĹ™tĂ˝dennĂch celkĹŻ, rozdÄ›lenĂ˝ch dále na dny v tĂ˝dnu. PrĹŻmÄ›rovánĂ probĂhá po jednotlivĂ˝ch dnech mezi zmĂnÄ›nĂ˝mi ÄŤtyĹ™tĂ˝dennĂmi celky. NapĹ™. hodnoty z pondÄ›lĂ z prvnĂho tĂ˝dne danĂ©ho celku se zprĹŻmÄ›rujĂ s~hodnotami jednotlivĂ˝ch pondÄ›lĂ pro veškerĂ© prvnĂ tĂ˝dny a pro veškerĂ© roky. @@ -569,12 +569,12 @@ TĂmto prĹŻmÄ›rovánĂm se zĂská prĹŻmÄ›rná velikost a poÄŤet transakcĂ pro Databáze by se dala rozdÄ›lit na ÄŤtyĹ™i samostatnĂ© celky. KaĹľdĂ˝ celek je ale strukturovanĂ˝ a propojenĂ˝ s ostatnĂmi. NĂĹľe jsou všechny popsány i s doprovodnĂ˝mi výřezy diagramu. KompletnĂ diagram databáze je však pĹ™Ăliš rozsáhlĂ˝ pro vloĹľenĂ do textu. Je proto pĹ™iloĹľen mezi externĂmi pĹ™Ălohami typu \ref{DBdiagram} jako obrázek s názvem \textit{DB\textunderscore diagram.png}. \subsection{UĹľivatel} -Prvnà částĂ je ukládánĂ dat o uĹľivateli. Pomyslnou hlavnĂ tabulkou je "User". Obsahuje uĹľivatelská jmĂ©na registrovanĂ˝ch uĹľivatelĹŻ a heslo, kterĂ© je zahashovanĂ© a propojenĂ© se solĂ. +Prvnà částĂ je ukládánĂ dat o uĹľivateli. Pomyslnou hlavnĂ tabulkou je \uv{User}. Obsahuje uĹľivatelská jmĂ©na registrovanĂ˝ch uĹľivatelĹŻ a heslo, kterĂ© je zahashovanĂ© a propojenĂ© se solĂ. -Pro kaĹľdĂ©ho uĹľivatele si tĂ©Ĺľ v tabulce "Files" ukládá informace, jakĂ© soubory nahrál, resp. jejich jmĂ©no a obsah. Je zde ale vystaveno omezenĂ na~uklá-dánĂ souborĹŻ tak, aby bylo jejich jmĂ©no, v rámci uĹľivatele, unikátnĂ. OmezenĂ bylo vytvoĹ™eno z dĹŻvodu zabránÄ›nĂ nahrávánĂ duplicitnĂch souborĹŻ, kterĂ© je těžkĂ© odhalit. UĹľivatel sice mĹŻĹľe stále upravit jmĂ©no a soubor nahrát, tĂmto zpĹŻsobem je ale upozornÄ›n, Ĺľe uĹľ systĂ©m data pravdÄ›podobnÄ› obsahuje. +Pro kaĹľdĂ©ho uĹľivatele si tĂ©Ĺľ v tabulce \uv{Files} ukládá informace, jakĂ© soubory nahrál, resp. jejich jmĂ©no a obsah. Je zde ale vystaveno omezenĂ na~uklá-dánĂ souborĹŻ tak, aby bylo jejich jmĂ©no, v rámci uĹľivatele, unikátnĂ. OmezenĂ bylo vytvoĹ™eno z dĹŻvodu zabránÄ›nĂ nahrávánĂ duplicitnĂch souborĹŻ, kterĂ© je těžkĂ© odhalit. UĹľivatel sice mĹŻĹľe stále upravit jmĂ©no a soubor nahrát, tĂmto zpĹŻsobem je ale upozornÄ›n, Ĺľe uĹľ systĂ©m data pravdÄ›podobnÄ› obsahuje. Dalšà vĂ˝hoda tĂ©to tabulky tkvĂ v tom, Ĺľe pokud si uĹľivatel pĹ™eje smazat nahranĂ˝ soubor, jsou známy transakce, kterĂ© jsou k danĂ©mu souboru navázány. - +\newpage \begin{figure}[H] \includegraphics[width=0.55\textwidth]{img/model-user.jpg} \centering @@ -594,9 +594,9 @@ Dále jsou zde napojeny odkazy na tabulky se záznamy, o~jakĂ˝ typ transakce se \subsection{KonstantnĂ symbol} KonstantnĂ symboly v databázi jsou hlavnÄ› ÄŤĂselnĂkem. Sloužà k obohacenĂ transakcĂ, a jakĂ˝ majĂ vĂ˝znam, jiĹľ bylo zmĂnÄ›no v sekci \ref{RealizaceObohaceni} ObohacenĂ. -Tato část obsahuje tabulku "\textit{ConstantSymbol}", coĹľ je entita, na kterou je odkazováno z "\textit{Transactions}". Definuje, jestli pĹ™ĂpadnĂ˝ konstantnĂ symbol, kterĂ˝ uĹľivatel vloĹľil, je validnĂ. Pokud ano, naváže na sebe jednotlivĂ© ÄŤĂselnĂky, pro kterĂ© je symbol definován. TÄ›mito ÄŤĂselnĂky se rozumĂ \textit{"Kind"} (druh transakce), \textit{"LastNumber"} (vĂ˝znam poslednĂ ÄŤĂslice), \textit{"MinistryPredefined"} (PĹ™eddefinovanĂ© tĹ™Ădy MFÄŚR) a \textit{"ReservedSymbol"} (RezervovanĂ© symboly). +Tato část obsahuje tabulku \uv{\textit{ConstantSymbol}}, coĹľ je entita, na kterou je odkazováno z \uv{\textit{Transactions}}. Definuje, jestli pĹ™ĂpadnĂ˝ konstantnĂ symbol, kterĂ˝ uĹľivatel vloĹľil, je validnĂ. Pokud ano, naváže na sebe jednotlivĂ© ÄŤĂselnĂky, pro kterĂ© je symbol definován. TÄ›mito ÄŤĂselnĂky se rozumĂ \textit{\uv{Kind}} (druh transakce), \textit{\uv{LastNumber}} (vĂ˝znam poslednĂ ÄŤĂslice), \textit{\uv{MinistryPredefined}} (PĹ™eddefinovanĂ© tĹ™Ădy MFÄŚR) a \textit{\uv{ReservedSymbol}} (RezervovanĂ© symboly). -PoslednĂ tabulkou je \textit{"ForeignPayment"}, jeĹľ sloužà k odlišenĂ zahraniÄŤnĂch transakcĂ. +PoslednĂ tabulkou je \textit{\uv{ForeignPayment}}, jeĹľ sloužà k odlišenĂ zahraniÄŤnĂch transakcĂ. \begin{figure}[h] \includegraphics[width=0.55\textwidth]{img/model-KS.png} \centering @@ -607,7 +607,7 @@ PoslednĂ tabulkou je \textit{"ForeignPayment"}, jeĹľ sloužà k odlišenĂ zahr \subsection{Neuronová sĂĹĄ} Poslednà částĂ databáze je neuronová sĂĹĄ. Sloužà k ukládánĂ vypoÄŤĂtanĂ˝ch nastavenĂ, aby natrĂ©novanou sĂĹĄ bylo moĹľnĂ© pozdÄ›ji znovu pouĹľĂt. SystĂ©m ukládánĂ funguje dle logiky zmĂnÄ›nĂ© v sekci \ref{ANNexportImport} Export, Import sĂtÄ›. -V databázi je seznam sĂtĂ (\textit{"Network"}). KaĹľdá se potom dÄ›lĂ na dalšà podseznamy -- vrstvy (\textit{"Layer"}), a ty dále na neurony (\textit{"Neuron"}). Jako poslednĂ seznam je seznam vah (\textit{"Weights"}) ke korespondujĂcĂm neuronĹŻm. +V databázi je seznam sĂtĂ (\textit{\uv{Network}}). KaĹľdá se potom dÄ›lĂ na dalšà podseznamy -- vrstvy (\textit{\uv{Layer}}), a ty dále na neurony (\textit{\uv{Neuron}}). Jako poslednĂ seznam je seznam vah (\textit{\uv{Weights}}) ke korespondujĂcĂm neuronĹŻm. \begin{figure}[h] \includegraphics[width=0.55\textwidth]{img/model-ann.png} \centering @@ -622,7 +622,7 @@ VĂ˝slednĂ© uĹľivatelskĂ© rozhranĂ má dohromady tĹ™i obrazovky. PĹ™ihlašovacĂ \section{PĹ™ihlašovacĂ obrazovka} PĹ™ihlašovacĂ obrazovka obsahuje formulář pro zadánĂ uĹľivatelskĂ©ho jmĂ©na a~he-sla. Dále obsahuje odkaz na stránku pro registraci, pro uĹľivatele, kteřà se do aplikace ještÄ› nezaregistrovali. \begin{figure}[h] - \includegraphics[width=0.55\textwidth]{img/screen_login.png} + \includegraphics[width=0.9\textwidth]{img/screen_login.png} \centering \caption[UĹľivatelskĂ© rozhranĂ - pĹ™ihlašovacĂ obrazovka]{UĹľivatelskĂ© rozhranĂ - pĹ™ihlašovacĂ obrazovka} \label{ScreenLogin} @@ -631,7 +631,7 @@ PĹ™ihlašovacĂ obrazovka obsahuje formulář pro zadánĂ uĹľivatelskĂ©ho jmĂ©n \section{RegistraÄŤnĂ obrazovka} RegistraÄŤnĂ obrazovka vycházĂ z obrazovky pĹ™ihlašovacĂ. Obsahuje formulář pro vytvoĹ™enĂ uĹľivatelskĂ©ho jmĂ©na, hesla a odkaz zpÄ›t na pĹ™ihlašovacĂ obrazovku pro uĹľivatele, jeĹľ klikli omylem na odkaz pro registraci. \begin{figure}[h] - \includegraphics[width=0.55\textwidth]{img/screen_registration.png} + \includegraphics[width=0.9\textwidth]{img/screen_registration.png} \centering \caption[UĹľivatelskĂ© rozhranĂ - registraÄŤnĂ obrazovka]{UĹľivatelskĂ© rozhranĂ - registraÄŤnĂ obrazovka} \label{ScreenRegistration} @@ -640,8 +640,8 @@ RegistraÄŤnĂ obrazovka vycházĂ z obrazovky pĹ™ihlašovacĂ. Obsahuje formulá \section{HlavnĂ obrazovka} HlavnĂ obrazovka je nejsloĹľitÄ›jšĂ. V záhlavĂ obsahuje dropdown menu, jenĹľ po rozkliknutĂ nabĂdne odhlášenĂ, zmÄ›nu hesla a zrušenà účtu. V pĹ™ĂpadÄ›, Ĺľe dojde k vĂ˝bÄ›ru odhlášenĂ, uĹľivatel je automaticky pĹ™esmÄ›rován na hlavnĂ obrazovku. Pokud ale naopak vybere moĹľnost pro zmÄ›nu hesla nebo zrušenà účtu, zobrazĂ se dialog pro potvrzenĂ a zadánĂ hesla. \begin{figure}[h] - \hspace{1.7cm} - $\vcenter{\hbox{\includegraphics[width=0.7\textwidth]{img/screen_menu.png}}}$ + %\hspace{1.7cm} + $\vcenter{\hbox{\includegraphics[width=1\textwidth]{img/screen_menu.png}}}$ \vspace{.3cm} @@ -652,12 +652,12 @@ HlavnĂ obrazovka je nejsloĹľitÄ›jšĂ. V záhlavĂ obsahuje dropdown menu, jen \caption[UĹľivatelskĂ© rozhranĂ - menu a účet]{UĹľivatelskĂ© rozhranĂ - menu a účet} \label{ScreenMenuAccount} \end{figure} -\newpage + Pod záhlavĂm je obrazovka rozdÄ›lena na dalšĂch pÄ›t částĂ. PrvnĂ z nich je část pro nahránĂ souboru obsahujĂcĂ vĂ˝pis z účtu a pod nĂm je seznam všech ĂşspěšnÄ› nahranĂ˝ch souborĹŻ. V tomto seznamu je zároveĹ tlaÄŤĂtko, kterĂ© umoĹľĹuje uĹľivateli libovolnĂ˝ soubor snadno odstranit. -Druhou částĂ jsou ÄŤtyĹ™i grafy, zobrazujĂcĂ jakĂ© mÄ›l uĹľivatel doposud vĂ˝daje. PrvnĂ z nich, sloupcovĂ˝, ukazuje souhrnnou velikost transakcĂ za poslednĂ ÄŤtyĹ™i tĂ˝dny. Dalšà tĹ™i jsou koláčovĂ©. PrvnĂ zobrazuje pomÄ›r velikostĂ transakcĂ (rozdÄ›lenĂ© na drobnĂ©, malĂ©, stĹ™ednĂ, velkĂ©,...). DruhĂ˝ i tĹ™etĂ graf pak vyuĹľĂvajĂ konstantnĂ symboly k zobrazenĂ, jakĂ©ho druhu transakce pravdÄ›podobnÄ› byly. +Druhou částĂ jsou ÄŤtyĹ™i grafy, zobrazujĂcĂ jakĂ© mÄ›l uĹľivatel doposud vĂ˝daje. PrvnĂ z nich, sloupcovĂ˝, ukazuje souhrnnou velikost transakcĂ za poslednĂ ÄŤtyĹ™i tĂ˝dny. Dalšà tĹ™i jsou koláčovĂ©. PrvnĂ zobrazuje pomÄ›r velikostĂ transakcĂ (rozdÄ›lenĂ© na drobnĂ©, malĂ©, stĹ™ednĂ, velkĂ© atd.). DruhĂ˝ i tĹ™etĂ graf pak vyuĹľĂvajĂ konstantnĂ symboly k zobrazenĂ, jakĂ©ho druhu transakce pravdÄ›podobnÄ› byly. \begin{figure}[h] - \includegraphics[width=0.55\textwidth]{img/screen_history.png} + \includegraphics[width=1\textwidth]{img/screen_history.png} \centering \caption[UĹľivatelskĂ© rozhranĂ - uĹľivatelská historie]{UĹľivatelskĂ© rozhranĂ - uĹľivatelská historie} \label{ScreenUserHistory} @@ -665,7 +665,7 @@ Druhou částĂ jsou ÄŤtyĹ™i grafy, zobrazujĂcĂ jakĂ© mÄ›l uĹľivatel doposud v ZbylĂ© části obrazovky tvořà samotnĂ© pĹ™edpovÄ›di. NejdĹ™Ăve se zobrazuje pĹ™edpověď základÄ› umÄ›lĂ© inteligence. Tu tvořà seznam pravdÄ›podobnĂ˝ch plateb na tĂ˝den od nahránĂ historie, doplnÄ›nĂ˝ o typ plateb (odhadnutĂ˝ z hodnot konstantnĂch symbolĹŻ) a koláčovĂ˝ graf, kterĂ˝ tyto transakce dává do pomÄ›ru stejnĂ˝m zpĹŻsobem, jako pĹ™edešlĂ˝ graf historie. \begin{figure}[h] - \includegraphics[width=0.55\textwidth]{img/screen_ann.png} + \includegraphics[width=1\textwidth]{img/screen_ann.png} \centering \caption[UĹľivatelskĂ© rozhranĂ - pĹ™edpověď neuronovou sĂtĂ]{UĹľivatelskĂ© rozhranĂ - pĹ™edpověď neuronovou sĂtĂ} \label{ScreenANN} @@ -673,15 +673,15 @@ ZbylĂ© části obrazovky tvořà samotnĂ© pĹ™edpovÄ›di. NejdĹ™Ăve se zobrazuje Druhá pĹ™edpověď, zaloĹľená na prĹŻmÄ›ru všech transakcĂ, zobrazuje čárovĂ˝ graf s odhadovanĂ˝mi vĂ˝daji na dalšà čtyĹ™i tĂ˝dny a koláčovĂ˝ graf pro pĹ™edpovÄ›di na jednotlivĂ© dny v tĂ˝dnu. -PoslednĂ pĹ™edpověď, tvoĹ™ĂcĂ zároveĹ poslednĂ sekci obrazovky, je pĹ™edpovĂdánĂ na základÄ› porovnávánà částek. Z tĂ©to pĹ™edpovÄ›di vycházĂ seznam pravdÄ›podobnĂ˝ch transakcĂ na dalšà tĂ˝den (strukturovanĂ˝ stejnÄ› jako seznam pro pĹ™edpovĂdánĂ neuronovou sĂtĂ), koláčovĂ© grafy s druhem transakcĂ, vycházejĂcĂch z konstantnĂch symbolĹŻ a pomÄ›rnou velikostĂ transakcĂ. +PoslednĂ pĹ™edpověď, tvoĹ™ĂcĂ zároveĹ poslednĂ sekci obrazovky, je pĹ™edpovĂdánĂ na základÄ› porovnávánà částek. Z tĂ©to pĹ™edpovÄ›di vycházĂ seznam pravdÄ›podob-nĂ˝ch transakcĂ na dalšà tĂ˝den (strukturovanĂ˝ stejnÄ› jako seznam pro pĹ™edpovĂdánĂ neuronovou sĂtĂ), koláčovĂ© grafy s druhem transakcĂ, vycházejĂcĂch z konstantnĂch symbolĹŻ a pomÄ›rnou velikostĂ transakcĂ. \begin{figure}[h] - \includegraphics[width=0.55\textwidth]{img/screen_average_amount.png} + \includegraphics[width=1\textwidth]{img/screen_average_amount.png} \centering \caption[UĹľivatelskĂ© rozhranĂ - pĹ™edpověď prĹŻmÄ›rem a hodnotou]{UĹľivatelskĂ© rozhranĂ - pĹ™edpověď prĹŻmÄ›rem a hodnotou} \label{ScreenANN} \end{figure} -\chapter{ZávÄ›reÄŤnĂ© testovánĂ} +\chapter{ZávÄ›reÄŤná testovánĂ} Aby se zjistilo, jestli aplikace funguje správnÄ›, je nutnĂ© ji nejdĹ™Ăve řádnÄ› otestovat. K tomu bylo vyuĹľito zejmĂ©na manuálnĂho testovánĂ. \section{ManuálnĂ testovánĂ} @@ -692,13 +692,18 @@ KdyĹľ uĹľivatel vybĂrá soubory s transakÄŤnĂ historiĂ, v základnĂm nastave Pokud ale dojde k nahrávánĂ platnĂ©ho souboru, je zobrazena hláška o~nahrá-vánĂ a po dokonÄŤenĂ je uĹľivatel informován, jestli byl soubor v pořádku nahrán, ÄŤi nikoli. \begin{figure}[h] - $\vcenter{\hbox{\includegraphics[width=0.4\textwidth]{img/import_error.png}}}$ - \hspace*{.2in} - $\vcenter{\hbox{\includegraphics[width=0.4\textwidth]{img/import_loading.png}}}$ - \hspace*{.2in} - $\vcenter{\hbox{\includegraphics[width=0.4\textwidth]{img/import_succesful.png}}}$ + $\vcenter{\hbox{\includegraphics[width=0.5\textwidth]{img/import_error.png}}}$ + \hspace*{0.1cm} + $\vcenter{\hbox{\includegraphics[width=0.48\textwidth]{img/import_loading.png}}}$ + + \vspace{0.5cm} + + $\vcenter{\hbox{\includegraphics[width=0.5\textwidth]{img/import_succesful.png}}}$ \centering - \caption[JednotlivĂ© stavy nahrávánĂ souborĹŻ]{JednotlivĂ© stavy nahrávánĂ souborĹŻ} + \caption[JednotlivĂ© stavy nahrávánĂ souborĹŻ]{JednotlivĂ© stavy nahrávánĂ souborĹŻ + \newline + \textit{Stav vlevo nahoĹ™e zobrazuje oznámenĂ o neĂşspěšnĂ©m nahránĂ souboru (chybu), vpravo nahoĹ™e je zobrazeno probĂhajĂcĂ nahrávánĂ souboru. PoslednĂ moĹľnĂ˝ stav (dole) zobrazuje oznámenĂ o ĂşspěšnĂ©m nahránĂ souboru.} + } \label{fileUpload} \end{figure} @@ -710,10 +715,13 @@ Dalšà moĹľnostĂ, jak mĹŻĹľe uĹľivatel zmÄ›nit data, je zmÄ›na hesla. Aby toho \hspace*{.2in} $\vcenter{\hbox{\includegraphics[width=0.3\textwidth]{img/changePassword_wrongPassword.png}}}$ \centering - \caption[Validace formuláře na zmÄ›nu hesla]{Validace formuláře na zmÄ›nu hesla} + \caption[Validace formuláře na zmÄ›nu hesla]{Validace formuláře na zmÄ›nu hesla + \newline + \textit{Vlevo nahoĹ™e stav, kdy uĹľivatel nevyplnil žádnĂ© pole, vpravo nahoĹ™e zadal do formuláře dvÄ› rĹŻzná hesla. PoslednĂ stav (dole) ukazuje situaci, kdy uĹľivatel zadal špatnĂ© pĹŻvodnĂ heslo.} + } \label{changePasswordValidation} \end{figure} - +\clearpage Se zmÄ›nou hesla do jistĂ© mĂry souvisĂ i smazánĂ celĂ©ho uĹľivatele. Aby mohl svĹŻj účet smazat, musĂ se takĂ© nejdĹ™Ăve autentizovat svĂ˝m starĂ˝m heslem. Pokud ho zadá špatnÄ›, nenĂ dovoleno mu účet smazat. Pokud ale heslo zadá správnÄ›, je jeho účet smazán i se všemi nahranĂ˝mi soubory a transakcemi, je odhlášen a pĹ™esmÄ›rován na pĹ™ihlašovacĂ obrazovku. \subsection{Autentifikace} @@ -723,7 +731,9 @@ Aplikace má na starost i správu uĹľivatelskĂ˝ch účtĹŻ. V pĹ™ĂpadÄ›, Ĺľe se \hspace*{.2in} $\vcenter{\hbox{\includegraphics[height=0.4\textwidth]{img/registration_alreadyExist.png}}}$ \centering - \caption[Validace pĹ™ihlašovacĂch ĂşdajĹŻ]{Validace pĹ™ihlašovacĂch ĂşdajĹŻ} + \caption[Validace pĹ™ihlašovacĂch ĂşdajĹŻ]{Validace pĹ™ihlašovacĂch ĂşdajĹŻ + \newline + \textit{Vlevo pĹ™ihlašovacĂ obrazovka, kde uĹľivatel zadal neplatnĂ© pĹ™ihlašovacĂ Ăşdaje, vpravo registraÄŤnĂ obrazovka, kde se uĹľivatel pokusit registrovat pomocĂ uĹľivatelskĂ©ho jmĂ©na, kterĂ© jiĹľ byl dĹ™Ăve pouĹľito.}} \label{loginError} \end{figure} @@ -733,12 +743,14 @@ PĹ™i pĹ™ihlašovánĂ i registraci jsou zároveĹ validovány formuláře samotn \hspace*{.2in} $\vcenter{\hbox{\includegraphics[height=0.5\textwidth]{img/registration_emptyError.png}}}$ \centering - \caption[Validace polĂ na formuláři]{Validace polĂ na formuláři} + \caption[Validace polĂ na formuláři]{Validace polĂ na formuláři + \newline + \textit{PĹ™ihlašovacĂ formulář (vlevo) a registraÄŤnĂ formulář (vpravo), kdyĹľ uĹľivatel nevyplnà žádnĂ© z polĂ}} \label{formEmptyError} \end{figure} Pokud se uĹľivatel pokusĂ pĹ™ejĂt na stránku pro registrovanĂ© uĹľivatele, aplikace to zaznamená, a pokud nenĂ pĹ™ihlášen, vrátĂ jej zpÄ›t na pĹ™ihlašovacĂ obrazovku. Pokud se ale uĹľivatel neodhlásil a nevypršela mu doba trvánĂ pĹ™ihlášenĂ, aplikace jej na zabezpeÄŤenou stránku pustĂ a zobrazĂ mu jeho data. - +\newpage \subsection{UĹľivatel bez JavaScriptu} Existuje i moĹľnost, Ĺľe na stránku pĹ™istoupĂ uĹľivatel, kterĂ˝ nemá zapnutĂ˝ JavaScript. To je jazyk, ve kterĂ©m je napsán celĂ˝ Angular framework a tĂm pádem bez nĂ aplikace nebude fungovat. Pokud však uĹľivatel bez zapnutĂ©ho JavaScriptu na stránku pĹ™istoupĂ, zobrazĂ se mu chybová hláška, Ĺľe je tĹ™eba mĂt povolen JavaScript. \begin{figure}[h] @@ -749,7 +761,7 @@ Existuje i moĹľnost, Ĺľe na stránku pĹ™istoupĂ uĹľivatel, kterĂ˝ nemá zapnut \end{figure} \subsection{Responzivita} -Jednou z podmĂnek práce je, aby byla aplikace responsivnĂ. Tedy, Ĺľe web bere ohled na velikost prohlĂĹľeÄŤe uĹľivatele. VĂ˝sledek tĂ©to operace se textovÄ› špatnÄ› demonstruje. Jako dĹŻkaz tedy alespoĹ posloužà nÄ›kolik obrázkĹŻ. +Jednou z podmĂnek práce je, aby byla aplikace responsivnĂ. Tedy, Ĺľe web bere ohled na velikost prohlĂĹľeÄŤe uĹľivatele. Toho bylo docĂleno pouĹľitĂm tzv. breakpointĹŻ v CSS (znaÄŤky, kterĂ© definujĂ vzhled obrazovky pro rĹŻznÄ› velká okna). VĂ˝sledek tĂ©to operace se textovÄ› špatnÄ› demonstruje. Jako ukázka funkÄŤnosti ale snad dobĹ™e posloužà pár obrázkĹŻ nĂĹľe. \begin{figure}[h] $\vcenter{\hbox{\includegraphics[width=0.7\textwidth]{img/responsivity_full.png}}}$ \hspace*{.2in} @@ -758,21 +770,23 @@ Jednou z podmĂnek práce je, aby byla aplikace responsivnĂ. Tedy, Ĺľe web bere \caption[Responzivita -- porovnánĂ obrazovek]{Responzivita -- porovnánĂ obrazovek} \label{responsivityComparsion} \end{figure} - +\newpage \section{TestovánĂ kvality} -Pro testovánĂ kvality práce bylo vyuĹľito vĂ˝pisu transakÄŤnĂ historie z vlastnĂho účtu, která byla oĹ™Ăznuta o jeden mÄ›sĂc a porovnána s historiĂ pĹŻvodnĂ. TĂm vznikl obraz, nakolik jsou jednotlivĂ© pĹ™edpovÄ›di pĹ™esnĂ©. +Pro testovánĂ kvality aplikace bylo vyuĹľito vĂ˝pisu transakÄŤnĂ historie z vlastnĂ-ho účtu, která byla oĹ™Ăznuta o jeden mÄ›sĂc a porovnána s historiĂ pĹŻvodnĂ. TĂm vznikl obraz, nakolik jsou jednotlivĂ© pĹ™edpovÄ›di pĹ™esnĂ©. -VlastnĂ historie byla vybrána v ÄŤasovĂ©m Ăşseku od 1.1.2019 do 31.8.2019 a byla porovnávána s následujĂcĂmi 28 dny. DalšĂm dĹŻvodem bylo to, Ĺľe svĂ© vlastnĂ transakce znám a to umoĹľĹuje lepšà náhled na to, kterĂ© pĹ™edpovÄ›di jsou špatnÄ› a kterĂ© dobĹ™e. DanĂ˝ Ăşsek byl zase vybrán z toho dĹŻvodu, Ĺľe jsem se v tu dobu choval podobnÄ› (náhlá zmÄ›na chovánĂ by nepĹ™ĂznivÄ› ovlivnila vĂ˝sledky). +VlastnĂ historie byla vybrána v ÄŤasovĂ©m Ăşseku od 1.1.2019 do 31.8.2019 a~byla porovnávána s následujĂcĂmi 28 dny. NavĂc svĂ© vlastnĂ transakce znám a to umoĹľĹuje lepšà náhled na to, kterĂ© pĹ™edpovÄ›di jsou špatnÄ› a kterĂ© dobĹ™e. DanĂ˝ Ăşsek byl zase vybrán z toho dĹŻvodu, Ĺľe jsem se v tu dobu choval podobnÄ› (náhlá zmÄ›na chovánĂ by nepĹ™ĂznivÄ› ovlivnila vĂ˝sledky). \subsection{PĹ™edpověď opakujĂcĂch se transakcĂ} OpakujĂcĂ se transakce jsou vyhodnocovány pomocĂ poslednĂch dvou tĂ˝dnĹŻ nahranĂ© historie. Tyto tĂ˝dny urÄŤĂ, jak se bude uĹľivatel chovat pozdÄ›ji. VyhodnocenĂ, kterĂ© transakce se opakujĂ a kterĂ© nikoli, je velmi individuálnĂ. Pro testy byly vybrány ty částkou si blĂzkĂ© a jsou zobrazeny nĂĹľe (spolu s tabulkou veškerĂ˝ch provedenĂ˝ch transakcĂ) -\newline \newline -\hspace*{-1cm} +\newpage +%\vspace{0.5cm} +\hspace{-0.9cm} +\scalebox{0.89}{ \begin{tabular}{|c |c |c |c|} \hline - \multicolumn{4}{|c|}{ProvedenĂ© transakce (částky v KÄŤ)} \\\hline + \multicolumn{4}{|c|}{ProvedenĂ© transakce (v KÄŤ)} \\\hline 1. tĂ˝den & 2. tĂ˝den & 3. tĂ˝den & 4. tĂ˝den \\\hline 15,00 & 15,00 & 15,00 & 15,00 \\\hline 100,00 & 43,00 & 25,20 & 15,00 \\\hline @@ -788,10 +802,10 @@ VyhodnocenĂ, kterĂ© transakce se opakujĂ a kterĂ© nikoli, je velmi individuál 1146,00 & & 1000,00 & 500,00 \\\hline 1470,00 & & 1596,74 & \\\hline \end{tabular} -\hspace{0.25cm} +\hspace{0.1cm} \begin{tabular}{|c |c |c |c|} \hline - \multicolumn{4}{|c|}{Transakce kterĂ© se opakujĂ (částky v KÄŤ)} \\\hline + \multicolumn{4}{|c|}{Transakce kterĂ© se opakujĂ (v KÄŤ)} \\\hline 1. tĂ˝den & 2. tĂ˝den & 3. tĂ˝den & 4. tĂ˝den \\\hline 15 & 15 & 15 & 15 \\\hline 100 & 86 & 88 & 80 \\\hline @@ -801,16 +815,20 @@ VyhodnocenĂ, kterĂ© transakce se opakujĂ a kterĂ© nikoli, je velmi individuál 250 & 250 & 250 & 250 \\\hline 465 & 347,60 & 556 & 500 \\\hline \end{tabular} -\newline \newline +} +\vspace{0.2cm} Pro tabulku pĹ™edpovÄ›dĂ je však nutnĂ© dodat, Ĺľe částka 250,00 KÄŤ se zaÄŤala objevovat aĹľ od 1.9.2019. Tato částka tvořà pomyslnou zmÄ›nu chovánĂ uĹľivatele a pĹ™estoĹľe je pozdÄ›ji v tabulkách s daty uvedena, nebyla uvaĹľována jako špatná pĹ™edpověď, vzhledem k tomu, Ĺľe algoritmy nemÄ›ly dostateÄŤná data k jejĂm pĹ™edpovÄ›zenĂ. +Dalšà informacĂ, kterou je tĹ™eba zmĂnit, je, Ĺľe aplikace nerozlišuje tĂ˝den, na kterĂ˝ se vydává pĹ™edpověď. Pro prvnĂ i ÄŤtvrtĂ˝ tĂ˝den je pĹ™edpověď stejná. To je takĂ© dĹŻvodem, proÄŤ se pro vyhodnocenĂ správnosti nepovaĹľujĂ transakce kolem jednoho tisĂce korun, provedenĂ© v prvnĂch tĹ™ech tĂ˝dnech, za opakujĂcĂ se. ÄŚtvrtĂ˝ uĹľ totiĹľ obsahuje jen transakce do pÄ›ti set korun a tĂm oznaÄŤuje všechny transakce vĂ˝raznÄ› pĹ™evyšujĂcĂ tuto částku na neopakujĂcĂ se. + \subsubsection{PĹ™edpověď neuronovou sĂtĂ} Neuronová sĂĹĄ dokázala pĹ™edpovÄ›dÄ›t ÄŤtyĹ™i transakce a dvÄ› vynechala. To je ekvivalentem 66,7\%, tedy nadpoloviÄŤnĂ vÄ›tšina. -\newline \newline + +\begin{center}{ \begin{tabular}{|c |c |c |c ||c|} \hline - \multicolumn{5}{|c|}{Predikce neuronovou sĂtĂ (hodnoty v KÄŤ)} \\\hline + \multicolumn{5}{|c|}{Predikce neuronovou sĂtĂ (v KÄŤ)} \\\hline 1. tĂ˝den & 2. tĂ˝den & 3. tĂ˝den & 4. tĂ˝den & predikce \\\hline 15,00 & 15,00 & 15,00 & 15,00 & 19,00 \\\hline 100,00 & 86,00 & 88,00 & 80,00 & \\\hline @@ -820,17 +838,19 @@ Neuronová sĂĹĄ dokázala pĹ™edpovÄ›dÄ›t ÄŤtyĹ™i transakce a dvÄ› vynechala. To 250,00 & 250,00 & 250,00 & 250,00 & \\\hline 465,00 & 347,60 & 556,00 & 500,00 & 420,00 \\\hline \end{tabular} +}\end{center} NevyplnÄ›ná pole v tabulce (sloupec predikce) oznaÄŤujĂ, v kterĂ˝ch pĹ™Ăpadech se neuronovĂ© sĂti nepodaĹ™ilo pĹ™edpovÄ›dÄ›t opakovánĂ transakcĂ. Naopak částky oznaÄŤujĂ odhadovanou velikost. \subsubsection{PĹ™edpověď porovnánĂm částky} -PĹ™edpovĂdánĂ opakujĂcĂch se transakcĂ na základÄ› částky bylo mĂ©nÄ› ĂşspěšnĂ©, neĹľ pĹ™edvĂdánĂ neuronovou sĂtĂ. Tento algoritmus sice byl schopen pĹ™edpovÄ›dÄ›t všechny opakujĂcĂ se transakce, avšak uvedl dalšĂch pÄ›t transakcĂ, jeĹľ se zĹ™ejmÄ› neopakovaly. +PĹ™edpovĂdánĂ opakujĂcĂch se transakcĂ na základÄ› částky bylo mĂ©nÄ› ĂşspěšnĂ©, neĹľ pĹ™edpovĂdánĂ neuronovou sĂtĂ. Tento algoritmus sice byl schopen pĹ™edpovÄ›dÄ›t všechny opakujĂcĂ se transakce, avšak uvedl dalšĂch pÄ›t transakcĂ, jeĹľ se zĹ™ejmÄ› neopakovaly. Celková Ăşspěšnost pĹ™edpovÄ›di byla stanovena jen jako 16,67\%. Tato hodnota byla stanovena tak, Ĺľe se kaĹľdá špatná pĹ™edpověď odeÄŤetla od pĹ™edpovÄ›di správnĂ©. Bylo šest opakujĂcĂch se transakcĂ a pÄ›t špatnÄ› pĹ™edpovÄ›zenĂ˝ch. VĂ˝sledek proto byl spoÄŤten následovnÄ›: \mbox{6-5/6 = 0,1667} -\newline \newline + +\begin{center}{ \begin{tabular}{|c |c |c |c ||c|} \hline - \multicolumn{5}{|c|}{PĹ™edpověď porovnánĂm částky (hodnoty v KÄŤ)} \\\hline + \multicolumn{5}{|c|}{PĹ™edpověď porovnánĂm částky (v KÄŤ)} \\\hline 1. tĂ˝den & 2. tĂ˝den & 3. tĂ˝den & 4. tĂ˝den & predikce \\\hline 15,00 & 15,00 & 15,00 & 15,00 & 15,00 \\\hline & & & & 15,00 \\\hline @@ -845,21 +865,22 @@ Celková Ăşspěšnost pĹ™edpovÄ›di byla stanovena jen jako 16,67\%. Tato hodnota 250,00 & 250,00 & 250,00 & 250,00 & \\\hline 465,00 & 347,60 & 556,00 & 500,00 & 420,00 \\\hline \end{tabular} -\newline \newline +}\end{center} -V pĹ™iloĹľenĂ© tabulce lze, obdobnÄ› jako v pĹ™edcházejĂcĂ sekci, ve sloupci predikce vidÄ›t, jakĂ© částky byly odhadovány. Ĺádky s nevyplnÄ›nĂ˝mi poli v jednotlivĂ˝ch tĂ˝dnech potom ukazujĂ, kterĂ© hodnoty byly pĹ™edvĂdány jako opakujĂ se, aÄŤ tomu tak nebylo. +V pĹ™iloĹľenĂ© tabulce lze, obdobnÄ› jako v pĹ™edcházejĂcĂ sekci, ve sloupci predikce vidÄ›t, jakĂ© částky byly odhadovány. Ĺádky s nevyplnÄ›nĂ˝mi poli v jednotlivĂ˝ch tĂ˝dnech potom ukazujĂ, kterĂ© hodnoty byly pĹ™edpovĂdány jako opakujĂ se, aÄŤ tomu tak nebylo. \subsection{PĹ™edpověď velikosti vĂ˝dajĹŻ} Predikce vĂ˝dajĹŻ pĹ™edstavuje odhad kumulativnà částky všech transakcĂ pro budoucĂ dny a to na základÄ› prĹŻmÄ›ru ze všech nahranĂ˝ch dat. NeuvaĹľujĂ tedy pouze opakujĂcĂ se transakce. -\newpage + \subsubsection{PĹ™edpověď na následujĂcĂ ÄŤtyĹ™i tĂ˝dny} Odhad na následujĂcĂ ÄŤtyĹ™i tĂ˝dny obsahuje 28 poloĹľek, pĹ™iÄŤemĹľ kaĹľdou poloĹľku lze povaĹľovat za samostatnĂ˝ text. Ăšspěšnost vyhodnocenĂ byla rozdÄ›lena na částku a mnoĹľstvĂ transakcĂ. Odhad částky se povedl pouze u jednĂ© ÄŤtvrtiny všech dnĹŻ, tedy rovnĂ˝ch 25\%. Pro mnoĹľstvĂ transakcĂ k danĂ©mu dni byl vĂ˝sledek lepšĂ. V tomto pĹ™ĂpadÄ› se povedlo odhadnout jedenáct dnĹŻ správnÄ›, tzn. 39,29\%. KumulativnĂ Ăşspěšnost pĹ™edpovÄ›di je pak rovna 32,14\%. -\newline \newline + \newcommand{\breakcell}[2]{ \vbox{\setbox0\hbox{\strut #2}\hbox to\wd0{\hss\strut #1\hss}\copy0} } +\begin{center}{ \begin{tabular}{|c |c |c |c |c |c |c |c|} \hline \multicolumn{7}{|c|}{PĹ™edpověď na následujĂcĂ ÄŤtyĹ™i tĂ˝dny} \\\hline @@ -894,14 +915,15 @@ Odhad na následujĂcĂ ÄŤtyĹ™i tĂ˝dny obsahuje 28 poloĹľek, pĹ™iÄŤemĹľ kaĹľdou 27 & 135,00 & 1 & 140,68 & 3,20 & ano & ne \\\hline 28 & 120,00 & 1 & 3229,67 & 3,00 & ne & ne \\\hline \end{tabular} +}\end{center} \newpage \subsubsection{PĹ™edpověď na jednotlivĂ© dny v tĂ˝dnu} PĹ™edpověď mnoĹľstvĂ transakcĂ a jejich poÄŤtu vycházĂ z prĹŻmÄ›ru jednotlivĂ˝ch dnĹŻ. Tato pĹ™edpověď byla postupnÄ› porovnána s následujĂcĂmi tĹ™emi tĂ˝dny. Celkovou výši transakcĂ i jejich poÄŤet lze vidÄ›t v tabulkách uvedenĂ˝ch nĂĹľe. ZároveĹ je zde uvedena tabulka, která ukazuje, kterĂ˝ odhad byl povaĹľován ještÄ› za správnĂ˝ a kterĂ˝ nikoli. -\newline \newline +\begin{center}{ \begin{tabular}{|c |c |c |c |c |c |c |c |c|} \hline - \multicolumn{9}{|c|}{PĹ™edpověď na tĂ˝den (částka v KÄŤ)} \\\hline + \multicolumn{9}{|c|}{PĹ™edpověď na tĂ˝den (v KÄŤ)} \\\hline \multirow{2}{*}{Den} & \multicolumn{2}{c|}{Odhad} & \multicolumn{2}{c|}{Test 1} & \multicolumn{2}{c|}{Test 2} & \multicolumn{2}{c|}{Test 3} \\ & částka & poÄŤet & částka & poÄŤet & částka & poÄŤet & částka & poÄŤet \\\hline Po & 237,80 & 1,09 & 0,00 & 0 & 2 159,00 & 2 & 1 180,00 & 2 \\\hline @@ -912,7 +934,8 @@ PĹ™edpověď mnoĹľstvĂ transakcĂ a jejich poÄŤtu vycházĂ z prĹŻmÄ›ru jednotl So & 298,32 & 2,74 & 803,00 & 3 & 0,00 & 0 & 128,00 & 3 \\\hline Ne & 1 076,40 & 2,34 & 89,00 & 2 & 347,60 & 1 & 646,00 & 2 \\\hline \end{tabular} -\newline \newline \newline +}\end{center} +\begin{center}{ \begin{tabular}{|c |c |c |c |c |c |c|} \hline \multicolumn{7}{|c|}{Správnost pĹ™edpovÄ›di na tĂ˝den} \\\hline @@ -926,14 +949,15 @@ PĹ™edpověď mnoĹľstvĂ transakcĂ a jejich poÄŤtu vycházĂ z prĹŻmÄ›ru jednotl So & ne & ano & ne & ne & ne & ano \\\hline Ne & ne & ano & ne & ne & ano & ano \\\hline \end{tabular} -\newline \newline +}\end{center} +\vspace{0.5cm} Z uvedenĂ˝ch ĂşdajĹŻ lze vyÄŤĂst, Ĺľe částku se podaĹ™ilo správnÄ› odhadnout celkem osmkrát, tedy s ĂşspěšnostĂ 38,1\%. Oproti tomu poÄŤet transakcĂ se podaĹ™ilo odhadnout v deseti pĹ™Ăpadech. Ăšspěšnost toho odhadu tedy dosahuje 47,62\%. KumulativnĂ Ăşspěšnost všech pĹ™edpovÄ›dĂ je proto 42,86\%. \newpage %TODO druhĂ˝ uĹľivatel -\section{TestovánĂ nezávislĂ˝m uĹľivatelem} -DalšĂm testem bylo ohodnocenĂ aplikace nezávislĂ˝m ÄŤlovÄ›kem. DotyÄŤnĂ˝ ale byl seznámen se zaměřenĂm aplikace a byl mu staĹľen vĂ˝pis z účtu a umĂstÄ›n na plochu. CelĂ˝ test pak tvoĹ™ilo nÄ›kolik bodĹŻ, kterĂ© má tento potencionálnĂ uĹľivatel projĂt a vyhodnotit. +\section{TestovánĂ laickĂ˝m uĹľivatelem} +DalšĂm testem bylo ohodnocenĂ aplikace laickĂ˝m uĹľivatelem, kterĂ˝ ale byl seznámen se zaměřenĂm aplikace a byl mu staĹľen vĂ˝pis z účtu a umĂstÄ›n na plochu. CelĂ˝ test pak tvoĹ™ilo nÄ›kolik bodĹŻ, kterĂ© má tento potencionálnĂ uĹľivatel projĂt a vyhodnotit. \subsection{PĹ™ihlášenĂ se do aplikace} TestujĂcĂ uĹľivatel se pokoušel do aplikace pĹ™ihlásit pomocĂ jmĂ©na a hesla ke svĂ©mu emailovĂ©mu účtu. Ten bohuĹľel aplikace neznala. Avšak uĹľivatel byl schopen bez problĂ©mĹŻ pochopit, Ĺľe zadal do aplikace nevalidnĂ Ăşdaje a nedÄ›lalo mu problĂ©my si pozdÄ›ji vytvoĹ™it vlastnà účet. @@ -960,7 +984,7 @@ Pro otestovánĂ validity kĂłdu jsem chtÄ›l aplikaci zkontrolovat pomocĂ W3C va \end{figure} \chapter{MoĹľnosti rozšĂĹ™enĂ} -MoĹľnosti rozšĂĹ™enĂ aplikace jsou velmi rozsáhlĂ©. MĹŻĹľe to zahrnovat zefektivnÄ›nĂ vĂ˝poÄŤtĹŻ ÄŤi doplnÄ›nĂ webovĂ©ho rozhranĂ o dalšà informace. Implementace všech tÄ›chto rozšĂĹ™enĂ ale objemem znaÄŤnÄ› pĹ™evyšuje rámec bakalářskĂ© práce. +MoĹľnosti rozšĂĹ™enĂ aplikace jsou velmi rozsáhlĂ©. MĹŻĹľe to zahrnovat zefektivnÄ›nĂ vĂ˝poÄŤtĹŻ ÄŤi doplnÄ›nĂ webovĂ©ho rozhranĂ o dalšà informace. \section{Backend} Pro serverovou část je jako dalšà rozšĂĹ™enĂ vhodnĂ© implementovat nÄ›jakou formu cachovánĂ (ukládánĂ si jiĹľ jednou vypoÄŤtenĂ˝ch informacĂ). Data zobrazovaná na webu se bez zmÄ›ny transakÄŤnĂ historie nemÄ›nĂ. Implementace je ale provedena tak, Ĺľe pro kaĹľdĂ© zobrazenĂ se musĂ znovu vypoÄŤĂtat. Tento zpĹŻsob nenĂ velmi efektivnĂ a bylo by vhodnĂ© je nÄ›jakĂ˝m zpĹŻsobem ukládat tĹ™eba do databáze a mÄ›nit je jen v pĹ™ĂpadÄ›, Ĺľe dojde ke zmÄ›nÄ› transakÄŤnĂ historie. @@ -984,12 +1008,12 @@ Dalšà funkcionalitou by mohlo bĂ˝t oznaÄŤovánĂ transakcĂ uĹľivatelem. Mohly Dalšà moĹľnostĂ by mohlo bĂ˝t propojenĂ s emailovĂ˝m účtem - notifikace po urÄŤitĂ©m poÄŤtu špatnĂ˝ch pĹ™ihlášenĂ, pĹ™ihlášenĂ na novĂ©m zaĹ™ĂzenĂ nebo obnova hesla emailem. -Nakonec by stálo za zmĂnku vytvoĹ™it formulář, do kterĂ©ho by uĹľivatel doplnil o sobÄ› nÄ›jaká data. Mohlo by to bĂ˝t pohlavĂ, vÄ›k, velikost mÄ›sta, ve kterĂ© bydlĂ,... To by byl dalšà zpĹŻsob, jak zvýšit mnoĹľstvĂ vstupĹŻ a vylepšit tak pĹ™edpovÄ›di umÄ›lĂ© inteligence. +Nakonec by stálo za zmĂnku vytvoĹ™it formulář, do kterĂ©ho by uĹľivatel doplnil o sobÄ› nÄ›jaká data. Mohlo by to bĂ˝t pohlavĂ, vÄ›k, velikost mÄ›sta, ve kterĂ© bydlĂ atp. To by byl dalšà zpĹŻsob, jak zvýšit mnoĹľstvĂ vstupĹŻ a vylepšit tak pĹ™edpovÄ›di umÄ›lĂ© inteligence. \begin{conclusion} -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. PĹ™edpovĂdánĂ transakcĂ umÄ›lou inteligenci jsem ještÄ› doplnil o pĹ™edvĂdánĂ na základÄ› prĹŻmÄ›rĹŻ a porovnávánà částek. +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. PĹ™edpovĂdánĂ transakcĂ umÄ›lou inteligenci jsem ještÄ› doplnil o pĹ™edpovĂdánĂ na základÄ› prĹŻmÄ›rĹŻ a porovnávánà částek. -V práci se mi podaĹ™ilo umÄ›lou umÄ›lou inteligenci vytrĂ©novat do tĂ© mĂry, Ĺľe je do urÄŤitĂ© mĂry schopna pĹ™edpovÄ›dÄ›t chovánĂ uĹľivatelĹŻ. Pro lešpĂ pĹ™edpovÄ›di by však bylo vhodnĂ© mĂt rozsáhlejšà data. +V práci se mi podaĹ™ilo umÄ›lou inteligenci vytrĂ©novat do tĂ© mĂry, Ĺľe je do urÄŤitĂ© mĂry schopna pĹ™edpovÄ›dÄ›t chovánĂ uĹľivatelĹŻ. Pro lešpĂ pĹ™edpovÄ›di by však bylo vhodnĂ© mĂt rozsáhlejšà data. Jako moĹľná dalšà zásadnĂ rozšĂĹ™enĂ bych uvedl doporuÄŤovánĂ produktĹŻ na základÄ› mnou implementovanĂ© umÄ›lĂ© inteligence. Na základÄ› velikosti Ăştraty, poÄŤtu transakcĂ za urÄŤitĂ© obdobĂ a produktĹŻ ostatnĂch uĹľivatelĹŻ by mohla, napĹ™. pomocĂ kolaborativnĂho filtrovánĂ, doporuÄŤovat uĹľivatelĹŻm bankovnĂ produkty. @@ -1002,31 +1026,31 @@ Jako moĹľná dalšà zásadnĂ rozšĂĹ™enĂ bych uvedl doporuÄŤovánĂ produkt \chapter{Seznam pouĹľitĂ˝ch zkratek} \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ĹŻ - \item [VREO] elektronickĂ˝ opis VeĹ™ejnĂ©ho rejstĹ™Ăku - \item [XOR] ExkluzivnĂ disjunkce - \item [CSV] Comma-separated values - \item [KS] konstantnĂ symbol - \item [VS] variabilnĂ symbol - \item [SS] specifickĂ˝ symbol \item [API] Application Programming Interface + \item [CSRF] Cross-site request forgery + \item [CSV] Comma-separated values \item [HTTP] Hypertext Transfer Protocol \item [ID] identifikátor + \item [JSON] JavaScript Object Notation + \item [JWT] JSON Web Token + \item [KS] konstantnĂ symbol \item [MFÄŚR] Ministerstvo financĂ ÄŚeskĂ© Republiky + \item [NoSQL] non SQL + \item [SQL] Structured Query Language + \item [SS] specifickĂ˝ symbol + \item [VREO] elektronickĂ˝ opis VeĹ™ejnĂ©ho rejstĹ™Ăku + \item [VS] variabilnĂ symbol + \item [XOR] ExkluzivnĂ disjunkce \end{description} \chapter{PĹ™iloĹľenĂ© soubory} \begin{description} - \item [KB\textunderscore VREO.xml] VĂ˝pis z VREO (KomerÄŤnĂ banka) \item [DB\textunderscore diagram.png] KompletnĂ diagram datovĂ©ho modelu\label{DBdiagram} - \item [CSAS.csv] Import ÄŚeskĂ© SpoĹ™itelny - \item [CSOB.csv] Import ÄŚSOB + \item [KB\textunderscore VREO.xml] VĂ˝pis z VREO (KomerÄŤnĂ banka) \item [AirBank.csv] ImportnĂ soubor Air Bank + \item [CSAS.csv] Import ÄŚeskĂ© spoĹ™itelny + \item [CSOB.csv] Import ÄŚSOB \item [Trask.csv] ImportnĂ data dodaná firmou Trask Solutions \item [Example.csv] PĹ™Ăklad ideálnĂch dat \end{description} diff --git a/Latex/mybibliographyfile.bib b/Latex/mybibliographyfile.bib index 11b12c2542e0fdafb9595448c4a369d48adf9573..10acdee3cc9c366cb27e713be77a6960d11b076f 100644 --- a/Latex/mybibliographyfile.bib +++ b/Latex/mybibliographyfile.bib @@ -171,6 +171,17 @@ note = "[cit. 2019-13-12]" } +@Article {MLNET_Preview, + title = "Announcing ML.NET 1.4 Preview and Model Builder updates (Machine Learning for .NET)", + author = "Cesar De la Torre", + journal = ".NET Blog {[online]}", + howpublished = "[online]", + month = "3." # "zářĂ", + year = "2019", + url = "https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-4-preview-and-model-builder-updates-machine-learning-for-net/", + note = "[cit. 2020-02-02]" +} + @MANUAL {CsvHelper, title = "CsvHelper", author = "Josh Close",