Python Spick

Ich werde diesen Beitrag jeweils erweitern, wenn ich eine neue Funktion von Python verwende.

for Schleifen

In Python ist die for-Schleife ein wenig anders als in Java oder C++. In Python dient die for-Schleife zur Iteration über ein Sequenz von Objekten.

Beispiel
tiere = ["Affe", "Elefant", "Giraffe", "Schlängli"]
for x in tiere:
    print x

Besonders praktisch ist die „range“ Funktion in Verbindung mit einer for Schleife. Die folgende Schleife gibt etwa alle Zahlen von 0 bis 10 aus:

n = 10
for i in range(1, n+1):
    print i

Ganz hübsch isch die for Schleife mit dem Unterstrich:

for _ in range(10):
    print("geheimen Code")

Die range Funktion erzeugt bekannterweise ganze Zahlen als Integer beginnend bei Null:

range(3) == [0, 1, 2].

Nun möchte man den geheimen Code 10 mal ausgeben, benötigt aber keine Laufvariable. Dafür wird in Python oft „_“ verwendet – Quasi eine Wegwerfvariable, die nicht in der eigentlichen for-Schleife verwendet wird.

Die Zip Funktion

Die zip() Funktion gibt eine Liste von Tupeln zurück, wobei der i-te Tupel jeweils das i-te Element von jedem Argument enthält.

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
Resultat: zipped = [(1, 4), (2, 5), (3, 6)]

Python Objektorientierung

Eine Klasse in Python wird einfach mit „class“ erstellt.

Man sollte sich nicht von dem „self“ verwirren lassen: Der erste Parameter einer Methode ist immer eine Referenz self auf die Instanz, von der sie aufgerufen wird.
Der Parameter self erscheint nur bei der Definition einer Methode. Beim Aufruf wird er nicht angegeben, dort hat es also immer einen Parameter weniger.

#file tierfile.py
class Tier(object):
    def __init__(self, anzahlFuesse=4):
        self.anzahlFuesse = anzahlFuesse
 
    def machWas(self):
        print("Hallo ich bin ein Tier")

Ein Tier erstellt man dann folgendmassen. Kein new, keine Typisierung, gar nichts deshalb vorsicht!

import tierfile 
huhn = tierfile.Tier(anzahlFuesse=2)

ML: Was kann die Python Bibliothek NumPy?

Die Python Bibliothek ist besonders im Zuge von Machine Learning interessant. Der Hauptzweck der Bibliothek sind multidimensionalle Arrays – Also Matrizen.

Ein gutes Tutorial findet sich hier: http://scipy.github.io/old-wiki/pages/Tentative_NumPy_Tutorial

Ich werde diesen Beitrag jeweils erweitern, wenn ich eine neue Funktion der Bibliothek verwende.

Von Achsen, Dimensionen und Rängen

Bei NumPy wird eine Dimension oder ein Wert als Achse (axe) bezeichnet. Die Nummer der Achsen heisst Rang (rank).

Ein einfacher Array [1, 2, 1] hat also den Rang 1 und die Achse hat eine Länge von 3. Ein zweidimensionaler Array hat den Rang 2. Die erste Dimension hat eine Länge von 2 und die zweite Dimension eine Länge von 3 – Man geht also quasi von aussen nach innen.

[[ 1., 0., 0.],[ 0., 1., 2.]]

Zugreifen auf einen Index

Grundsätzlich ist das Verhalten gleich wie bei Python Listen. Um auf einen bestimmten Index zuzugreifen verwendet man die eckigen Klammern [ ].

Bei zweidimensionalen Arrays ist der erste Index die Zeilennummer und der zweite Index die Spaltennummer. Um etwa auf das Element der vierten Zeile und der dritten Spalte zuzugreifen macht man

X[3, 2]

Nicht vergessen, dass der Index bei 0 anfängt.

Importieren der Bibliothek

Um NumPy zu verwenden importiert man diese und kann auf Wunsch gleich noch ein Kürzel angeben.

import numpy as np

Erstellen eines leeren Arrays mit np.zeros

Mit np.zeros kann ein leerer Array erstellt werden.

Beispiel:
numpy.zeros(3) ergibt einen einfachen Array ([ 0., 0., 0.])

Daten erhalten mit mit np.where

Beim Befehl np.where kann man eine Kondition mitgeben und erhält als Resultat die Daten des Arrays, die der Kondition entsprechen.

Format: where(condition[, x, y])

Wenn die Kondition wahr ist, gib x zurück, ansonsten y. x und y müssen dabei dasselbe Format haben wie die Kondition (array-like oder Boolean).

Moment, das muss ich anders schreiben: Es kann im Resultat gleichzeitig Werte von x und y haben. Wenn ein einzelnes Element des Arrays der Kondition entspricht, wird sie von x genommen, ansonsten von y.

Beispiel:
x[np.where( x > 3.0 )]
Resultat: array([ 4., 5., 6., 7., 8.])
 
Beispiel 2:
np.where([[True, False], [True, True]],
[[1, 2], [3, 4]],
[[9, 8], [7, 6]])
 
Resultat: array([[1, 8],[3, 4]])

„True“ heisst hier quasi „Nimm den Wert an dieser Stelle von x“ und „False“ heisst „Nimm den Wert an dieser Stelle von y“.

Skalarprodukt zweier Zahlen mit np.dot

Um das Skalarprodukt zweier Zahlen oder das Matrixprodukt von Arrays zu erhalten verwendet man np.dot.

Beispiel:
np.dot(3, 4)
Resultat: 12
 
Beispiel 2:
a = [[1, 0], [0, 1]]
b = [[4, 1], [2, 2]]
np.dot(a, b)
 
Resultat: array([[4, 1],[2, 2]])

Was sind Machine Learning und Deep Learning?

Immer wieder hört man die gleichen drei Begriffe: Künstliche Intelligenz, Machine Learning und Deep Learning. Sie haben sicherlich schon gehört, dass der Südkoreanische Master im Spiel Go von Google’s Programm AlphaGo geschlagen wurde. Was hat das aber mit diesen Begriffen zu tun?

Künstliche Intelligenz besser als der Mensch?

Künstliche Intelligenz ist die Grundidee hinter allem und schon relativ alt. Das kann man sich auch noch gut vorstellen: Da ist halt irgendeine Maschine, die die Funktion übernimmt. Zum Beispiel bei einem Strategiespiel wie Starcraft 2, wo die Gegner vom Computer gesteuert werden können.

Die Anfänge der künstlichen Intelligenz kommt aus der Idee, dass Maschinen bestimmte Aufgaben besser machen können als Menschen – Was auch gut ist. Man stelle sich die Objekte vor, die heute per Fliessband generiert werden. Das wäre ohne Maschinen so nicht möglich. Dazu kommt, dass eine Maschine tausend identische Streichhölzer erstellen kann, während beim Menschen wohl keine zwei gleich wären. Dies nennt man begrenzte Künstliche Intelligenz oder Narrow AI auf Englisch.

Für Starcraft 2 gilt das übrigens noch nicht: Profis spielen das Spiel immer noch viel besser, als es der Computer könnte. Darum müssen die Entwickler dem Computer oftmals eine Hilfe geben, um gegen den Menschen eine Chance zu haben: Etwa mehr Ressourcen oder die Sicht auf die ganze Karte, statt nur auf den bereits aufgedeckten Bereich.

Machine Learning

Machine Learning ist, einfach gesagt, der Vorgang, wenn eine Maschine die Instruktionen nicht Schritt für Schritt von einem Menschen einprogrammiert bekommt, sondern diese Schritte mittels Algorithmen und der Analyse von Daten herleitet beziehungsweise lernt. Eine wichtige Funktion, die das Machine Learning dabei vornimmt, ist das Klassifizieren – Bei Tieren kann man etwa klassifizieren, ob ein Eingabeobjekt ein Elefant oder eine Giraffe ist.

Hat man etwa eine Menge von Daten über Tiere kann man sein Machine Learning Modell auf zum Beispiel 75% der Daten ansetzen, um die korrekte Klassifizierung zu lernen. Ist ein genügend hoher Schwellenwert erreicht, kann man das fertige Modell auf die restlichen 25% der Daten loslassen. Auf diese Weise kann man feststellen, ob das Modell die Daten korrekt klassiziert und alle Elefanten erkennt.

Wer auf geniale Art und Weise Machine Learning in Aktion sehen will, dem sei dringendst dieses Video über MarI/O zu empfehlen: MarI/O – Machine Learning for Video Games

Aber auch hier gilt: Eine Maschine kommt nicht annähernd an die Fähigkeit eines durchschnittlichen Menschen heran.

Was ist nun Deep Learning?

Nun, künstliche Intelligenz ist also quasi der oberste Begriff für das ganze Thema. Machine Learning ist ein Teil der künstlichen Intelligenz – Und Deep Learning wiederum ist ein noch kleinerer Teil dieses Ganzen. Aber was ist nun Deep Learning?

Um diese Frage zu beantworten, muss ich zuerst noch einen weiteren Begriff hervorbringen: Neurale Netzwerke. Diese sind Teil der sogenannten Neuroinformatik und haben das Ziel, die Funktionsweise des Gehirns abzubilden – Wie also die Nervenzellen im Gehirn miteinander verbunden sind (Gemäss Wikipedia ist Deep Learning nur ein neuer Begriff für künstliche neuronale Netzwerke).

Bei Deep Learning geht es um eben diese neuralen Verknüpfungen. Dabei wird ein Problem in verschiedene Schichten (Layers) geteilt und dann Schicht für Schicht bearbeitet.

Ein Beispiel wäre die Gesichtserkennung einer Kamera. Als Input hat man das Bild, dass die Kamera von einer Person aufnimmt. Dieses Bild wird nun in verschiedene Schichten geteilt und die erste Schicht fängt an, ihre Aufgaben durchzuführen. Ist die erste Schicht fertig, gibt sie das Resultat an die zweite Schicht weiter, welche ihrerseits ihre Aufgabe erfüllt. So geht es dann weiter bis schlussendlich die letzte Schicht das gewünschte Resultat ausspuckt – In diesem Fall also, ob es sich um ein Gesicht handelt, oder doch nur um einen hautfarbenen Ballon.

Uhm… was ist ein Neuron schon wieder?

Ein Neuron ist das grundlegendste Element des Nervensystems. Es erhält Informationen über elektrische Signale, verarbeitet diese und schickt sie weiter. Wenn man etwa die Hand an der heissen Herdplatte verbrennt, entsteht eine Information, welche an das Gehirn weitergeleitet wird.

Ein neurales Netzwerk ist also ein Netzwerk voller Neuronen, welche miteinander verbunden sind und Informationen verarbeiten. Dabei können zwischen den Neuronen neue Verbindungen entstehen oder aufgelöst werden.

Gewicht ist für einmal etwas Gutes

Für Deep Learning kann man sich also ein technisch realisiertes Netz von Knoten oder Neuronen vorstellen, die irgendwie miteinander verbunden sind oder verbunden werden müssen.

Um diese Verbindungen herzustellen muss die Maschine tatsächlich lernen wie ein kleines Kind. Am Anfang ist es dumm und kann nichts. Dann probiert die Maschine, mal nach links und mal nach rechts zu gehen. Das Resultat wird dann mit einem Gewicht versehen – Je höher das Gewicht, desto besser ist diese Verbindung. Das Endresultat wird dann beeinflusst von der Summe der Gewichte.

MarI/O ist tatsächlich ein geniales Beispiel

Haben Sie immer noch Mühe, sich das Ganze vorzustellen? Dann schauen Sie das Video über Super Mario, welches ich weiter oben verlinkt habe. Dort sieht man im oberen Bereich alle Verbindungen, die das Programm bereits aufgebaut hat.

In der Mitte des Videos werden alle Verbindungen gelöscht. Mario ist also dumm wie ein Stein und weiss nicht einmal, dass er nach rechts laufen muss. Das Programm probiert verschiedene Dinge aus, aber sobald Mario zu lange an einem Ort stehenbleibt, startet das Level neu.

Es braucht einige Zeit, bis Mario kapiert, dass er nach rechts laufen muss. Und dass er bei einem gegnerischen Projektil hüpfen muss. Und dass er nicht in ein Loch springen sollte. Diese Verknüpfungen muss die Maschine alle lernen.

In diesem Beispiel sieht man ebenso das Gewicht sehr gut: Das Gewicht ist einfach die Strecke, die Mario nach rechts zurücklegen konnte. Wenn sich die Maschine zwischen zwei Verknüpfungen entscheiden muss, nimmt es diese mit dem weiteren Weg.

So geht das etliche Iterationen weiter, über mehrere Generationen, bis irgendwann die Maschine gelernt hat, wie sie das Level zu Ende spielen kann, ohne zu sterben.

Wo kommt Deep Learning zum Einsatz?

Deep Learning kann man bei verschiedenen Themen beobachten: Autos, die ohne Fahrer rumkurven oder die Filme, die mir Amazon auf der Homepage empfiehlt. Oder natürlich die Spracherkennungen Siri und von Google.