90 lines
3.0 KiB
Markdown
90 lines
3.0 KiB
Markdown
|
---
|
||
|
|
||
|
# SVM raport
|
||
|
|
||
|
##### Konrad Pierzyński
|
||
|
|
||
|
###### Śmieciarz
|
||
|
|
||
|
12.06.2019
|
||
|
|
||
|
---
|
||
|
|
||
|
**SVM** - **S**upport-**V**ector **M**achine - zestaw metod uczenia stosowanych głównie do klasyfikacji, której nauka ma na celu wyznaczenie płaszczyzn rozdzielających dane wejściowe na klasy.
|
||
|
|
||
|
![5d00b5469956838867](https://i.loli.net/2019/06/12/5d00b5469956838867.png)
|
||
|
|
||
|
---
|
||
|
|
||
|
### Przygotowanie danych
|
||
|
|
||
|
Dane uczące zostały wygenerowane w następujący sposób:
|
||
|
|
||
|
+ Program generuje losową mapę o określonych wymiarach
|
||
|
|
||
|
+ Uruchamiany jest jeden z algorytmów (*BestFirstSearch*), który generuje listę ruchów.
|
||
|
|
||
|
+ Do zestawu uczącego dopisywana jest para składająca się na ruch i otoczenie gracza.
|
||
|
|
||
|
- Ruch odpowiada kierunkom: góra, prawo, dół, lewo i akcji zebrania/oddania śmieci - odpowienio liczbowo 1, 2, 3, 4, 99
|
||
|
|
||
|
- Otocznie to tablica dwuwymiarowa 7x7, gdzie element środkowy to pozycja gracza. Tablica ta następnie spłaszczana jest do tablicy jednowymiarowej
|
||
|
|
||
|
- Każdy 'domek', na którym została wykonana już akcja zebrania i jest opróżniony, widoczny jest na mapie tak samo jak element otoczenia, z którym gracz nie może wejść w żadną interakcję (stanąć, zebrać)
|
||
|
|
||
|
- Jeśli siatka 7x7 wykracza swoim zakresem za mapę, siatka uzupełniana jest przez trawę, czyli obiekt, z którym gracz nie wchodzi w interakcję
|
||
|
|
||
|
+ Po przejściu całej mapy algorytmem i zebraniu danych proces jest powtarzany tak długo, by zgromadzić około tysiąc rozwiązanych map
|
||
|
|
||
|
Pojedynczy zestaw danych jest zapisywany jako json postaci:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"maps": [
|
||
|
[Int, Int, ...],
|
||
|
[Int, Int, ...],
|
||
|
...
|
||
|
],
|
||
|
"moves":
|
||
|
[
|
||
|
Int, Int, ...
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
I dopisywany do głównej struktury:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"moveset": [
|
||
|
Zestaw, Zestaw, ...
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
### Uczenie
|
||
|
|
||
|
Do przeprowadzenia procesu uczenia dane uczące zostały podzielone na dwie listy:
|
||
|
|
||
|
- Pierwsza lista X zawiera wszystkie mapy częściowe (otoczenia)
|
||
|
|
||
|
```X = [ [Int, Int, ...], [Int, Int, ...], ... ]```
|
||
|
|
||
|
- Druga lista y zawiera odpowiadające mapom ruchy (1,2,3,4,99), które wykonał algorytm (*BestFirstSearch*) na danych otoczeniach.
|
||
|
|
||
|
```y = [ Int, Int, ... ]```
|
||
|
|
||
|
Wyżej wymienione dwie listy zostały podane jako argument metodzie ```fit(X,y)```, która odpowiada za uczenie się SVM. Natomiast utworzenie samego obiektu polega na zaimportowaniu biblioteki *scikit-learn*:
|
||
|
```from sklearn import svm```
|
||
|
a następnie już same utworzenia obiektu svm:
|
||
|
```clf = svm.SVC(gamma='scale')```
|
||
|
Wyuczony obiekt jest zapisywany do pliku, dzięki modułowi ```pickle```, aby nie przeprowadzać procesu uczenia za każdym uruchomieniem programu.
|
||
|
|
||
|
---
|
||
|
|
||
|
### Wykonywanie ruchów
|
||
|
|
||
|
Do przewidywania ruchów wystarczy użyć metody ```predict([ [otoczenie] ])``` , które przyjmuje mapę częściową, a jej wynik jest akcją, którą powinien wykonać gracz. Wynik metody przekazywany jest graczowi, który wykonuje ruch.
|