# Entscheidungsbäume

Alice beobachtet die Tennisspieler auf dem Tennisplatz vor ihrem Haus. Sie möchte herausfinden, wie die Spieler entscheiden, bei welchem Wetter die Spieler Tennis spielen und wann nicht. Sie macht die folgenden Beobachtungen:




Erstellen Sie einen Entscheidungsbaum auf Basis dieser Trainingsdaten. Notieren Sie an jedem Knoten die Anzahl der yes- und no-Instanzen. Benutzen Sie die Informationsentropie als Maß für Knotenreinheit. 

# K-Nearest-Neighbor-Klassifikator

Betrachten sie folgende Teilmenge des Iris-Datensatzes:



| Sepal.Length        | Sepal.Width   | Petal.Length |   Petal.Width |    Species|
| ------------- |-------------| -----|------|------|
|           5.1 |        3.5   |       1.4  |       0.2  |   setosa
|           4.9 |       3.0   |       1.4    |     0.2  |   setosa
|           7.0 |        3.2  |        4.7   |      1.4 | versicolor
|           6.4 |        3.2  |        4.5   |      1.5 | versicolor

Klassifizieren Sie das Sample 

|           6.9 |        3.0  |        3.5   |      1 |
|-|-|-|-|

mit einem k-nearest-Neighbor-Klassifikator. Verwenden Sie k=1 und die euklidische Distanz. 

# Kerndichteschätzung
In der Vorlesung haben Sie Kerndichteschätzer als eine nichtparametrische Methode zum Darstellen einer Verteilung kennen gelernt. Dabei wird eine Verteilung an einem Punkt $t$ wie folgt dargestellt: 
\begin{equation}
p(t) = \frac{1}{n \, h} \sum_{i=1}^n \varphi\left(\frac{t-x_i}{h}\right)
\end{equation}
Hierbei ist $\varphi$ eine Fenster-Funktion, z.B. das Gauß-Fenster
\begin{equation}
\varphi(u) = \frac{1}{\sqrt{2\pi}} e^{-u^2/2}
\end{equation}
## Aufgabe 1
Implementieren Sie die Funktion `kde(t,h,x)`, die für einen Punkt $t$, eine Fenster-Breite $h$ und ein Array von Trainings-Pukten $x$, die Kerndichteschätzung für $p(t)$ berechnet.


```python
import math
import numpy as np
import matplotlib.pyplot as plt

def kde(t,h,x):
    #TODO
    return None

def k1(t):
    return 1/math.sqrt(2*math.pi) * math.exp(-1/2 * t**2)

example = np.concatenate((np.random.normal(0,1,100),np.random.normal(5,1,100)))

dens = [kde(t,0.5,example) for t in np.arange(-2,8,0.05)]

plt.plot(dens)
```

## Aufgabe 2
Implementieren Sie die Funktion `classify_kde(xnew,x,classes)`, die eine Klassifikation mit dem Kerndichteschätzer durchführt. Das bedeutet, es handelt sich um einen Bayes-Klassifikator, bei dem die Likelihood mit dem Kerndichteschätzer geschätzt wird.


```python
import pandas as pd
from scipy.io import arff

def classify_kde(xnew,x,classes):
    #TODO
    return None

data = arff.loadarff('features1.arff')
df = pd.DataFrame(data[0])
feat = df["AccX_mean"]
cl = df["class"]

p = [classify_kde(x,feat,cl) for x in feat]
np.mean(p == cl)
```

096a43efe076eb1af87aa754c3eaf94665f43ae3
ipynb
Jupyter Notebook
05-Weitere-Klassifikatoren.ipynb
stefanluedtke/AI-II-Exercises
a1e816375c58f52609c3f7683b17a35fed64bc1d
MIT
05-Weitere-Klassifikatoren.ipynb
stefanluedtke/AI-II-Exercises
a1e816375c58f52609c3f7683b17a35fed64bc1d
MIT
05-Weitere-Klassifikatoren.ipynb
stefanluedtke/AI-II-Exercises
a1e816375c58f52609c3f7683b17a35fed64bc1d
MIT
Qwen/Qwen-72B
1. YES
2. YES

