Zaktualizuj 'RaportJaroslawZbaski.md'

This commit is contained in:
Jarosław Zbąski 2020-05-19 20:39:29 +00:00
parent 84c416cc75
commit 3918d1fc79

View File

@ -1,204 +1,209 @@
##Jarosław Zbąski raport z podprojektu ##Jarosław Zbąski raport z podprojektu
--- ---
#Wybrana metoda: #Wybrana metoda:
--- ---
Do realizacji podprojektu wykorzystano drzewa decyzyjne wskazujące którą roślinę (jeśli w ogóle) należy posadzić na danym polu. Drzewo decyzję podejmuje na podstawie poszczególnych parametrów gleby: Do realizacji podprojektu wykorzystano drzewa decyzyjne wskazujące którą roślinę (jeśli w ogóle) należy posadzić na danym polu. Drzewo decyzję podejmuje na podstawie poszczególnych parametrów gleby:
-żyzność (z-żyzna, j-jałowa) -żyzność (z-żyzna, j-jałowa)
-nawodnienie (n - nawodniona, s - sucha)
-nasłonecznienie (s - w słońcu, c w cieniu) -nawodnienie (n - nawodniona, s - sucha)
-kwasowość gleby (k kwasowa, n neutralna, z - zasadowa)
-nasłonecznienie (s - w słońcu, c w cieniu)
#Uczenie modelu:
Dane treningowe: -kwasowość gleby (k kwasowa, n neutralna, z - zasadowa)
```
training_data = [
#zyznosc, nawodnienie, cien, kwasowość, grupa #Uczenie modelu:
['z', 'n', 's', 'z', 1], ---
['z', 'n', 's', 'n', 1], Dane treningowe:
['j', 'n', 's', 'z', 1], ```
['z', 's', 's', 'n', 1], training_data = [
['j', 'n', 'c', 'n', 1], #zyznosc, nawodnienie, cien, kwasowość, grupa
['z', 'n', 's', 'k', 1], ['z', 'n', 's', 'z', 1],
['z', 'n', 'c', 'k', 2], ['z', 'n', 's', 'n', 1],
['z', 's', 's', 'k', 2], ['j', 'n', 's', 'z', 1],
['z', 's', 'c', 'k', 2], ['z', 's', 's', 'n', 1],
['j', 'n', 's', 'k', 2], ['j', 'n', 'c', 'n', 1],
['z', 's', 'c', 'z', 3], ['z', 'n', 's', 'k', 1],
['j', 'n', 's', 'n', 3] ['z', 'n', 'c', 'k', 2],
] ['z', 's', 's', 'k', 2],
``` ['z', 's', 'c', 'k', 2],
Budowanie drzewa decyzyjnego opiera się na podziale gałęzi względem algorytmu CART. Ma ono postać ciągu pytań, na które odpowiedzi determinują kolejne pytania, bądź kończą etap. W wyniku otrzymujemy strukturę drzewa, która w węzłach końcowych nie zawiera już pytań, lecz same odpowiedzi. Dodatkowo wypisuje liczbę zestawów danych pasujących do liścia z zestawu treningowego. ['j', 'n', 's', 'k', 2],
``` ['z', 's', 'c', 'z', 3],
def build_tree(rows): ['j', 'n', 's', 'n', 3]
gain, question = find_best_split(rows) ]
if gain == 0: ```
return Leaf(rows) Budowanie drzewa decyzyjnego opiera się na podziale gałęzi względem algorytmu CART. Ma ono postać ciągu pytań, na które odpowiedzi determinują kolejne pytania, bądź kończą etap. W wyniku otrzymujemy strukturę drzewa, która w węzłach końcowych nie zawiera już pytań, lecz same odpowiedzi. Dodatkowo wypisuje liczbę zestawów danych pasujących do liścia z zestawu treningowego.
true_rows, false_rows = partition(rows, question) ```
true_branch = build_tree(true_rows) def build_tree(rows):
false_branch = build_tree(false_rows) gain, question = find_best_split(rows)
return Decision_Node(question, true_branch, false_branch) if gain == 0:
``` return Leaf(rows)
Znajdowanie najlepszego podziału opiera się głównie na Współczynniku Giniego, który mierzy stopień niejednorodności i dzieli ją przez ilość pozostałych zestawów testowych. true_rows, false_rows = partition(rows, question)
``` true_branch = build_tree(true_rows)
def find_best_split(rows): false_branch = build_tree(false_rows)
best_gain = 0 return Decision_Node(question, true_branch, false_branch)
best_question = None ```
current_uncertainty = gini(rows) Znajdowanie najlepszego podziału opiera się głównie na Współczynniku Giniego, który mierzy stopień niejednorodności i dzieli ją przez ilość pozostałych zestawów testowych.
n_features = len(rows[0]) - 1 ```
for col in range(n_features): def find_best_split(rows):
values = set([row[col] for row in rows]) best_gain = 0
for val in values: best_question = None
question = Question(col, val) current_uncertainty = gini(rows)
true_rows, false_rows = partition(rows, question) n_features = len(rows[0]) - 1
if len(true_rows) == 0 or len(false_rows) == 0: for col in range(n_features):
continue values = set([row[col] for row in rows])
gain = info_gain(true_rows, false_rows, current_uncertainty) for val in values:
if gain >= best_gain: question = Question(col, val)
best_gain, best_question = gain, question true_rows, false_rows = partition(rows, question)
return best_gain, best_question if len(true_rows) == 0 or len(false_rows) == 0:
``` continue
gain = info_gain(true_rows, false_rows, current_uncertainty)
Drzewo powstałe poprzez wykonanie metody print_tree(node,spacing) na zestawie testowym: if gain >= best_gain:
``` best_gain, best_question = gain, question
Czy kwasowosc == k? return best_gain, best_question
--> True: ```
Czy cien == s?
--> True: Drzewo powstałe poprzez wykonanie metody print_tree(node,spacing) na zestawie testowym:
Czy nawodnienie == n? ```
--> True: Czy kwasowosc == k?
Czy zyznosc == j? --> True:
--> True: Czy cien == s?
Predict {2: 1} --> True:
--> False: Czy nawodnienie == n?
Predict {1: 1} --> True:
--> False: Czy zyznosc == j?
Predict {2: 1} --> True:
--> False: Predict {2: 1}
Predict {2: 2} --> False:
--> False: Predict {1: 1}
Czy cien == s? --> False:
--> True: Predict {2: 1}
Czy zyznosc == j? --> False:
--> True: Predict {2: 2}
Czy kwasowosc == n? --> False:
--> True: Czy cien == s?
Predict {3: 1} --> True:
--> False: Czy zyznosc == j?
Predict {1: 1} --> True:
--> False: Czy kwasowosc == n?
Predict {1: 3} --> True:
--> False: Predict {3: 1}
Czy kwasowosc == n? --> False:
--> True: Predict {1: 1}
Predict {1: 1} --> False:
--> False: Predict {1: 3}
Predict {3: 1} --> False:
``` Czy kwasowosc == n?
#Implementacja w C++: --> True:
--- Predict {1: 1}
Komunikacja między pythonem a cpp zachodzi przez pliki dane.txt i decyzje.txt. W pliku dane.txt cpp wypisuje stan całego pola w oddzielonych spacją kolumnach począwszy od indeksu x=1,y=1 aż po x=25,y=25. Decyzje podjęte przez drzewo decyzyjne wypisane w pliku decyzje.txt zawierają symbol rośliny lub pola jakie mają się znajdować na polu (również w całej przestrzeni pola). --> False:
Predict {3: 1}
Zestaw testowych danych: ```
``` #Implementacja w C++:
void testSI1() ---
{ Komunikacja między pythonem a cpp zachodzi przez pliki dane.txt i decyzje.txt. W pliku dane.txt cpp wypisuje stan całego pola w oddzielonych spacją kolumnach począwszy od indeksu x=1,y=1 aż po x=25,y=25. Decyzje podjęte przez drzewo decyzyjne wypisane w pliku decyzje.txt zawierają symbol rośliny lub pola jakie mają się znajdować na polu (również w całej przestrzeni pola).
for (int i = 1; i < 26; i++)
{ Zestaw testowych danych:
for (int j = 1; j < 26; j++) ```
{ void testSI1()
if (j % 3 == 0) {
{ for (int i = 1; i < 26; i++)
pole[i][j][2] = 'z'; //zyzne {
pole[i][j][3] = 'n'; //nawodnione for (int j = 1; j < 26; j++)
pole[i][j][4] = 'c'; //w cieniu {
pole[i][j][5] = 'k'; //kwasne if (j % 3 == 0)
} {
else pole[i][j][2] = 'z'; //zyzne
{ pole[i][j][3] = 'n'; //nawodnione
if (j % 3 == 1) pole[i][j][4] = 'c'; //w cieniu
{ pole[i][j][5] = 'k'; //kwasne
pole[i][j][2] = 'j'; //jalowe }
pole[i][j][3] = 'n'; //nawodnione else
pole[i][j][4] = 's'; //w sloncu {
pole[i][j][5] = 'n'; //neutralne if (j % 3 == 1)
} {
else pole[i][j][2] = 'j'; //jalowe
{ pole[i][j][3] = 'n'; //nawodnione
pole[i][j][2] = 'z'; //zyzne pole[i][j][4] = 's'; //w sloncu
pole[i][j][3] = 's'; //suche pole[i][j][5] = 'n'; //neutralne
pole[i][j][4] = 's'; //sloneczne }
pole[i][j][5] = 'z'; //zasadowe else
} {
} pole[i][j][2] = 'z'; //zyzne
} pole[i][j][3] = 's'; //suche
} pole[i][j][4] = 's'; //sloneczne
} pole[i][j][5] = 'z'; //zasadowe
``` }
}
Funkcja wysyłająca stan pola: }
``` }
void sendState() }
{ ```
ofstream write("dane.txt");
for (int i = 1; i < 26; i++) Funkcja wysyłająca stan pola:
{ ```
for (int j = 1; j < 26; j++) void sendState()
{ {
string a; ofstream write("dane.txt");
a += pole[i][j][2]; for (int i = 1; i < 26; i++)
a += ' '; {
a += pole[i][j][3]; for (int j = 1; j < 26; j++)
a += ' '; {
a += pole[i][j][4]; string a;
a += ' '; a += pole[i][j][2];
a += pole[i][j][5]; a += ' ';
write << a << endl; a += pole[i][j][3];
} a += ' ';
} a += pole[i][j][4];
write.close(); a += ' ';
} a += pole[i][j][5];
``` write << a << endl;
}
Funkcja kierująca traktorem (decyzja co zasiać): }
``` write.close();
void reciveState() }
{ ```
ifstream read("decyzje.txt");
if (read.is_open()) Funkcja kierująca traktorem (decyzja co zasiać):
{ ```
char plant; void reciveState()
int i = 1; {
int j = 1; ifstream read("decyzje.txt");
while (read >> plant) if (read.is_open())
{ {
if (j == 25) char plant;
{ int i = 1;
gogo(1, i+1); int j = 1;
} while (read >> plant)
else {
{ if (j == 25)
gogo(j+1 , i ); {
} gogo(1, i+1);
pole[i][j][0] = plant; }
if (plant == '.') else
{ {
pole[i][j][1] = '1'; gogo(j+1 , i );
} }
else pole[i][j][0] = plant;
{ if (plant == '.')
pole[i][j][1] = '9'; {
} pole[i][j][1] = '1';
if (j == 25) }
{ else
j = 1; {
i += 1; pole[i][j][1] = '9';
} }
else if (j == 25)
{ {
j += 1; j = 1;
} i += 1;
} }
} else
} {
j += 1;
}
}
}
}
``` ```