Machine Learning mit Python und ScikitLearn und TensorFlow

Book description

  • Datenanalyse mit ausgereiften statistischen Modellen des Machine Learnings
  • Anwendung der wichtigsten Algorithmen und Python-Bibliotheken wie NumPy, SciPy, Scikit-learn, TensorFlow, Matplotlib, Pandas und Keras
  • Best Practices zur Optimierung Ihrer Machine-Learning-Algorithmen

Machine Learning und Predictive Analytics verändern die Arbeitsweise von Unternehmen grundlegend. Die Fähigkeit, in komplexen Daten Trends und Muster zu erkennen, ist heutzutage für den langfristigen geschäftlichen Erfolg ausschlaggebend und entwickelt sich zu einer der entscheidenden Wachstumsstrategien.

Die zweite Auflage dieses Buchs berücksichtigt die jüngsten Entwicklungen und Technologien, die für Machine Learning, Neuronale Netze und Deep Learning wichtig sind. Dies betrifft insbesondere die neuesten Open-Source-Bibliotheken wie Scikit-learn, Keras und TensorFlow.

Python zählt zu den führenden Programmiersprachen in den Bereichen Machine Learning, Data Science und Deep Learning und ist besonders gut dazu geeignet, grundlegende Erkenntnisse aus Ihren Daten zu gewinnen sowie ausgefeilte Algorithmen und statistische Modelle auszuarbeiten, die neue Einsichten liefern und wichtige Fragen beantworten.

Die Autoren erläutern umfassend den Einsatz von Machine-Learning- und Deep-Learning-Algorithmen und wenden diese anhand zahlreicher Beispiele praktisch an. Dafür behandeln sie in diesem Buch ein breites Spektrum leistungsfähiger Python-Bibliotheken wie Scikit-learn, Keras und TensorFlow. Sie lernen detailliert, wie Sie Python für maschinelle Lernverfahren einsetzen und dabei eine Vielzahl von statistischen Modellen verwenden.

Aus dem Inhalt:
  • Trainieren von Lernalgorithmen für die Klassifizierung
  • Regressionsanalysen zum Prognostizieren von Ergebnissen
  • Clusteranalyse zum Auffinden verborgener Muster und Strukturen in Ihren Daten
  • Deep-Learning-Verfahren zur Bilderkennung
  • Optimale Organisation Ihrer Daten durch effektive Verfahren zur Vorverarbeitung
  • Datenkomprimierung durch Dimensionsreduktion
  • Training Neuronaler Netze mit TensorFlow
  • Kombination verschiedener Modelle für das Ensemble Learning
  • Einbettung eines Machine-Learning-Modells in eine Webanwendung
  • Stimmungsanalyse in Social Networks
  • Modellierung sequenzieller Daten durch rekurrente Neuronale Netze

Table of contents

  1. Impressum
  2. Über die Autoren
  3. Über die Korrektoren
  4. Einleitung
  5. Kapitel 1: Wie Computer aus Daten lernen können
    1. 1.1 Intelligente Maschinen, die Daten in Wissen verwandeln
    2. 1.2 Die drei Arten des Machine Learnings
      1. 1.2.1 Mit überwachtem Lernen Vorhersagen treffen
      2. 1.2.2 Interaktive Aufgaben durch verstärkendes Lernen lösen
      3. 1.2.3 Durch unüberwachtes Lernen verborgene Strukturen erkennen
    3. 1.3 Grundlegende Terminologie und Notation
    4. 1.4 Entwicklung eines Systems für das Machine Learning
      1. 1.4.1 Vorverarbeitung: Daten in Form bringen
      2. 1.4.2 Trainieren und Auswählen eines Vorhersagemodells
      3. 1.4.3 Bewertung von Modellen und Vorhersage anhand unbekannter Dateninstanzen
    5. 1.5 Machine Learning mit Python
      1. 1.5.1 Python-Pakete installieren
      2. 1.5.2 Verwendung der Python-Distribution Anaconda
      3. 1.5.3 Pakete für wissenschaftliches Rechnen, Data Science und Machine Learning
    6. 1.6 Zusammenfassung
  6. Kapitel 2: Lernalgorithmen für die Klassifizierung trainieren
    1. 2.1 Künstliche Neuronen: Ein kurzer Blick auf die Anfänge des Machine Learnings
      1. 2.1.1 Formale Definition eines künstlichen Neurons
      2. 2.1.2 Die Perzeptron-Lernregel
    2. 2.2 Implementierung eines Perzeptron-Lernalgorithmus in Python
      1. 2.2.1 Eine objektorientierte Perzeptron-API
      2. 2.2.2 Trainieren eines Perzeptron-Modells auf die Iris-Datensammlung
    3. 2.3 Adaptive lineare Neuronen und die Konvergenz des Lernens
      1. 2.3.1 Straffunktionen mit dem Gradientenabstiegsverfahren minimieren
      2. 2.3.2 Implementierung eines adaptiven linearen Neurons in Python
      3. 2.3.3 Verbesserung des Gradientenabstiegsverfahrens durch Merkmalstandardisierung
      4. 2.3.4 Großmaßstäbliches Machine Learning und stochastisches Gradientenabstiegsverfahren
    4. 2.4 Zusammenfassung
  7. Kapitel 3: Machine-Learning-Klassifizierer mit scikit-learn verwenden
    1. 3.1 Auswahl eines Klassifizierungsalgorithmus
    2. 3.2 Erste Schritte mit scikit-learn: Trainieren eines Perzeptrons
    3. 3.3 Klassenwahrscheinlichkeiten durch logistische Regression modellieren
      1. 3.3.1 Logistische Regression und bedingte Wahrscheinlichkeiten
      2. 3.3.2 Gewichtungen der logistischen Straffunktion ermitteln
      3. 3.3.3 Konvertieren einer Adaline-Implementierung in einen Algorithmus für eine logistische Regression
      4. 3.3.4 Trainieren eines logistischen Regressionsmodells mit scikit-learn
      5. 3.3.5 Überanpassung durch Regularisierung verhindern
    4. 3.4 Maximum-Margin-Klassifizierung mit Support Vector Machines
      1. 3.4.1 Maximierung des Randbereichs
      2. 3.4.2 Handhabung des nicht linear trennbaren Falls mit Schlupfvariablen
      3. 3.4.3 Alternative Implementierungen in scikit-learn
    5. 3.5 Nichtlineare Aufgaben mit einer Kernel-SVM lösen
      1. 3.5.1 Kernel-Methoden für linear nicht trennbare Daten
      2. 3.5.2 Mit dem Kernel-Trick Hyperebenen in höherdimensionalen Räumen finden
    6. 3.6 Lernen mit Entscheidungsbäumen
      1. 3.6.1 Maximierung des Informationsgewinns: Daten ausreizen
      2. 3.6.2 Konstruktion eines Entscheidungsbaums
      3. 3.6.3 Mehrere Entscheidungsbäume zu einem Random Forest kombinieren
    7. 3.7 k-Nearest-Neighbor: Ein Lazy-Learning-Algorithmus
    8. 3.8 Zusammenfassung
  8. Kapitel 4: Gut geeignete Trainingsdatenmengen: Datenvorverarbeitung
    1. 4.1 Umgang mit fehlenden Daten
      1. 4.1.1 Fehlende Werte in Tabellendaten
      2. 4.1.2 Exemplare oder Merkmale mit fehlenden Daten entfernen
      3. 4.1.3 Fehlende Werte ergänzen
      4. 4.1.4 Die Schätzer-API von scikit-learn
    2. 4.2 Handhabung kategorialer Daten
      1. 4.2.1 Nominale und ordinale Merkmale
      2. 4.2.2 Erstellen einer Beispieldatenmenge
      3. 4.2.3 Zuweisung von ordinalen Merkmalen
      4. 4.2.4 Codierung der Klassenbezeichnungen
      5. 4.2.5 One-hot-Codierung der nominalen Merkmale
    3. 4.3 Aufteilung einer Datensammlung in Trainings- und Testdaten
    4. 4.4 Anpassung der Merkmale
    5. 4.5 Auswahl aussagekräftiger Merkmale
      1. 4.5.1 L1- und L2-Regularisierung als Straffunktionen
      2. 4.5.2 Geometrische Interpretation der L2-Regularisierung
      3. 4.5.3 Dünnbesetzte Lösungen mit L1-Regularisierung
      4. 4.5.4 Algorithmen zur sequenziellen Auswahl von Merkmalen
    6. 4.6 Beurteilung der Bedeutung von Merkmalen mit Random Forests
    7. 4.7 Zusammenfassung
  9. Kapitel 5: Datenkomprimierung durch Dimensionsreduktion
    1. 5.1 Unüberwachte Dimensionsreduktion durch Hauptkomponentenanalyse
      1. 5.1.1 Schritte bei der Hauptkomponentenanalyse
      2. 5.1.2 Schrittweise Extraktion der Hauptkomponenten
      3. 5.1.3 Totale Varianz und Varianzaufklärung
      4. 5.1.4 Merkmalstransformation
      5. 5.1.5 Hauptkomponentenanalyse mit scikit-learn
    2. 5.2 Überwachte Datenkomprimierung durch lineare Diskriminanzanalyse
      1. 5.2.1 Hauptkomponentenanalyse vs. lineare Diskriminanzanalyse
      2. 5.2.2 Die interne Funktionsweise der linearen Diskriminanzanalyse
      3. 5.2.3 Berechnung der Streumatrizen
      4. 5.2.4 Auswahl linearer Diskriminanten für den neuen Merkmalsunterraum
      5. 5.2.5 Projektion in den neuen Merkmalsraum
      6. 5.2.6 LDA mit scikit-learn
    3. 5.3 Kernel-Hauptkomponentenanalyse für nichtlineare Zuordnungen verwenden
      1. 5.3.1 Kernel-Funktionen und der Kernel-Trick
      2. 5.3.2 Implementierung einer Kernel-Hauptkomponentenanalyse in Python
      3. 5.3.3 Projizieren neuer Datenpunkte
      4. 5.3.4 Kernel-Hauptkomponentenanalyse mit scikit-learn
    4. 5.4 Zusammenfassung
  10. Kapitel 6: Best Practices zur Modellbewertung und Hyperparameter-Abstimmung
    1. 6.1 Arbeitsabläufe mit Pipelines optimieren
      1. 6.1.1 Die Wisconsin-Brustkrebs-Datensammlung
      2. 6.1.2 Transformer und Schätzer in einer Pipeline kombinieren
    2. 6.2 Beurteilung des Modells durch k-fache Kreuzvalidierung
      1. 6.2.1 2-fache Kreuzvalidierung
      2. 6.2.2 k-fache Kreuzvalidierung
    3. 6.3 Algorithmen mit Lern- und Validierungskurven debuggen
      1. 6.3.1 Probleme mit Bias und Varianz anhand von Lernkurven erkennen
      2. 6.3.2 Überanpassung und Unteranpassung anhand von Validierungskurven erkennen
    4. 6.4 Feinabstimmung eines Lernmodells durch Rastersuche
      1. 6.4.1 Hyperparameter-Abstimmung durch Rastersuche
      2. 6.4.2 Algorithmenauswahl durch verschachtelte Kreuzvalidierung
    5. 6.5 Verschiedene Kriterien zur Leistungsbewertung
      1. 6.5.1 Interpretation einer Wahrheitsmatrix
      2. 6.5.2 Optimierung der Genauigkeit und der Trefferquote eines Klassifizierungsmodells
      3. 6.5.3 Receiver-Operating-Characteristic-Diagramme
      4. 6.5.4 Bewertungskriterien für Mehrfachklassifizierungen
    6. 6.6 Handhabung unausgewogener Klassenverteilung
    7. 6.7 Zusammenfassung
  11. Kapitel 7: Kombination verschiedener Modelle für das Ensemble Learning
    1. 7.1 Ensemble Learning​
    2. 7.2 Klassifizierer durch Mehrheitsentscheidung kombinieren
      1. 7.2.1 Implementierung eines einfachen Mehrheitsentscheidungs-Klassifizierers
      2. 7.2.2 Vorhersagen nach dem Prinzip der Mehrheitsentscheidung treffen
    3. 7.3 Bewertung und Abstimmung des Klassifizierer-Ensembles
    4. 7.4 Bagging: Klassifizierer-Ensembles anhand von Bootstrap-Stichproben entwickeln
      1. 7.4.1 Bagging kurz zusammengefasst
      2. 7.4.2 Klassifizierung der Wein-Datensammlung durch Bagging
    5. 7.5 Schwache Klassifizierer durch adaptives Boosting verbessern
      1. 7.5.1 Funktionsweise des Boostings
      2. 7.5.2 AdaBoost mit scikit-learn anwenden
    6. 7.6 Zusammenfassung
  12. Kapitel 8: Machine Learning zur Analyse von Stimmungslagen nutzen
    1. 8.1 Die IMDb-Filmdatenbank
      1. 8.1.1 Herunterladen der Datensammlung
      2. 8.1.2 Vorverarbeiten der Filmbewertungsdaten
    2. 8.2 Das Bag-of-words-Modell
      1. 8.2.1 Wörter in Merkmalsvektoren umwandeln
      2. 8.2.2 Beurteilung der Wortrelevanz durch das Tf-idf-Maß
      3. 8.2.3 Textdaten bereinigen
      4. 8.2.4 Dokumente in Token zerlegen
    3. 8.3 Ein logistisches Regressionsmodell für die Dokumentklassifizierung trainieren
    4. 8.4 Verarbeitung großer Datenmengen: Online-Algorithmen und Out-of-Core Learning
    5. 8.5 Topic Modeling mit latenter Dirichlet-Allokation
      1. 8.5.1 Aufteilung von Texten mit der LDA
      2. 8.5.2 LDA mit scikit-learn
    6. 8.6 Zusammenfassung
  13. Kapitel 9: Einbettung eines Machine-Learning-Modells in eine Webanwendung
    1. 9.1 Serialisierung angepasster Schätzer mit scikit-learn
    2. 9.2 Einrichtung einer SQLite-Datenbank zum Speichern von Daten
    3. 9.3 Entwicklung einer Webanwendung mit Flask
      1. 9.3.1 Die erste Webanwendung mit Flask
      2. 9.3.2 Formularvalidierung und -ausgabe
    4. 9.4 Der Filmbewertungsklassifizierer als Webanwendung
      1. 9.4.1 Dateien und Ordner – die Verzeichnisstruktur
      2. 9.4.2 Implementierung der Hauptanwendung app.py
      3. 9.4.3 Einrichtung des Bewertungsformulars
      4. 9.4.4 Eine Vorlage für die Ergebnisseite erstellen
    5. 9.5 Einrichtung der Webanwendung auf einem öffentlich zugänglichen Webserver
      1. 9.5.1 Erstellen eines Benutzerkontos bei PythonAnywhere
      2. 9.5.2 Hochladen der Filmbewertungsanwendung
      3. 9.5.3 Updaten des Filmbewertungsklassifizierers
    6. 9.6 Zusammenfassung
  14. Kapitel 10: Vorhersage stetiger Zielvariablen durch Regressionsanalyse
    1. 10.1 Lineare Regression
      1. 10.1.1 Ein einfaches lineares Regressionsmodell
      2. 10.1.2 Multiple lineare Regression
    2. 10.2 Die Lebensbedingungen-Datensammlung
      1. 10.2.1 Einlesen der Datenmenge in einen DataFrame
      2. 10.2.2 Visualisierung der wichtigen Eigenschaften einer Datenmenge
      3. 10.2.3 Zusammenhänge anhand der Korrelationsmatrix erkennen
    3. 10.3 Implementierung eines linearen Regressionsmodells mit der Methode der kleinsten Quadrate
      1. 10.3.1 Berechnung der Regressionsparameter mit dem Gradientenabstiegsverfahren
      2. 10.3.2 Abschätzung der Koeffizienten eines Regressionsmodells mit scikit-learn
    4. 10.4 Anpassung eines robusten Regressionsmodells mit dem RANSAC-Algorithmus
    5. 10.5 Bewertung der Leistung linearer Regressionsmodelle
    6. 10.6 Regularisierungsverfahren für die Regression einsetzen
    7. 10.7 Polynomiale Regression: Umwandeln einer linearen Regression in eine Kurve
      1. 10.7.1 Hinzufügen polynomialer Terme mit scikit-learn
      2. 10.7.2 Modellierung nichtlinearer Zusammenhänge in der Lebensbedingungen-Datensammlung
    8. 10.8 Handhabung nichtlinearer Beziehungen mit Random Forests
      1. 10.8.1 Entscheidungsbaum-Regression
      2. 10.8.2 Random-Forest-Regression
    9. 10.9 Zusammenfassung
  15. Kapitel 11: Verwendung nicht gekennzeichneter Daten: Clusteranalyse
    1. 11.1 Gruppierung von Objekten nach Ähnlichkeit mit dem k-Means-Algorithmus
      1. 11.1.1 K-Means-Clustering mit scikit-learn
      2. 11.1.2 Der k-Means++-Algorithmus
      3. 11.1.3 »Harte« und »weiche« Clustering-Algorithmen
      4. 11.1.4 Die optimale Anzahl der Cluster mit dem Ellenbogenkriterium ermitteln
      5. 11.1.5 Quantifizierung der Clustering-Güte mit Silhouettendiagrammen
    2. 11.2 Cluster als hierarchischen Baum organisieren
      1. 11.2.1 Gruppierung von Clustern
      2. 11.2.2 Hierarchisches Clustering einer Distanzmatrix
      3. 11.2.3 Dendrogramme und Heatmaps verknüpfen
      4. 11.2.4 Agglomeratives Clustering mit scikit-learn
    3. 11.3 Bereiche hoher Dichte mit DBSCAN ermitteln
    4. 11.4 Zusammenfassung
  16. Kapitel 12: Implementierung eines künstlichen neuronalen Netzes
    1. 12.1 Modellierung komplexer Funktionen mit künstlichen neuronalen Netzen
      1. 12.1.1 Einschichtige neuronale Netze
      2. 12.1.2 Mehrschichtige neuronale Netzarchitektur
      3. 12.1.3 Aktivierung eines neuronalen Netzes durch Vorwärtspropagation
    2. 12.2 Klassifizierung handgeschriebener Ziffern
      1. 12.2.1 Die MNIST-Datensammlung
      2. 12.2.2 Implementierung eines mehrschichtigen Perzeptrons
    3. 12.3 Trainieren eines künstlichen neuronalen Netzes
      1. 12.3.1 Berechnung der logistischen Straffunktion
      2. 12.3.2 Ein Gespür für die Backpropagation entwickeln
      3. 12.3.3 Trainieren neuronaler Netze durch Backpropagation
    4. 12.4 Konvergenz in neuronalen Netzen
    5. 12.5 Abschließende Bemerkungen zur Implementierung neuronaler Netze
    6. 12.6 Zusammenfassung
  17. Kapitel 13: Parallelisierung des Trainings neuronaler Netze mit TensorFlow
    1. 13.1 TensorFlow und Trainingsleistung
      1. 13.1.1 Was genau ist TensorFlow?
      2. 13.1.2 TensorFlow erlernen
      3. 13.1.3 Erste Schritte mit TensorFlow
      4. 13.1.4 Mit Array-Strukturen arbeiten
      5. 13.1.5 Entwicklung eines einfachen Modells mit TensorFlows Low-level-API
    2. 13.2 Training neuronaler Netze mit TensorFlows High-level-APIs
      1. 13.2.1 Entwicklung mehrschichtiger neuronaler Netze mit TensorFlows Layers-API
      2. 13.2.2 Entwicklung eines mehrschichtigen neuronalen Netzes mit Keras
    3. 13.3 Auswahl der Aktivierungsfunktionen mehrschichtiger neuronaler Netze
      1. 13.3.1 Die logistische Funktion kurz zusammengefasst
      2. 13.3.2 Wahrscheinlichkeiten bei der Mehrfachklassifizierung mit der softmax-Funktion abschätzen
      3. 13.3.3 Verbreiterung des Ausgabespektrums mittels Tangens hyperbolicus
      4. 13.3.4 Aktivierung durch rektifizierte Lineareinheiten
    4. 13.4 Zusammenfassung
  18. Kapitel 14: Die Funktionsweise von TensorFlow im Detail
    1. 14.1 Grundlegende Merkmale von TensorFlow
    2. 14.2 TensorFlow-Tensoren und deren Rang
      1. 14.2.1 Rang und Form eines Tensors ermitteln
    3. 14.3 TensorFlow-Berechnungsgraphen
    4. 14.4 Platzhalter in TensorFlow
      1. 14.4.1 Platzhalter definieren
      2. 14.4.2 Platzhaltern Daten zuführen
      3. 14.4.3 Platzhalter für Datenarrays mit variierenden Stapelgrößen definieren
    5. 14.5 Variablen in TensorFlow
      1. 14.5.1 Variablen definieren
      2. 14.5.2 Variablen initialisieren
      3. 14.5.3 Geltungsbereich von Variablen
      4. 14.5.4 Wiederverwendung von Variablen
    6. 14.6 Erstellen eines Regressionsmodells
    7. 14.7 Ausführung von Objekten in einem TensorFlow-Graphen unter Verwendung ihres Namens
    8. 14.8 Speichern und wiederherstellen eines Modells in TensorFlow
    9. 14.9 Tensoren als mehrdimensionale Datenarrays transformieren
    10. 14.10 Mechanismen der Flusskontrolle beim Erstellen von Graphen verwenden
    11. 14.11 Graphen mit TensorBoard visualisieren
      1. 14.11.1 Erweitern Sie Ihre TensorBoard-Kenntnisse
    12. 14.12 Zusammenfassung
  19. Kapitel 15: Bildklassifizierung mit tiefen konvolutionalen neuronalen Netzen
    1. 15.1 Bausteine konvolutionaler neuronaler Netze
      1. 15.1.1 CNNs und Merkmalshierarchie
      2. 15.1.2 Diskrete Faltungen
      3. 15.1.3 Subsampling
    2. 15.2 Implementierung eines CNNs
      1. 15.2.1 Verwendung mehrerer Eingabe- oder Farbkanäle
      2. 15.2.2 Regularisierung eines neuronalen Netzes mit Dropout
    3. 15.3 Implementierung eines tiefen konvolutionalen neuronalen Netzes mit TensorFlow
      1. 15.3.1 Die mehrschichtige CNN-Architektur
      2. 15.3.2 Einlesen und Vorverarbeiten der Daten
      3. 15.3.3 Implementierung eines CNNs mit TensorFlows Low-level-API
      4. 15.3.4 Implementierung eines CNNs mit TensorFlows Layers-API
    4. 15.4 Zusammenfassung
  20. Kapitel 16: Modellierung sequenzieller Daten durch rekurrente neuronale Netze
    1. 16.1 Sequenzielle Daten
      1. 16.1.1 Modellierung sequenzieller Daten: Die Reihenfolge ist von Bedeutung
      2. 16.1.2 Repräsentierung von Sequenzen
      3. 16.1.3 Verschiedene Kategorien der Sequenzmodellierung
    2. 16.2 Sequenzmodellierung mit RNNs
      1. 16.2.1 Struktur und Ablauf eines RNNs
      2. 16.2.2 Aktivierungen eines RNNs berechnen
      3. 16.2.3 Probleme bei der Erkennung weitreichender Interaktionen
      4. 16.2.4 LSTM-Einheiten
    3. 16.3 Implementierung eines mehrschichtigen RNNs zur Sequenzmodellierung mit TensorFlow
    4. 16.4 Projekt 1: Analyse der Stimmungslage in der IMDb-Filmbewertungsdatenbank mit mehrschichtigen RNNs
      1. 16.4.1 Datenaufbereitung
      2. 16.4.2 Einbettung
      3. 16.4.3 Erstellen eines RNN-Modells
      4. 16.4.4 Der Konstruktor der SentimentRNN-Klasse
      5. 16.4.5 Die build-Methode
      6. 16.4.6 Die train-Methode
      7. 16.4.7 Die predict-Methode
      8. 16.4.8 Instanziierung der SentimentRNN-Klasse
      9. 16.4.9 Training und Optimierung des RNN-Modells zur Stimmungsanalyse
    5. 16.5 Projekt 2: Implementierung eines RNNs zur Sprachmodellierung durch Zeichen mit TensorFlow
      1. 16.5.1 Datenaufbereitung
      2. 16.5.2 Erstellen eines RNNs zur Sprachmodellierung durch Zeichen
      3. 16.5.3 Der Konstruktor
      4. 16.5.4 Die build-Methode
      5. 16.5.5 Die train-Methode
      6. 16.5.6 Die sample-Methode
      7. 16.5.7 Erstellen und Trainieren des CharRNN-Modells
      8. 16.5.8 Das CharRNN-Modell im Sampling-Modus
    6. 16.6 Zusammenfassung und Schlusswort

Product information

  • Title: Machine Learning mit Python und ScikitLearn und TensorFlow
  • Author(s): Sebastian Raschka, Vahid Mirjalili
  • Release date: December 2017
  • Publisher(s): mitp Verlag
  • ISBN: 9783958457355