6. Unterrichtsblock

Python Listen

meineListe = ["Apfel", "Zwetschge", "Birne"]

Listen werden verwendet, um mehrere Elemente in einer einzigen Variablen zu speichern.

Listen sind einer von 4 integrierten Datentypen in Python, die zum Speichern von Datensammlungen verwendet werden, die anderen 3 sind Tuple , Set und Dictionary , alle mit unterschiedlichen Qualitäten und Verwendungszwecken.

Im vorherigen 5. Unterrichtsblock haben wir folgende Methoden kennengelernt:

  • Zugriff auf Listen
  • Änderung von Werten
  • Hinzufügen von Werten

Aufgabe

Gehe die Lektionen der vorherigen Unterrichtsstunde durch und wiederhole die Übungen.

Entfernen von Listenelementen

Angegebenes Element entfernen

Die remove()Methode entfernt das angegebene Element.

„Birne“ entfernen:

meineListe = ["Apfel", "Zwetschge", "Birne"]
meineListe.remove("Birne")
print(meineListe)

Angegebenen Index entfernen

Die pop()Methode entfernt den angegebenen Index.

# Entferne das zweite Element:
meineListe = ["Apfel", "Zwetschge", "Birne"]
meineListe.pop(1)
print(meineListe)

Wenn man den Index bei pop() nicht angibt, entfernt die Methode das letzte Element.

meineListe = ["Apfel", "Zwetschge", "Birne"]
meineListe.pop()
print(meineListe)

Das del Schlüsselwort entfernt ebenfalls den angegebenen Index:

meineListe = ["Apfel", "Zwetschge", "Birne"]
del meineListe[0]
print(meineListe)

Das del Schlüsselwort kann die Liste auch komplett löschen.

meineListe = ["Apfel", "Zwetschge", "Birne"]
del meineListe

Leeren einer Liste

Die clear()Methode leert die Liste. Die Liste bleibt bestehen, hat aber keinen Inhalt.

meineListe = ["Apfel", "Zwetschge", "Birne"]
meineListe.clear()
print(meineListe)

Aufgabe

Baue die o.g. Codebeispiele nach und probiere verschiedene Varianten und Abfolgen.

Schleifen durch eine Liste laufen lassen

Man kann die Listenelemente mit einer for Schleife durchlaufen:

Folgendes Beispiel gibt alle Elemente in der Liste einzeln aus:

meineListe = ["Apfel", "Zwetschge", "Birne"]
for x in meineListe:
  print(x)

Durchlaufen von Indexnummern

Man kann die Listenelemente auch durchlaufen, indem man auf ihre Indexnummer verweist. Hierzu verwendet man die Funktionen range()und len(), um eine geeignete Iterable zu erstellen.

Folgende Beispiel gibt alle Artikel anhand ihrer Indexnummer aus:

meineListe = ["Apfel", "Zwetschge", "Birne"]
for i in range(len(meineListe)):
  print(meineListe[i])

Die im obigen Beispiel erstellte Iterable ist [0, 1, 2].

Verwendung einer While-Schleife

Man kann die Listenelemente auch mit einer while Schleife durchlaufen .

Man verwendet hierfür die len()Funktion, um die Länge der Liste zu bestimmen, beginnt dann bei 0 und durchläuft die Listenelemente, indem man sich auf ihre Indizes bezieht.

Hierbei muss man den Index nach jeder Iteration um 1 erhöhen.

Folgendes Beispiel druckt alle Artikel, indem eine while Schleife verwendt wird, um alle Indexnummern zu durchlaufen:

meineListe = ["Apfel", "Zwetschge", "Birne"]
i = 0
while i < len(meineListe):
  print(meineListe[i])
  i = i + 1

Schleifen mit Listenverständnis

List Comprehension (Listenverständnis) bietet die kürzeste Syntax zum Durchlaufen von Listen:

Folgendes Beispiel zeigt die Kurzform einer for Schleife, die alle Elemente in einer Liste ausgibt:

meineListe = ["Apfel", "Zwetschge", "Birne"]
[print(x) for x in meineListe]

Aufgabe

Baue o.g. Codebeispiele nach und variiere mit verschiedenen Aufbauten. Nimm auch Lektionen aus den vorhergegangenen Unterrichtsblöcken mit in die Beispiele.

Listenverständnis (List Comprehension)

Das Listenverständnis bietet eine kürzere Syntax, wenn man eine neue Liste basierend auf den Werten einer vorhandenen Liste erstellen möchten.

Beispiel:

Basierend auf einer Liste von Früchten möchten man eine neue Liste, die nur die Früchte mit dem Buchstaben „a“ im Namen enthält.

Ohne die Syntax der List Comprehension müssen man eine for Anweisung mit einem bedingten Test darin schreiben:

meineListe = ["Apfel", "Zwetschge", "Birne", "Kirsche", "Mango", "Banane", "Ananas"]
neueliste = []

for x in meineListe:
  if "a" in x:
    neueliste.append(x)

print(neueliste)

Mit dem Listenverständnis kann man dies alles mit nur einer Codezeile erledigen:

meineListe = ["Apfel", "Zwetschge", "Birne", "Kirsche", "Mango", "Banane", "Ananas"]

neueliste = [x for x in meineListe if "a" in x]

print(neueliste)

Die Syntax

neueliste = [ausdruck for artikel in liste if bedingung == True]

Der Rückgabewert ist eine neue Liste, wobei die alte Liste unverändert bleibt.

Bedingung

Die Bedingung ist wie ein Filter, der nur die Elemente mit dem Wert True akzeptiert.

Akzeptieren Sie nur Artikel, die nicht „Apfel“ sind:

neueliste = [x for x in meineListe if x != "Apfel"]

Die Bedingung if x != "Apfel" True wird für alle Elemente außer "Apfel"  zurückgegeben, wodurch die neue Liste alle Früchte außer "Apfel" enthält.

Die Bedingung ist optional und kann weggelassen werden:

Ohne if-Aussage:

neueliste = [x for x in meineListe]

Iterable

Eine Iterable kann jedes iterierbare Objekt sein, wie eine Liste, ein Tupel, eine Menge usw.

Man kann die Funktion range() verwenden, um eine Iterable zu erstellen:

neueliste = [x for x in range(10)]

Gleiches Beispiel mit einer Bedingung, nur Zahlen unter 5 zu akzeptieren:

neueliste = [x for x in range(10) if x < 5]

Ausdruck

Der Ausdruck ist das aktuelle Element in der Iteration, aber auch das Ergebnis, das man bearbeiten kann, bevor es zu einem Listenelement in der neuen Liste wird:

Wandelt die Werte in der neuen Liste in Großbuchstaben um:

neueliste = [x.upper() for x in meineListe]

Man kann das Ergebnis beliebig einstellen. Folgendes Beispiel setzt alle Werte in der neuen Liste auf „Hallo“:

neueliste = ['Hallo' for x in neueliste]

Der Ausdruck kann auch Bedingungen enthalten, nicht wie ein Filter, sondern als Möglichkeit, das Ergebnis zu manipulieren:

Ausgabe von „Mango“ statt „Banane“:

neueliste = [x if x != "Banane" else "Mango" for x in neueliste]

Der Ausdruck im obigen Beispiel sagt:

„Gib den Artikel aus, wenn dieser keine Banane ist, wenn es eine Banane ist, gib Mango zurück“.

Aufgabe

Baue o.g. Codebeispiele nach und erweitere diese duch Erkenntnisse aus anderen Unterrichtsblöcken.

Listen sortieren

Liste alphanumerisch sortieren

Listenobjekte haben eine sort()Methode, die die Liste standardmäßig alphanumerisch aufsteigend sortiert:

Sortiert die Liste alphabetisch:

meineListe = ["Apfel", "Zwetschge", "Birne", "Kirsche", "Mango", "Banane", "Ananas"]
meineListe.sort()
print(meineListe)

Sortiert die Liste numerisch:

meinezahlen = [100, 50, 65, 82, 23]
meinezahlen.sort()
print(meinezahlen)

Absteigend sortieren

Um absteigend zu sortieren, verwenden Sie das Schlüsselwortargument reverse = True:

Sortiert die Liste absteigend:

meineListe = ["Apfel", "Zwetschge", "Birne", "Kirsche", "Mango", "Banane", "Ananas"]
meineListe.sort(reverse = True)
print(meineListe)

Sortiert die Liste absteigend:

meinezahlen = [100, 50, 65, 82, 23]
meinezahlen.sort(reverse = True)
print(meinezahlen)

Sortierfunktion anpassen

Man kann auch eine eigene Funktion anpassen, indem man das Schlüsselwortargument .key = function verwenden

Die Funktion gibt eine Zahl zurück, die zum Sortieren der Liste verwendet wird (die niedrigste Zahl zuerst):

Sortiert die Liste danach, wie nahe die Zahl an 50 liegt:

def meinefunktion(n):
  return abs(n - 50)

meinezahlen = [100, 50, 65, 82, 23]
meinezahlen.sort(key = meinefunktion)
print(meinezahlen)

Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung

Standardmäßig ist die sort()Methode case sensitive, was dazu führt, dass alle Großbuchstaben vor Kleinbuchstaben sortiert werden:

Die Sortierung nach Groß- und Kleinschreibung kann zu einem unerwarteten Ergebnis führen:

meineListe = ["banane", "Orange", "Kiwi", "kirsche"]
meineListe.sort()
print(meineListe)

Man kann jedoch eingebaute Funktionen als Schlüsselfunktionen beim Sortieren einer Liste verwenden.

Wenn man also eine Sortierfunktion möchte, bei der die Groß-/Kleinschreibung nicht berücksichtigt wird, verwendt man str.lower als Schlüsselfunktion:

Führt eine Sortierung der Liste ohne Berücksichtigung der Groß-/Kleinschreibung durch:

meineListe = ["banane", "Orange", "Kiwi", "kirsche"]
meineListe.sort(key = str.lower)
print(meineListe)

Umgekehrte Reihenfolge

Was ist, wenn man die Reihenfolge einer Liste unabhängig vom Alphabet umkehren möchte? Die reverse()Methode kehrt die aktuelle Sortierreihenfolge der Elemente um.

Kehrt die Reihenfolge der Listenelemente um:

meineListe = ["banane", "Orange", "Kiwi", "kirsche"]
meineListe.reverse()
print(meineListe)

Aufgabe

Baue o.g. Codebeispiele nach und erweitere diese duch Erkenntnisse aus anderen Unterrichtsblöcken.

Grundlagen KI & maschinelles Lernen

Definition & Abgrenzung

  • Künstliche Intelligenz ist eine Teilmenge der Informatik und bezeichnet Computerprogramme, die eigenständig Probleme lösen können.
  • Maschinelles Lernen ist eine Teilmenge der KI und wird angewendet, um in der Problemlösung besser zu werden und die KI zu trainieren.

Unterschied schwache KI und starke KI

Bei künstlichen Intelligenzen gilt es zwischen schwacher und starker KI zu unterscheiden. Während sich die schwache KI in der Regel mit konkreten Anwendungsproblemen beschäftigt, geht es bei der starken KI darum, eine allgemeine Intelligenz zu schaffen, die der des Menschen gleicht oder diese übertrifft.

Anwendungsbereiche

Hautkrebserkennung

Blutuntersuchung und Erkennung von Erregern

Autonome Waffensysteme

Trainingsdaten

  • Große Datenmengen nötig
  • Gute Datenverfügbrakeit
  • Leistungsfähige Rechner nötig

Maschinelles Lernen Grundarten

Wird unterteilt in Lernphase und Anwendung

Überwachtes Lernen (supervised learning)

Zieldaten werden händisch bearbeitet

Unüberwachtes Lernen (unsupervised learning)

  • Benötigt keine Zieldaten
  • Für die Gruppierung geeignet (Clustering)
  • Geeignet mit sehr großen Datenmengen

Teilüberwachtes Lernen

Mischform aus überwachtem und unüberwachtem Lernen

Bestärkendes Lernen (reinforcement learning)

  • Mittels Belohnung und Bestrafung (Punktevergabe und Punkteabzug)
  • Meist innerhalb einer Sitzation
  • Wird oft in der Robotik eingesetzt

Aktives Lernen

Aktives Leren ist eine Unterkategorie des überwachten Lernens.

Aktives Lernen bezeichnet einen Lernalgorithmus, der Datenpunkte aus einer Menge an noch nicht gelabelten Datenpunkten gezielt auswählt, um sie als nächstes labeln zu lassen. Die Vergabe von Labels kann unter anderem von einem Menschen oder zu Evaluierungszwecken vom Algorithmus erfolgen.

Die Auswahl der Datenpunkte erfolgt nach einer Selektionsstrategie. Eine häufig gewählte Selektionsstrategie ist Uncertainty Sampling, das den Datenpunkt mit der geringsten Konfidenz auswählt. Die geringste Konfidenz bedeutet hierbei, dass der Algorithmus bei diesem Datenpunkt am wenigsten sicher ist, zu welcher Klasse dieser passt.

Der Grundgedanke ist, dass das Modell mit weniger Datenpunkten eine genauso hohe oder höhere Klassifikationsgenauigkeit (z.B. 90% richtig erkannt) erzielt wie ein Modell, das alle Datenpunkte nutzt. Wann der Lernprozess stoppt, wird über ein Stoppkriterium definiert.

Meta Lernen

Wenn ein Algorithmus lernt, liegt dieser Technik eine systematische Beobachtung zugrunde. Beim Meta-Learning oder dem „Lernen zu lernen“ geht es darum zu erkennen und zu adaptieren, wie verschiedene Ansätze des Maschinellen Lernens bei einer Vielzahl von bereits erledigten Lernaufgaben funktioniert haben.

Der Algorithmus kann so entscheiden, welche Lernmethoden für welche Art von Anwendungen am besten geeignet sind.

Anwendungen für Maschinelles Lernen

Clustering

Clustering wird unter Anderem angewendet, um anhand von Attributen bestimmte Gruppierungen vorzunehmen. Ein möglicher Anwendungsfall ist z. B. das Erkennen von Spam-Bots in sozialen Medien.

Ein einfacher Bot hätte eine sehr hohe Posting-Rate und würde auch zu Zeiten posten, in welchen die meisten Menschen in einer bestimmten Zeitzohne schlafen. Anhand dieser Attribute „Häufigkeit der Posts“ und „Continuität der Posts“ sowie der „Postingzeit“ könnte man über das Clustering einen bestimmten Prozentsatz an Bots herausfiltern und die Ihalte dieser Bots entweder sperren, oder weitere Filter bzw. Maßnahmen anwenden.

Klassifikation

Die Klassifikation wird häufig verwendet, um eine Menge an Bilddaten bestimmten Klassen zuzuweisen.

Zuordnung von Baumarten
Erkennung von befallenen Bäumen.
Klassifizierung von Wirbeltieren und Wirbellosen sowie deren Unterarten.

Regression

Mathematisch müssen sich Regression und Klassifikation gar nicht all zu sehr voneinander unterscheiden. Viele Verfahren der Klassifikation lassen sich mit nur wenig Anpassung auch zur Regression anwenden, oder umgekehrt. Künstliche neuronale Netze, k-nächste-Nachbarn und Entscheidungsbäume sind gute Beispiele, die in der Praxis sowohl für Klassifkation als auch für Regression eingesetzt werden, natürlich mit unterschiedlichen Stärken und Schwächen.

Unterschiedlich ist jedoch der Zweck der Anwendung

Bei der Regression möchten wir stetige Werte vorhersagen (z. B. Temperatur der Maschine), bei der Klassifikation hingegen Klassen unterscheiden (z. B. Maschine überhitzt oder überhitzt nicht).

Unterschiede zwischen linearer und nicht-linearer Klassifikation und linearer und nicht-linearer Regression. Für Einsteiger in diese Thematik ist beachten, dass jede maschinell erlernte Klassifikation und Regression einen gewissen Fehler hat, der unter Betrachtung der Trainings- und Testdaten zu minimieren ist, jedoch nie ganz verschwindet.

Aufgabe

Recherchiere verschiedene Anwendungsbereiche von KI.
Recherchiere 2/3 der verfügbaren Zeit über den Bereich, der Dich am meisten interessiert und begründe, warum Dich der Bereich interessiert und welche Teile Dich genau interessieren.

Aufgabe

Aufgabe

Kombiniere das heute Erlernte mit den Inhalten vorherigen Unterrichtsblöcke und probiere verschiedene Konstellationen aus.