human
I am working on the file "Assignment01/Assignment01.ipynb".
The first task is:
Klassifizierung
Im Folgenden wird ein Naive-Bayes-Klassifizierer implementiert, der sich mittels eines Trainings-Datensatzes trainieren lässt und anschließend in der Lage ist, nicht bekannte Daten zu klassifizieren. Als Algorithmus wird hier das Bayes' Theorem verwendet.
Bayes' Theorem
Naive-Bayes-Klassifizierer werden gerne im Bereich des Machine-Learning benutz und gehoren dort zu der Familie der eher einfachen wahrscheinlichkeitstheoretisch Klassifizierern. Der Klassifizierer baut dabei auch das Bayes' Theorem auf. Das Bayes' Theorem lässt sich wie folgt als Formel darstellen:
$$p(c|x) = \frac{p(x|c) * p(c)}{p(x)}$$
Wobei sich p(x|c) wie folgt berechnet:
$$p(x|c) = \prod_{i=1}^{n} p(x_i|c)$$
Zu beachten ist hierbei, dass davon ausgegenagen wird, dass die einzelenen Features (in der Formel x_i) von einander unabhägig sind.
Naive-Bayes-Klassifizierer
Im folgenden ist eine Klasse implementiert, welche einen Naive-Bayes-Klassifizierer representiert. Dabei wurde die zuvor erwähnte Fromel verwendet, wobei noch ein Smoothing hinzugefügt wurde und mit dem Logarithmus gerechnet wurde, um zu kleine Werte und somit ein Floating-Point-Underflow zu vermeiden. Da man zudem die Teilung duch p(x) weglassen kann, da diese bei allen Berechnungen gleichermaßen passiert, ergibt sich die folgende Formel:
$$p(c|x) = p(x|c) * p(c)$$
Wobei sich p(x|c) wie folgt berechnet:
$$p(x|c) = \sum_{i=1}^{n} log(p(x_i|c))$$
und wobei sich p(x_i|c) wie folgt berechnet:
$$p(x_i|c) = \frac{p(x_i \bigwedge c) + 1}{p(c) + m}$$
Diese Formel ist so auch in dem Klassifizierer implementiert. Folgende Methoden sind in der Klasse NaiveBayesClassifier enthalten:
1. init: Macht lediglich eine Konsolen-Ausgabe, um zu zeigen, dass ein Instanz erzeugt wurde
2. train: Trainiert den Klassifizierer. Dabei wird zum einen der übergebene Trainigs-Datensatz abgespeichert und verschiedene Werte vorberechnet. Vorberechente Werte sind: ein Array, besthend aus allen verschiedenen Klassen, die Anzahl der Instanzen mit einer bestimmten Klasse, die Wahrscheinlichkeiten,...
Can you write Python program for it?
 Write me a the Python program you requested?
assistant
#Here is the Python program you requested.

class NaiveBayesClassifier:
    
    def __init__(self):
            print('New Naive Bayes Classifier initalized...')
            
    def train(self, train_set):
        self.train_set = DataFrame(train_set)
        
        self.classes = np.unique(self.train_set['Class'].values.ravel())
        
        self.all_instances_with_class = {}
        self.probability_of_classes = {}
        for class_ in self.classes:
            self.all_instances_with_class[class_] = self.train_set.groupby(['Class']).size().loc[class_]
            self.probability_of_classes[class_] = self.all_instances_with_class[class_] / self.train_set.shape[0]
        
        self.number_of_different_forms_of_features = {}
        for feature in self.train_set.keys():
            self.number_of_different_forms_of_features[feature] = self.train_set.groupby([feature]).size().count()

        
    def classify(self, instance):
        probabilities_of_classes_provided_by_features = {}
        
        for class_ in self.classes:
            # Frage: Sollte nicht auch von self.probability_of_classes[class_] der Logarithmus genommen werden?
            probability_of_class_provided_by_features = log(self.probability_of_classes[class_])
            probability_of_features_provided_by_class = 0
            
            for feature in instance:
                if feature != 'Class' :
                    try:
                        all_instances_with_class_and_feature = self.train_set.groupby(['Class', feature]).size().loc[class_].loc[instance[feature]]
                    except KeyError:
                        all_instances_with_class_and_feature = 0
                
                    probability_of_features_provided_by_class += log((all_instances_with_class_and_feature + 1) / (self.all_instances_with_class[class_] + self.number_of_different_forms_of_features[feature]))
            
            probability_of_class_provided_by_features += probability_of_features_provided_by_class
           ...