---
# System prepended metadata

title: Artificiële Intelligentie
tags: [HoGent, ' AI']

---

---
tags: HoGent, AI
---

# Artificiële Intelligentie

[![](https://i.imgur.com/8q8amV5.png)](https://i.imgur.com/8q8amV5.png)


## Rationale Agenten
### Definities van Artificiële Intelligentie
/
### Rationale Agenten

`Agent`: entiteit die omgeving kan waarnemen adhv sensoren en invloed kan uitoefenen door actoren.
- krijgt per tijdseenheid een waarnameing met als gevolg een `waarnemingssequentie`
- `waarn.seq.` --- `agentfuntie` --- > acties
- heeft `performantiemaat`:
    - NIET beloond voor acties maar voor gevolgen van de acties
    - "score"

`Rationale agent`: maximaliseert de `performantiemaat`, rekening houdend met `waarn.seq.` en de evt. ingebouwde kennis van de agent.

:warning: rationaliteit $\neq$ helderziendheid.


### Eigenschappen van Omgevingen

![](https://i.imgur.com/mBPGIU9.png)

- De meest eenvoudige omgevingen: steeds de bovenste eig, 
- De meest realistische omgevingen vaak de onderste eig.

### Structuur van Agenten
4 types agenten gesorteerd op complexiteit:
1. `Eenvoudig reflex`
    - GEEN geheugen: alles episodisch bepaald.
        - kan dus niet rationaal zijn in een partieel observeerbare wereld
    - IF-THEN
    - Problemen bij sequentiele en partieel observeerbare omgevingen
1. `Modelgebaseerd reflex`
    - maakt eerst een **inschatting** van de situatie.
    - beschikt over een model van hoe de omgeving verandert of zal veranderen door acties
    - daarna als-dan
    - heeft geen voordeel over de eenvoudige reflex agent in compleet observeerbare omgeving!
3. `Doelgebaseerd`
    - Naast een model is ook een beschrijving van het doel belangrijk.
5. `Utiliteitsgebaseerd`
    - zoals doelgebaseerd maar gebruikt `utiliteitsfunctie` om aan te geven hoe geschikt een toestand is
    - $\approx$ de performantiemaat










---













## Zoekalgoritmes


> samengevat
> ![](https://i.imgur.com/o9CWjne.png)

### Inleiding

Een `zoekprobleem` heeft volgende elementen:
- `toestandsruimte` $S$
- de `initiële toestand` $s_0$
- verzameling acties $A$
- `transitiemodel` $T : (S,A) \rightarrow S : (s,a) \mapsto s'$
    - $s'$ is de `opvolger` van $s$.
    - $T$ vertelt wat het effect is van de actie op de toestand.
    - er is een `kost` mee geassocieerd: kostfunctie $c(s,a,s')$
- Een `doeltest` die checkt of de `doeltoestand` is bereikt (booleaans)

De `toestandsruimtegraaf` (state space graph) kan worden opgesteld met $S$, $T$ en $c$. 
- De knopen zijn de toestanden $s$
- De knopen zijn GERICHT verbonden $s\rightarrow s'$ (dmv $T$)
- De gewichten zijn bepaald door $c$


De oplossing van eeen zoekprobleem:
- is de sequentie van acties om de doeltoestand te bereiken

De kost van een zoekprobleem:
- is de som van de kosten van de acties

De `optimale oplossing` ve zoekprobleem:
- oplossing met minimale kost


### Algemene Zoekalgoritmen
#### Boomgebaseerd Zoeken

De `open lijst`: 
- bevat de leafs van de zoekboom = partiele oplossingen = `plannen`
- bevat initieel enkel $s_0$

We expanderen steeds 1 van de plannen door er de mogelijke acties op uit te voeren. Elk plan slaat volgende data op:

```
Plan{
    - huidigeToestand : Toestand
    - laatstGekozenActie : Actie
    - voorganger : Plan
    - totaleKost : int
}
```
(De totale kost wordt met $g$ genoteerd)

- Met deze implementatie moeten we enkel de leafs opslaan en niet heel de boom.
- $g$ zou recursief berekend kunnen worden in $O(n)$, maar deze bijhouden is handiger.


![](https://i.imgur.com/vvJuXSZ.png)


#### Criteria voor Zoekalgoritmen

1. COMPLEET
    - vindt altijd een oplossing
3. OPTIMAAL
    - vindt altijd optimale oplossing
5. TIJDSCOMPLEXITEIT
    - uitvoeringstijd
7. RUIMTECOMPLEXITEIT
    - benodigd geheugen

maten:
- `vertakkingsfactor` $b$
    - maximaal aantal opvolgers van een top
- diepte van de ondiepste top die ook doeltop is $d$
    - = minimale diepte voor een oplossing
- maximale lengte van een pad $m$
    - = maximale diepte voor een oplossing

Aantal toppen in een zoekboom met vertakkingsfactor $b$ en max.depth. $m$
$$
\text{#toppen} = 1+b+b^2 +\ldots + b^m = \sum_{i=0}^mb = \frac{b^{m+1}-1}{b-1}
$$

dit is dus van grootteorde $\mathcal{O}(b^m)$


:warning: het grote probleem is dat het algoritme niet onthoudt waar het al is geweest, dit is sub-optimaal en kan leiden tot infinite loops.

#### Graafgebaseerd Zoeken
Analoog aan boomgebaseerd, maar met `gesloten lijst`. Deze bevat nu geen plannen maar wel effectief de toestanden!! 

Het algo checkt of een toestant al eerder werd geexpandeerd. Dit fixt de problemen met boomgebaseerd.

![](https://i.imgur.com/FgC7KAm.png)


### Blinde Zoekmethoden
#### Breedte Eerst Zoeken
- met een FIFO: `queue`
- bouwt alle lagen van de zoekboom op
- kan stoppen bij meest ondiepe oplossing!
- dit is een **COMPLEET** algoritme
    - geeft oplossing met min aantal acties
- Het is **niet optimaal**
    - want kleinste aantal acties $\neq$ kleinste kost
    - wel optimaal als alle kosten gelijk!

Tijdscomplexiteit: $\mathcal{O}(b^{d+1})$
Ruimtecomplexiteit: idem

#### Diepte Eerst Zoeken
- met een LIFO: `stack`
- niet ideaal want gaat eerst de langste oplossingen af
- kan in infinite loop gaan
    - **niet compleet**
    - **niet optimaal**

tijdscomplexiteit in worst case: $\mathcal{O}(b^m)$
ruimtecomplexiteit: $\mathcal{O}(b\cdot m)$ <-- dit is lineair! :thumbsup: 

In graafgebaseerd uitvoeren tegen de infinite loops? Dan verliest men het voordeel van de lage ruimtecomplexiteit...


#### Iteratief Verdiepen
gebruikt **`DIEPTE GELIMITEERD ZOEKEN`**

![](https://i.imgur.com/3q5OWJ0.png)
![](https://i.imgur.com/ktxWujt.png)

- lus rond diepte gelimiteerd zoeken 
- steeds diepte verhogen tot doeloplossing wordt gevonden
- combineert **diepte eerst** met een soort breedte-eerst-lagen
- algoritme moet steeds opnieuw beginnen
    - maar dat maakt niet zoveel uit
    - zie hieronder:


Als oplossing op diepte $d$, en we doen iteratief verdiepen, hoeveel werk hebben we dan teveel gedaan?
- we hebben moeten diepte gebaseerd zoeken op dieptes 1 tot d-1 zonder resultaat
- hoeveel toppen zijn dit?
    - $1 + (1+b) + (1+b+b^2) + \ldots +  (1+b+b^2+\ldots + b^{d-1})...$


Aantal toppen gegenereerd bij enkele iteratie met diepte $i$
$N(i) = 1+b+b^2+\ldots + b^i$ dus: 

$$
N(i)= \frac{b^{i+1} -1}{b-1}
$$

Totale aantal toppen van elke iteratie zonder oplossing

$$
\sum_{i=0}^{d-1} N(i) = \ldots \approx \frac{1}{b-1} N(d)\quad \overset{!}{<} N(d)
$$

> ![](https://i.imgur.com/2wjux5E.png)


#### Uniforme Kost Zoeken

= breedte eerst met prioriteits-queue gebaseerd op kost!
= *Cheapest First Search* of *Best First Search*
$\approx$ Dijkstra, maar dan met een doeltop!

kies altijd pad met kleinste **totale** kost om te expanderen.

{%youtube dRMvK76xQJI %}

Tijd en ruimtecomplexiteit is $\mathcal{O}(b^{1+\lfloor C^* /\varepsilon\rfloor})$ met elke kost $\geq \varepsilon$ en $C^*$ de kost van de optimale oplossing.

### Geïnformeerde Zoekmethoden
> $\leftrightarrow$ blinde zoekmethoden


#### Heuristieken
Indicator van de totale kost naar het doel.

$h(s) \in \mathbb{R}^+$ met $s$ een toestand.

- Een `toelaatbare` heuristiek overschat NOOIT; dus
$$h(s) \leq C^*(s)$$ 

     met $C^*(s)$ optimale kost van $s$ naar doeltoestand. 
    Het is duidelijk dat de heuristiek van de doeltoestand dus nul is. $h(g) = 0$

- Een `consistente` heuristiek heeft deze eig ($h(g) = 0$) EN er geldt dat de heuristiek voor een rechtstreeks pad altijd kleiner is dan voor een "omweg", nl.
$$h(s) \leq c(s,a,s') + h(s')
$$
    Waarbij de "omweg" node $s'$ is en de kost van de omweg $c(s,a,s')$


Hier is duidelijk te zien `consistent` $\Rightarrow$ `toelaatbaar`. Maar niet omgekeerd.
Bewijs ook te zien op p.42 vd cursus. :bookmark: 

#### Gulzig Beste Eerst

- Evaluatiefunctie: $f(n)= h(n)$ 
    - Expandeert steeds de node met de *laagste heuristiek*. 
    - Gebruikt geen effectieve kosten. 
- Is **niet optimaal** en **niet compleet**
- $TC$ = $SC$ = in slechtste geval $\mathcal{O}(b^m)$ dus exponentieel :thumbsdown: 

Geen goed algoritme imo.

#### A ∗ Zoekalgoritme

- Evaluatiefunctie: $f(n)= h(n) + g(n)$
    - Expandeert steeds de node met de *laagste \[heuristiek + voorlopige totale kost*\].
- is **compleet** en **optimaal** bij volgende voorwaarden:
    1. boomgebaseerd
        - minstens toelaatbare heuristiek (zie bewijs p50) :bookmark: 
        - kosten > 0 
    2. graafgebaseerd
        - minstens consistente heuristiek :warning: 
        - kosten > 0
- $TC$ = $SC$ = in slechtste geval nog steeds exponentieel, en gebruikt meer geheugen dan greedy BFS. :thumbsdown: 


### Ontwerpen van Heuristieken
#### Gebruik van Vereenvoudigde Problemen
= restricties weghalen, vogelvlucht of manhattan distance gebruiken, ......

#### Patroon Databanken
dit kan een ondergrens bieden voor de heuristiek. Meerder patronen combineren en het maximum nemen geeft nog betere ondergrens.







---







## Zoeken met een Tegenstander
### Inleiding
we beschouwen omgeving:
- competitief multipersoons
- compleet observeerbaar
- discreet 
- deterministisch


##### 2p-zero-sum-game
Veel zelfde elementen als een zoekprobleem:
- toestandsverzameling $S$
- actieverzameling $A$
- transitiemodel $T(s,a)$ met opvolger $s'$
- initiële toestand $s_0$
En ook nog deze:
- `EINDTEST`: booleanse test: spel gedaan of niet gedaan
    - de toestanden waarvoor deze true is zijn `eindtoestanden`
- `opbrengstfunctie`$U$. Hierbij geldt dat de som van $U(s)$ voor alle spelers in de eindtoestand $s$ een constante is! (dus eigenlijk constant-sum-game): $U_{Min}(s) + U_{Max}(s) = C$


### Spelbomen en het Minimax Algoritme

"Max" vs "Min". We noemen de opbrengstfunctie voor Max ($U_{Max}$) gewoon $U$
Max wil $U$ voor zichzelf maximaliseren, Min wil deze minimaliseren.

De `minimax waarde` is recursief:

$$
\text{minimax}(s) = \begin{cases}
U(s) & \text{als } s \text{ een eindtoestand}\\
\max_{a\in A} \text{minimax}(s')&\text{als Max aan zet in toestand } s\\
\min_{a\in A} \text{minimax}(s')&\text{als Min aan zet in toestand } s
\end{cases}
$$

Dit steeds met $s'= T(s,a)$, de opvolger van $s$ via transitiemodel $T$.

**Diepte-eerst** algoritme.


- $SC = \mathcal{O}(b\cdot m) \rightarrow$ lineair:thumbsup:
    - diepte eerst, maar dan waarde opgeslagen per diepe vertakking
- $TC = \mathcal{O}(b^ m) \rightarrow$ exponentieel :thumbsdown: 
    - want genereert wel alle toppen
    
![](https://i.imgur.com/wZ02KY7.png)

### Snoeien van Spelbomen
{%youtube zp3VMe0Jpf8 %}

Snoeien: het niet evalueren van een tak ondat deze de eindoplossing niet beïnvloedt.
=> de kinderen van die tak snoeien.

[andere video](https://www.youtube.com/watch?v=hM2EAvMkhtk)
Interesting: 
- waarom snoeien? Kost dit niet meer tijd dan gewoon minima en maxima berekenen?
    - antwoord 1: een cijfer berekenen voor een eindtoestand betekent vaak veel berekenwerk ( bvb schaken: alle posities, alle mogelijke manieren van schaak, ...)
    - er kunnen immens veel eindtoestanden zijn

![](https://i.imgur.com/w3UT4zN.png)

##### Ordening
Kan groot effect hebben op efficiëntie van snoeien!
Maat voor hoe goed de ordening is: de `effectieve vertakkingsfactor` = $b_e$ 
- een boom met hetzelfde aantal toppen $N$ en zelfde diepte $m$ kan worden gemaakt, maar dan met constante vertakkingsfactor.

dus $N = ( b_e^{m+1} -1 ) / ( b_e -1)$
Een benadering wordt gegeven door:

$$
be\approx N^{1/m} = \sqrt[m]{N}
$$


### Praktische Uitwerking

Voor schaken, dammen, Go.... veeeel te veel toestanden.
- opslaan met minimax waarde in `transpositietabel` is onrealistisch

We hebben een `heuristische evaluatiefunctie` nodig!
- dieptelimiet voor minimax, wanneer diepte bereikt heuristiek gebruiken
- maximale diepte is $d$

$$
\text{h-minimax}(s, d) = \begin{cases}
\text{EVAL}(s) & \text{als } s \text{ een eindtoestand of }d=0\\
\max_{a\in A} \text{h-minimax}(s',d -1)&\text{als Max aan zet in toestand } s\\
\min_{a\in A} \text{h-minimax}(s',d-1)&\text{als Min aan zet in toestand } s
\end{cases}
$$

Dit steeds met $s'= T(s,a)$, de opvolger van $s$ via transitiemodel $T$.


De kwaliteit van de heuristische "EVAL" functie is belangrijk.
1. moet de eindtoestanden op zelfde manier ordenen als opbrengstftie $U$
2. moet snel kunen berekend worden
3. waarde moet sterk gecorreleerd zijn met effectieve winstkansen

De eval functie is een lineaire combinatie van spelfeatures. 

## Lokaal Zoeken en Genetische Algoritmen
![](https://i.imgur.com/hjTK2KN.png)

### Lokale Zoekmethoden

Lokaal zoeken
- houdt zich niet bezig met bijhouden van actiesequentie
    - gebruikt beperkt geheugen
    - goede oplossingen in grote S-ruimten
- wil gewoon de oplossing
- meestal `optimalisatieproblemen`
    - doelfunctie max of minimaliseren (analoog aan LP)



#### Hill Climbing
- neem steeds de beste opvolger als deze beter is dan jezelf
- gulzig algoritme
    - bekijkt in-the-moment wat het beste is
- kan vastlopen 
    - in lokaal maximum zonder globaal maximum te bereiken!
    - in plateau
        - we kunnen zijwaartste stappen toelaten met een aantal-beperking
- is **niet compleet**
- kan worden verbeterd door random herstarten
    - theoretisch wordt het dan compleet
    - in praktijk duurt dit te lang

![](https://i.imgur.com/yvXL7Q3.png)

#### Simulated Annealing

Hill climbing: wandelt enkel naar boven en raakt vast in lokaal max
Random walk: zou te lang duren

Combinatie:
- als oplossing beter is, aanvaard hem (zoals hill climb, `exploit`)
- als oplossing niet beter is, aanvaard hem misschien (zoals random walk, `explore`)
    - gebaseerd op temperatuur ($T\propto 1/t$ met $t$ de verstreken tijd)
    - gebaseerd op de kwaliteit van de opvolger ($\Delta E$, groot als goeie move, klein als slechte move )

Het al dan niet aanvaarde van een slechtere oplossing, hangt in het algo af van de waarschijnlijkheid:
$$p_{\text{aanvaarding}} = e^{\frac{\Delta E}{T}}
$$


vereenvoudigd algo (niet volledig, zi p 87 :bookmark:)
```python
for dalende T: #of voor stijgende tijd en dan T berekenen
    if T == 0 return current               #stop als temp nul is
    next = current.getRandomSuccessor()
    delta_E = h(next) - h(current)         #hoe goed is de move?         
    if delta_E > 0:                        #beter dan wat we hadden
        current = next                     #aanvaard
    else if exp(delta_E / T) > rand(0,1) : #slechter, maar waarsch. beter dan random
        current = next                     #aanvaard
```

#### Gradient Descent

Toestandsruimte continu, afleidbaar en n-dimensionaal.

$$ \vec{x}' = \vec{x} - \alpha \nabla f(\vec x) 
$$

En dus, als het om 2 variabelen $x_1$ en $x_2$ gaat:

$$ (x_1',\, x_2') = \left( \,
    x_1 - \alpha\frac{\partial f}{\partial x_1}\quad,\quad
    x_2 - \alpha\frac{\partial f}{\partial x_2}\,
\right) 
$$


Met $\alpha$ de stapgrootte. Bij elke stap zal $x$ dus dichter bij een lokaal minimum geraken, door de sterkste daling te volgen.

De stapgrootte is belangrijk:
- niet te klein want dan te traag
- niet te groot want dan kans op inf. loop

### Genetische Algoritmen

![](https://i.imgur.com/ZFr4G8I.png)


- klassieke algo's houden hele open lijst bij
- lokale houden enkel huidige toestand bij
We zoeken een compromis => vast aantal toestanden bijhouden.

Genetische algoritmen:
- maximaliseert doelfunctie $h$
- $\leftrightarrow$ lokale: geen notie van opvolgers vereist.
- werken iteratief
    - ![](https://i.imgur.com/R18mrnS.png)
    - wordt uitgevoerd tot voldoende tijd verstreken of voldoende goeie oplossing

#### Populatie en Encodering

Zoals eerder gezegd:  houdt `populatie` bij van vast aantal individuen.
Elk individu `encodeert` een toestand: bij elke toestand een string assosiëren!

#### Fitnessfunctie en Selectiemechanisme
fitness functie $f$ bepaalt hoe goed een volgende generatie is (hoger is beter).
`selectiemechanisme`: de kans op selectie stijgt als fitness hoger is (logisch)

implementatievoorbeelden:
1. `roulette wiel selectie`
    - stuk van "wiel" evenredig aan de fitness
    - kans is dan $f_i / \sum f$ = `fitness ratio`
    - probleem: superfit individu heeft té veel kans
        - algo convergeert te snel
        - blijft snel steken in "lokale maxima"
2. `ranggebaseerde selectie`
    - individuen sorteren STIJGENDE fitness en rangnummer geven
    - de eerste is de slechtste, de laatste de beste
    - de kans op selectie is dan rangnummer / som van rangnummers
        - $p= i / \sum j = \frac{2i}{n(n+1)}$
    - enkel relatieve fitness doet ertoe, dus uitschieters domineren minder :thumbsup: 

#### Recombinatie en Mutatie

recombinatie:
- genetisch materiaal van 2 individuen gebruiken voor 2 nieuwe afstammelingen
- #individuen blijft constant!
1. `éénpunts crossover`
    - op een bepaalde plaats van de string een merge maken 
        - (bv bij 4letter string: eerste 2 van parent 1 en laatste 2 van parent 2)
    - niet nuttig bij bvb trav.salesm.pr. wantdoor random crossoverpunt niet zeker dat alle steden erin staan
2. `geordende crossover`
    - 2 random punten kiezen
        - daartussen ongewijzigd
        - daarbuiten:
            - maak lijst van opties die nog niet aan bod komen
                - in volgerde van ANDERE parent na 2e punt
            - begin in te vullen na 2e punt
            - vul verder aan na eerste punt
    - bvb
        ||1|2|
        |--|--|--|
        | **parents** | `CAGDBEF` | `FBEADCG`| 
        | **crossoverpunten** | `CA\|GD\|BEF` | `FB\|EA\|DCG` |
        | **kinderen** stap 1 | `xx\|GD\|xxx` | `xx\|EA\|xxx` |
        |**nog niet gebruikt**|~~`D`~~,**`C`**,~~G~~,**`F`**,**`B`**,**`E`**,**`A`**| **`B`**,~~`E`~~,**`F`**,**`C`**,~~`A`~~,**`G`**,**`D`**|
        | **kinderen** stap 2 | `xx\|GD\|CFB` | `xx\|EA\|BFC` |
        | **kinderen** finaal | `EA\|GD\|CFB` | `GD\|EA\|BFC` |
        
--- 

Daarna kan nog `mutatie` optreden.
- dit moet met lage probabiliteit gebeuren
- Zorg wel dat de "regels" gerespecteerd blijven 
(bvb bij tsp: wissel 2 steden om ipv random steden te veranderen.)

#### Een Eenvoudige Implementatie
vb
#### Besluit en Toepassingen
Genetische algoritmen:
- niet gegarandeerd optimaal
- kan wel goeie oplossing bekomen
- voorwaarde: goede encodering





---





## Machinaal Leren
### Inleiding
/
### Drie Types van Machinaal Lere
#### Gesuperviseerd Leren

= op basis van een **gelabelde `trainingsdataset`** een `hypothese` functie $h$ opbouwen zodat voor nieuwe invoer het label voorspeld kan worden
    - label = getal : `regressie`
    - label = klasse : `classificatie` (kan binair)
    
![](https://i.imgur.com/AKQ6TdT.png)

#### Ongesuperviseerd Leren
= structuur ontdekken in **ongelabelde dataset**
- clustering
    - groeperen (maar niet interpreteren) van data
- anomaliedetectie
    - abnormaliteiten vinden
- primaire componenten analyse
    - data "uitdunnen" en reduceren tot belangrijkste components
#### Reinforcement Learning
$\approx$ Pavlov: belonen voor goeie acties, zo leert algo welk `beleid` leidt tot de grootste beloning (en dus het best is)



### Evaluatie van Hypothesen voor Gesuperviseerd Leren
#### Foutmaten
##### regressie
- `RMSD` (root mean square deviation $\approx$  gemiddelde kwadratische afwijking) $$RMSD^2 = \frac{1}{m} \sum_{i=1}^m \left( h(x^{(i)}) - y^{(i)}\right)$$
    simpeler genoteerd: $\frac{1}{m} \sum_m (h(x)-y)$
##### classificatie
- `foutratio` (=percentage fout gelabelden)
    $$FR = \frac{1}{m}\cdot \#\{ x^{(i)} \mid h(x^{(i)}) \neq y^{(i)} \}$$

###### Binaire classificatie: 
- `precisie` (= correct positief gelabeld / totaal aantal gelabeld positief )
    $$P= \frac{\#\text{correct}}{\#\text{correct} + \#\text{vals positief}}$$
- `rappel` = `recall` (= correct positief gelabeld / wat effectief positief is)
    $$R= \frac{\#\text{correct}}{\#\text{correct} + \#\text{vals negatief}}$$

Beste classificatie heeft $P = R = 1$
Goede verhouding tussen deze maten: **`F-score`**

$$F = 2\frac{P\cdot R}{P+R} \qquad(\leq 1)
$$

Voor $P$ $R$ en $F$ geldt: hoe groter hoe beter!

#### Trainings-, Validatie- en Testdata

`Testdata` moet volledig los zijn van trainingsdata!
- een hypothese die goed scoort op training maar niet op test = OVERFITTING
- een hypothese is niet algemeen genoeg = ONDERFITTING

`Occams Razor` is van toepassing: when in doubt, choose the easiest model
(mag ook wel niet te eenvoudig zijn voor het probleem...)

`Validatie dataset`: aangezien testdata echt los moet blijven van het trainen:
- set data die gebruikt wordt om meta-parameters te tunen
- foutmaat daalt steeds, tot deze weer stijgt (dan begint overfitting)
- het moment van minimale foutmaat bepaalt de meta-parameters!
    - dit is enkel indicatief voor de parameters
        - dus dit is NIET de finale foutmaat! Hiervoor hebben we de testdataset!!!




---

## Gesuperviseerd Leren
### Lineaire Regressie
#### Probleemstelling

Hypothese van de vorm $$h_{w,b}(\vec x) \equiv h(\vec x) = \vec w \cdot \vec x + b$$
Dit is dus uitgeschreven $w_1x_1 + w_2x_2+  \ldots + w_nx_n + b$ of dus $\sum_i(w_ix_i )+b$

De kostfunctie die moet geminimaliseerd worden definieren we adhv de RMS:
$$J(w,b) = \frac{1}{2m}\sum_m(h(\vec x) - \vec y)^2
$$

Met $m$ het aantal elementen in de testdataset en de factor 1/2 random maar met een of andere reden.

#### Oplossingsmethode

De kostfunctie $J$ zal steeds maar 1 lokaal = globaal minimum hebben! 
We kunnen er dus gradient descent op toepassen!

##### Algoritme voor lineaire regressie
1. kies startwaarden voor $b$ en voor alle $w_i$
2. Kies goede stapgrootte $\alpha$
3. $$w_j' = w_j - \alpha\frac{\partial J}{\partial w_j} \qquad \text{en}\qquad b'= b - \alpha\frac{\partial J}{\partial b}$$
    met $$\frac{\partial J}{\partial w_j} = \frac{1}{m} \sum_m  (h(x) - y) \cdot x_j \qquad \text{en}\qquad \frac{\partial J}{\partial b} = \frac{\alpha}{m} \sum_m (h(x) - y)
    $$
    de onderdelen van $\nabla J(w,b)$
4. herhaal stap 3 tot $|\Delta w| \leq \varepsilon$ en $|\Delta b| \leq \varepsilon$ (ze veranderen nog nauwelijks)
    - dus $\alpha\frac{\partial J}{\partial b}$ en $\alpha\frac{\partial J}{\partial w_j}$ zeer klein

*--> dit is dus gradient descent op $J$*


##### Efficiënte bepaling van de gradiënt
zie cursus p125-127 :bookmark:



#### Polynomiale Attributen
- om evt polynomisch verband te onderzoeken
- cheat the system door gewoon een extra parameter toe te voegen 
    - bvb $x_2 := x_1^2$
- pas daarna lin reg toe en kijk of de kostfunctie lager ligt
- profit(?)


#### Regularisatie ter Preventie van Overfitting

extra term toevoegen om te grote waarden te bestraffen.


$$J(w,b) = \frac{1}{2m}\sum_m(h(\vec x) - \vec y)^2 + \color{orange}{\lambda \sum_n w_j^2}
$$

met $\lambda$ een meta parameter. Bepaald met de validatiedataset.


### Logistische Regressie
=> Voor CLASSIFICATIEPROBLEMEN

##### Binaire classificatie
Lineaire regressie met grens 1/2 is geen goed idee
- te gevoelig voor uitschieters
- lin reg kan waarden opleveren anders dan 0 en 1

De `stapfunctie`:
$$ H(z) = \begin{cases} 0&z<0\\1 &z\geq 0\end{cases}
$$

Deze functie is echter **niet continu**
- dus niet gepast voor gradient descent etc.

De `sigmoïde` of `logistische functie`:
$$g(z) = \frac{1}{1+e^{-z}}
$$
met voor de afgeleide geldt, met $g\equiv g(z)$
$$g' = g \cdot (1-g)
$$

Als de hypothese de sigmoïde volgt, dan geeft de hypothese steeds de kans terug dat een label correct is.


#### De Scheidingslijn
kan rechte, ellips, hyperbool, parabool..... zijn.

Door het toevoegen van attributen!

#### De Kostfunctie

De kost moet 0 zijn als juist, en maximaal voor fout.
- nadeel hiervan is dat de kost niet continu is
- niet goed voor gradient descent

We nemen voor de kost een continue functie met als voorwaarden als het label 1 moet zijn:
- $J(0) = 0$
- $J(>1/2)$ stijgt zeer snel, want hier echt wel fout geclassificeerd
- $J(1) = + \infty$

analoog voor als het label 0 moet zijn.

De $\ln(x)$ functie heeft deze karakteristiek. Dus gecombineerd voor $\color{red}{y=0}$ en $\color{green}{y=1}$:
$$ J(w,b) = - \frac{1}{m} \sum_m \ y\cdot \color{green}{ \ln(h(x))} \  + \  (1-y)\cdot \color{red}{\ln(1-h(x))}
$$


Binaire classificatie gebeurt dus als volgt:
1. minimaliseer $J$ met gradient descent en trainingsdata
    - bekom zo alle parameters $w_i \in \vec w$ en ook de parameter $b$
3. voor testdata, bereken de hypothese $h_{w,b}(\vec x)$. 
    - $h \geq \frac{1}{2}$, label dan als 1
    - $h < \frac{1}{2}$, label dan als 0


#### Niet-binaire Classificatie
##### 1-vs-allen

Zij $k \in \{1,2,\ldots,K\}$ een klasse; het aantal klassen is dus $K$ 

- stel $K$ hypothesen op: $h^{(1)} ... h^{(k)}$
- per hypothese geldt:
    - klasse $k$ is positief voor hypothese $h^{(k)}$
    - de rest van de klassen is negatief
- Kies dan de hypothese $h^{(k)}(x)$ die het meest kans geeft dat een $x$ tot een $k$ , die $k$ wordt het label $y$.

$$y = \arg \max_{k\in \scriptsize{\{1,2,\ldots,K\}}} h^{(k)} (x)
$$
waarbij de $\arg$ functie ervoor zorgt dat het een $k$ is die wordt toegewezen aan $y$ bij maximale $h^{(k)}(x)$


##### 1v1

Zij $k \in \{1,2,\ldots,K\}$ een klasse; het aantal klassen is dus $K$ 

- stel hypothesen $h^{(k,l)}$ op
    - met $l\in \left]\, k,K\,\right]$
    - er zijn dus $\frac{1}{2} K(K-1)$ hypothesen
- per hypothese geldt:
    - klasse $k$ is positief voor hypothese $h^{(k,l)}$
    - klasse $l$ is negatief voor hypothese $h^{(k,l)}$
- overloop alle hypothesen, en tel het aantal "stemmen"
    - als $h^{(k,l)} \geq 1/2$ dan is dit stem voor positief dus $k$
    - als $h^{(k,l)} \lt 1/2$ is er stem voor negatief dus $l$


### Artificiële Neurale Netwerken
#### Inleiding
![](https://i.imgur.com/NDbIlRh.png)

- voorwaarts gericht = acyclisch!
    - uitvoer is functie van de invoer
- recurrent bevat wel cykels
    - feedback loops
    - bereikt een van volgende toestanden
        - 	stationair
        - 	oscillatie 
        - 	chaos
    - 	uitvoer is functie van invoer **en** vorige invoeren
        - 	$\sim$ "kortetermijngeheugen"
    - 	moeilijker te trainen dus buiten scope van de cursus.



#### Gelaagde Voorwaarts Gerichte Neurale Netwerken

```mermaid
flowchart LR
subgraph sub [verborgen lagen]
B(...) --> C(...)
end
A(Invoerlaag)--> B
C -->D(uitvoerlaag)
```

Meestal evenveel neuronen in de uitvoerlaag als er klassen zijn.

$$z_i = w_ix + b_i \quad \text{en} \quad a_1 = g(z_1)
$$
met $g$ de implementatie van een `activatiefunctie` (meestal de sigmoide $\frac{1}{1+e^{-z}}$)

Door eigenschappen van het matrixproduct (:bookmark: 150-151) kunnen we veralgemenen:

$$\vec z = \boldsymbol{W}\cdot \vec x + \vec b \quad \text{en} \quad \vec a = g(\vec z)
$$

**`voorwaartse propagatie`** is het laag per laag berekenen van de uiteindelijke uitvoerlaag $L$

$$z^{[l]} = \boldsymbol{W^{[l]}}\cdot \vec a^{[l-1]} + \vec b^{[l]} \quad \text{en} \quad \vec a^{[l]} = g(\vec z^{[l]})
$$
voor $l \in \{1,2 \ldots, L\}$ en $\vec a^{[0]} \equiv \vec x$

#### Vectorisatie

De vorige formule kan in een loop over alle voorbeelden worden uitgevoerd, of we maken een matrix $X$ van alle kolommen $\vec x_i$

Uiteindelijk komen we dan bij:

$$\boldsymbol{Z}^{[l]} = \boldsymbol{W^{[l]}}\cdot \boldsymbol{A}^{[l-1]} + \vec b^{[l]} \quad \text{en} \quad \boldsymbol{A}^{[l]} = g(\boldsymbol{Z}^{[l]})
$$
voor $l \in \{1,2 \ldots, L\}$ en $\vec A^{[0]} \equiv \boldsymbol{X} = (\vec x^{(1)}, \ldots , \vec x^{(m)})$

:warning: de eerste formule bevat wiskundig een "foute" notatie, aangezien je geen kolomvector kan optellen bij een n-dimensionaal matrixproduct. We gaan er echter van uit dat er `broadcasting` is; i.e. kolomgewijs optellen.


#### Trainen van een Neuraal Netwerk

Minimaliseren van een kostfunctie.
We volgen voorbeeld van logistische regressie.

> De labels $y^{(i)}$ zijn gedefinieerd adhv de `one-hot-encoding`: een vector vol nullen die op de $k^{de}$ plaats een 1 heeft als voorbeeld $i$ van de klasse $k$ is.

- de **`cross-entropy kostfunctie`**

    Stel $K$ klassen en $m$ trainingsvoorbeelden.
    ![](https://i.imgur.com/ZH7YNNQ.png)
    waarbij $h(^{(i)})_k$ de k-de component is van de $h$ vector voor voorbeeld $x^{(i)}$


We kunnen aanpassingsmatrices en -vectoren opstellen:

$$\begin{cases}
dz^{[L]} = a^{[L]} - y & L \text{ is de eindlaag}\\
dz^{[l]} = (W^{[l+1]})^T \, dz^{[l+1]} \, \odot \, g'^{[l]} (z^{[l]}) & l \in \{L-1, \ldots, 1\}\\
dW^{[l]} = dz^{[l]}a^{[l-1]} & "\\
db^{[l]} = dz^{[l]}& "
\end{cases}
$$

met $\odot$ de puntsgewijze vermenigv; en zoals voorheen: $g' = g \cdot (1-g)$


Gradient descent geeft dan:
$$\begin{cases}
W'^{[l]} = W^{[l]} - \alpha dW^{[l]}\\
b'^{[l]} = b^{[l]} - \alpha db^{[l]}
\end{cases}
$$


- **`Stochastische gradient descent`**
    - 1 enkel voorbeeld gebruiken om gewichten te tunen
    - hoe?
        0. initialiseer gewichten op random, kies een $\alpha$, shuffle voorbeelden
        > for voorbeeld in voorbeelden
        1. bereken actievaties $a^{[l]}$ en $z^{[l]}$ met voorwaartse propagatie ($l \in \{1,2,\ldots, L\}$)
        2. Bereken aanpassingsmatrices $dW$ en -vectoren $db$ met achterwaartse propagatie ($l \in \{L, L-1, \ldots, 1\}$)
        3. Pas de gewichten aan volgens gradient descent: $$
            \begin{cases}
            W'^{[l]} = W^{[l]} - \alpha dW^{[l]}\\
            b'^{[l]} = b^{[l]} - \alpha db^{[l]}
            \end{cases}$$


Stochastische GD voor klein aantal voorbeelden ipv maar 1: `mini-batch gradient descent` (kan door vectorisatie ongeveer even snel)


#### Uitbreidingen en Variatie

##### Andere activatiefuncties:
- `tangens hyperbolicus`
$$
\tanh(x) = \frac{e^z - e^{-z}}{e^z + e^{-z}}
$$

- `Rectified linear unit`
$$
\text{ReLU}(x) = \max(0,z)
$$
- **`Softmax functie`** (vaak gebruikt)
$$
\sigma(\vec z)_i = \frac{e^{z_i}}{\sum_{j=1}^L e^{z_j}}
$$

##### Convolutionele lagen
= CNN (conv. neur. net.)

`convolutie` is operatie die een filter over de invoer plaatst.
- geeft nieuw beeld met 1 kanaal
- gebruikt bvb bij veel voorkomende patronen

---


## Ongesuperviseerd Leren
### Clustering en het K-Gemiddelden Algoritme
**`het K-Gemiddelden Algoritme`**
- voor het vinden van clusters
- invoer is ongelabelde dataset en aantal clusters te vinden $K$
- cluster voorgesteld adhv `zwaartepunt` 
    - $\mu = \frac{1}{m} \sum_{i=1}^{m} \vec x_i$ aka zoals het "gemiddelde"

stappen: 
0. random toewijzen van de $K$ zwaartepunten $\mu^{(k)}$ met $k \in \{1, \ldots ,K\}$ 
> for toestand $i$ in $m$ toestanden
1. toewijzing
    - bereken $\forall x^{(i)}$ tot welke cluster $k$ het hoort
    - dus welke afstand tot een zwaartepunt $\mu^{(k)}$ het dichtst is $||x^{(i)}-\mu^{(k)}|| = \sqrt{(\sum_j x^{(i)}_j - \mu^{(k)}_j)^2}$
2. update zwaartepunt
    - nieuwe zwaartpunt berekenen door toevoegen van deze

blijf de for loop herhalen tot de toegewezen zwaartepunten niet meer veranderen
#### Het K-Gemiddelden Algoritme als Optimalisatie

- De kostfunctie is 

    $$
        J = \frac{1}{m} \sum_{i=1}{m} ||x^{(i)} - \mu^{(c^{(i)})}||^2 
    $$

    als $c^{(i)}$ de index is van de cluster van $x^{(i)}$


- het K-means algo kan vastgeraken in lokaal minimum. Random restart kan helpen.

#### Bepalen van het Aantal Clusters

Soms is het duidelijk, soms met de elleboogmethode:
- kostfunctie opstellen voor oplopende $K$
- knik in J(K) grafiek zoeken -> dit is het beste aantal















 <!--
MARKMAP

# Zoekalgoritmen
##
### Boomgebaseerd
### Graafgebaseerd
##
### Blind
#### Diepte-eerst
#### Breedte-eerst
#### Iteratief verdiepen
#### Uniforme kost (= cheapest-first)
### Geïnformeerd
#### Gulzig beste-eerst
#### A*
## Competitief
### Minimax (evt. snoeien)
### Heuristische minimax
## Lokaal
### Hill climbing
### Gradient descent
### (Random walk)
### Simulated annealing
## Genetisch
### Selectie
#### Roulette wheel
#### Ranggebaseerd
### Recombinatie
#### Eénpunts crossover
#### Geordende crossover
### Mutatie


# Machine learning
## Gesuperviseerd
### Regressie
#### Lineaire regressie
#### Lineaire regressie met polynomiale attr.
### Classificatie
#### Logistische regressie
##### Binair
##### Niet-binair 1-vs-allen
##### Niet-binair 1v1
#### Neurale netwerken
##### Voorwaarts gericht
###### Stochastische gradient descent
###### Mini-batch gradient descent
##### (Recurrent)
## Ongesuperviseerd
### Clustering
#### K-means
### (Anomaliedetectie)
### (Primaire componenten analyse)
## (Reinforcement learning)

-->













<style>
body {
    counter-reset: h2
}

h2 {
    counter-reset: h3
}

h3 {
    counter-reset: h4
}

h4 {
    counter-reset: h5
}

h2:before {
    counter-increment: h2;
    content: counter(h2) ". "
}

h3:before {
    counter-increment: h3;
    content: counter(h2) "." counter(h3) ". "
}

h4:before {
    counter-increment: h4;
    content: counter(h2) "." counter(h3) "." counter(h4) ". "
}

h5:before {
    counter-increment: h5;
    content: "> ";
}
</style>