From abf5829c3426e92ea4c08c6d8cc56a75dee54228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20=C5=81ukasik?= Date: Tue, 19 May 2020 22:21:13 +0200 Subject: [PATCH 1/2] zmiany --- __pycache__/data.cpython-37.pyc | Bin 2311 -> 2311 bytes __pycache__/field.cpython-37.pyc | Bin 1606 -> 1606 bytes data.py | 2 +- field.py | 5 ++--- main.py | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/__pycache__/data.cpython-37.pyc b/__pycache__/data.cpython-37.pyc index 77ec7fdb49dbcfe2511f82a7ea2417da6b3f140e..196eabc65826b54364b04b6b53e72da128d0325d 100644 GIT binary patch delta 22 ccmZn{Y8T>l;^pOH0D_JahvRl^l;^pOH0D|`i565la$oq=}06ysk?f?J) diff --git a/__pycache__/field.cpython-37.pyc b/__pycache__/field.cpython-37.pyc index 2a25f2452f0d68a928b0434daf9e793fe34b7a0b..a6aa6db7e4a8e075da7cb20f8641036987226605 100644 GIT binary patch delta 47 zcmX@cbBu@AiIE)e8V7 Cat$~D diff --git a/data.py b/data.py index 4c3a444..b8e059f 100644 --- a/data.py +++ b/data.py @@ -40,7 +40,7 @@ learning_data = [ ['gold', 'rectangle', 40, 'medium', 'Twix'], ['gold', 'rectangle', 50, 'medium', 'Prince-polo'], ['brown', 'rectangle', 55, 'medium', 'Snickers'], - ['brown', 'rectangle', 45, 'medium', 'Lion'], + ['brown', 'rectangle', 45, 'medium', 'Lion'], ['white', 'rectangle', 40, 'medium', 'Kinder-bueno'], ['red', 'rectangle', 50, 'medium', 'Kit-kat'], ['blue', 'rectangle', 115, 'big', 'Wedel'], diff --git a/field.py b/field.py index d90ffa6..89f246a 100644 --- a/field.py +++ b/field.py @@ -33,7 +33,6 @@ class Field: self.rect.center = (center_x, center_y) - # Metoda do wyświetlania pola na ekranie def blitme(self): self.screen.blit(self.image, self.rect) @@ -49,5 +48,5 @@ class Field: self.neighbors.append(board[self.y + 1][self.x]) def addShelf(self): - shelf = Shelf(len(self.shelves)+1) - self.shelves.append(shelf) \ No newline at end of file + shelf = Shelf(len(self.shelves) + 1) + self.shelves.append(shelf) diff --git a/main.py b/main.py index f71fa65..0f4925b 100644 --- a/main.py +++ b/main.py @@ -46,7 +46,6 @@ def run(): elif event.key == pygame.K_SPACE: board[9][0].item = choice(data.learning_data) print("Wybrano: " + board[9][0].item[-1]) - board[9][0].item[-1] = 'Something' field = board[9][0] if not field.is_shelf: path = functions.a_star(board[agent.y][agent.x], field, board) From d55884cce61e80b2978d7e6e45a4da75c8feeb55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20=C5=81ukasik?= Date: Tue, 19 May 2020 23:27:29 +0200 Subject: [PATCH 2/2] stworzenie raportu --- .idea/misc.xml | 2 +- .idea/wozek.iml | 2 +- {Archiwum => Raporty}/README.md | 0 Raport_444420.md => Raporty/Raport_444420.md | 0 {Archiwum => Raporty}/environment.md | 0 Raporty/raport_444428.md | 132 ++++++++++++++++++ .../route-planning.md | 0 __pycache__/mcda.cpython-37.pyc | Bin 0 -> 2370 bytes __pycache__/product.cpython-37.pyc | Bin 0 -> 455 bytes __pycache__/supply.cpython-37.pyc | Bin 0 -> 1272 bytes 10 files changed, 134 insertions(+), 2 deletions(-) rename {Archiwum => Raporty}/README.md (100%) rename Raport_444420.md => Raporty/Raport_444420.md (100%) rename {Archiwum => Raporty}/environment.md (100%) create mode 100644 Raporty/raport_444428.md rename route-planning.md => Raporty/route-planning.md (100%) create mode 100644 __pycache__/mcda.cpython-37.pyc create mode 100644 __pycache__/product.cpython-37.pyc create mode 100644 __pycache__/supply.cpython-37.pyc diff --git a/.idea/misc.xml b/.idea/misc.xml index adaa126..715ed69 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/wozek.iml b/.idea/wozek.iml index 904114b..a9742fc 100644 --- a/.idea/wozek.iml +++ b/.idea/wozek.iml @@ -4,7 +4,7 @@ - + diff --git a/Archiwum/README.md b/Raporty/README.md similarity index 100% rename from Archiwum/README.md rename to Raporty/README.md diff --git a/Raport_444420.md b/Raporty/Raport_444420.md similarity index 100% rename from Raport_444420.md rename to Raporty/Raport_444420.md diff --git a/Archiwum/environment.md b/Raporty/environment.md similarity index 100% rename from Archiwum/environment.md rename to Raporty/environment.md diff --git a/Raporty/raport_444428.md b/Raporty/raport_444428.md new file mode 100644 index 0000000..f99651d --- /dev/null +++ b/Raporty/raport_444428.md @@ -0,0 +1,132 @@ +# Wojciech Lukasik - drzewa decyzyjne, algorytm CART + +### Opis podprojektu +Podprojekt implementuje tworzenie drzewa decyzyjnego w oparciu o algorytm CART +(Classification And Regression Tree), które pomaga Agentowi w rozpoznaniu słodyczy na podstawie +ich cech fizycznych (kolor, kształt, masa, rozmiar). + +Wszystkie funkcje oraz klasy wykorzystywane w tym podprojekcie znajdują się w pliku decision_tree.py, +dane uczące znajdują się w pliku data.py w liście learning_data + +### Tworzenie drzewa decyzyjnego + +Główną funkcją jest build_tree(rows), która jak wskazuje nazwa tworzy drzewo. Funkcja przyjmuje +jako argument listę zawierającą zestaw danych, w tym przypadku będą to słodycze o różnych właściwościach. + +```python +def build_tree(rows): + gain, question = find_best_split(rows) + + if gain == 0: + return Leaf(rows) + + true_rows, false_rows = partition(rows, question) + + true_branch = build_tree(true_rows) + + false_branch = build_tree(false_rows) + + return DecisionNode(question, true_branch, false_branch) +``` + +Drzewo jest budowane w oparciu o najlepsze możlwe podziały (najbardziej korzystne 'pytanie', które można zadać). +Zajmuje się tym funkcja + +`find_best_split(rows)` która dla wszystkich właściwości przekazanego zestawu informacji +wylicza dla nich 'zysk informacji'. + +Jeżeli nie otrzymujemy żadnych informacji (gain == 0) to znaczy, że znajdujemy +się w liściu drzewa. + +```python +def find_best_split(rows): + """ znajdź najlepsze możliwe pytanie do zadania, sprawdzając wszystkie + właściwośći oraz licząc dla nich 'info_gain' """ + best_gain = 0 + best_question = None + current_uncertainty = gini(rows) + n_features = len(rows[0]) - 1 + + for col in range(n_features): + values = set([row[col] for row in rows]) + + for val in values: + question = Question(col, val) + + true_rows, false_rows = partition(rows, question) + + if len(true_rows) == 0 or len(false_rows) == 0: + continue + + gain = info_gain(true_rows, false_rows, current_uncertainty) + + if gain > best_gain: + best_gain, best_question = gain, question + + return best_gain, best_question +``` + +Zysk informacji z danego podziału otrzymujemy obliczając wartość 'Gini Impurity'. Jest to miara tego jak często losowo +wybrany element zbioru byłby źle skategoryzowany, gdyby przypisać mu losową kategorię spośród wszystkich kategorii +znajdujących się w danym zbiorze. + +```python +def gini(rows): + counts = class_counts(rows) + impurity = 1 + for lbl in counts: + prob_of_lbl = counts[lbl] / float(len(rows)) + impurity -= prob_of_lbl ** 2 + return impurity +``` +`class_counts(rows)` to funkcja, która dla danego zestawu danych zwraca wszystkie unikalne klasy oraz liczbę ich wystąpień. + +Dla przykładu, dla zestawu w którym wszystkie elementy podchodzą pod tę samą kategorię wartość Gini będzie równa zero, +natomiast dla zbioru w którym znajdują się dwie kategorie wartość ta wyniesie 0,5. + +Po znalezieniu najbardziej optymalnego pytania, algorytm dzieli zestaw na elementy, dla których pytanie jest prawdziwe +(true_rows), oraz te dla których jest fałszywe (false_rows). Następnie wykonuje rekurencyjnie procedurę build_tree dla +obu poddrzew tak długo aż nie dojdzie do liści. + +Element o zadanym zestawie cech, zostaje odnaleziony w drzewie dzięki prostej procedurze + +`classify(row, node)` 'row' to lista cech elementu, natomiast 'node' na początu jest korzeniem już zbudowanego drzewa. + +Element jest odnaleziony dzięki +rekurencyjnym porównaniom atrybutów elementu z pytaniami w kolejnych węzłach drzewa. + +```python +def classify(row, node): + if isinstance(node, Leaf): + return node.predicions + + if node.question.match(row): + return classify(row, node.true_branch) + else: + return classify(row, node.false_branch) +``` + +### Zestaw uczący + +Zestaw budujący drzewo to lista zawierająca 27 przykładowych słodyczy. Ich atrybuty zapisane są w formacie ['kolor', +'kształt', 'masa', 'wielkość', 'nazwa']. Oczywiście przy wyszukiwaniu elementu w drzewie jego nazwa nie jest potrzebna +ponieważ to jej szukamy. Przykładowe elementy z zestawu uczącego: + +```python + ['black', 'rectangle', 51, 'small', 'Mars'], + ['gold', 'pack', 100, 'big', 'Haribo'], + ['purple', 'rectangle', 100, 'big', 'Milka'], + ['brown', 'pack', 45, 'small', 'M&M'], +``` + +### Implementacja w projekcie + +Przy rozpoczęciu głównej pętli programu w pliku `main.py` drzewo `my_tree` zostaje zbudowane w oparciu o dane +`data.learning_data`. + +Gdy program już działa, po wciśnięciu `spacji` jeden ze słodyczy zostanie losowo wybrany z zestawu `data.learning_data` +oraz umieszczony na polu `board[9][0]`, a jego nazwa zostanie wypisana w konsoli. Następnie Agent przemieszcza się do +punktu `board[9][0]` i rozpoczne procedurę wyszukiwania elementu w zbudowanym drzewie. Na końcu wypisze w +konsoli nazwę produktu. + + diff --git a/route-planning.md b/Raporty/route-planning.md similarity index 100% rename from route-planning.md rename to Raporty/route-planning.md diff --git a/__pycache__/mcda.cpython-37.pyc b/__pycache__/mcda.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a51297a23ec784757ab4f8f2d3f374ac4308af95 GIT binary patch literal 2370 zcma)7&u<(x6t+E{+1bsHhBR%OrcKiXN*1Xls-P`Zp-o$f98grL6+xpwH5rdKo6PRc zdS*$AW=_k28yq?0P>x9a4@eb%g-=MFmcIaTf$w?q6H%!i`PqK9pZ&h~JPeLuq3A2c{DRdgPpWB}^Vm2##)6Ix+l_c|hAf;VLDe&F@?=C zC4*kp?S&fKwnJTajGMK>Br#qqR?S|^IGfEz#IcnMwF31KYW4u4VA}wBN9ZZ^xDvDM z=}_lDw`6tlNasR#&+0tVDb#vpO<#l^P0s6C5|YFvh`|&@T^N})zrkHwVU`hOU;NDU zRm}Xo@c8b=)4Zpe;l>l)*@joy#>!{cZ!X_l-e^TCypg^zRoeS`2yn>zjDTglcJ%2* zj0X-0at+>BcH?GaE6)t?8lDd5G6N5yfr|3`{Q>zu@F9Su8+DS724q`d8tW@i>N$vr zwo##$tXsT3K&RjZE5tP0;d(-GU`1ocj+YCk;1_`2G&F^{z$``r7&&YD9qiR~MeBN9 z2BNWo`cS`1x~0PjJF6EkG~8a;BUaR?0#uIl~}bE4>+bCRpi~URfzb&U1m#iW!EMQ(JgNr7sJ2irr?V zfJ-h~vQ~K`YYwd8+#H}#`&w)M8(EVD>+@U|yw6{2srp8iT-*x?Uatgn$cj@}I#9ucVSnOYj^uodUA&TOEx-DQ_8(pusf9tFN)_`_f% zI*xQu8&ddr)@udTBP)jQo;Z#Y=mc5Lfh;RY^6W(#pWqA~krB5T7$b$xFYyKLpK9k$ zjWtm`q777t{1sHos2rUJE7{(5&WJ00MB*{~GAKFmZ12`7?X}XOWWaNAr@Pc$0=pby zmE{(=&=F6@a-W^7BQPyGp92PxE&h#2xnyUY5_1Y3D73FkKRQ- z!NTrIz7B*Ig zHUO?HoxLZgPJV!sPwp1_uR^?(2p!I+pit6KzmGoraqfT+)-R!7Jz?Ef>#RG!ZdchA zlss~6@DIv~7 zXy9eNG)-OvQ<09tJbtdiJbZq5si6(J$2(o;Xhz623qD<4rhz#h>-Z{{`Q-?~DKd literal 0 HcmV?d00001 diff --git a/__pycache__/product.cpython-37.pyc b/__pycache__/product.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5d2555af12938ca13d899404e7bb12fa59a4007 GIT binary patch literal 455 zcmYjMJx{|h5Is8y4HcCTVq|6LKvi`_2+D`Vf-0nLQG^x6K?J2A*y%u(jsBTV`~(($ zg;#z88x!vmih9<2ced}IpRYQdHX%MPJ|EtZzj(6=55*9$2cTQhq{Rw&lM!h-rmmOb z{68eBAz%+d8AU=0TMUkgH^!u)LZ)SRtmT7<<4$eGy4cH@4B`Q)>NwBCqu&jKr zrwIaL1dSk_6*J=k`;^Qx=T8!Aop1AH)(w!e;?c06Ve`gk;y2c0T1Y>~H>dHqT-^0hcW2yPPxd!2iH@JqUJKFSNMJdfYT#stHtSnUYU~&WAXk;?$qf8?j?nq7I#h z;C*n+r|cu2@=vJw4?Khj8ZdW;KaV;tJVt)gq2EG&8y3#!v|tgIYWU|Ic!)Yn4jsZ> z`Z40?9el!@4*Wumey2vC^1A4#59wTT#NWaCTz1^sMZPN@(s#vA`7YPo>&92$N)7+2 zBhDCB;F^O^_;m-~L44Jb7q7v)E_}-HP2boy;ZP>&ftgn#EtBy`3VR2iu?cmaNNIx6 zM1lzlq*x%_A7&#H6_qNaz_V&{IJTR#5e#J|Y@e1k^yq|F;_i!{9?1e)!!QEswm{q?c&IEQYDg7 z>_Ji{d#4II!1KC9!+78=@R8W+Rcf04SoA{k&JVRzl{bi`QX6}BD|0O9NV2zlj H>a_e{-z^;D literal 0 HcmV?d00001