Kurs
Vieles von dem, was du für einen echten Einstieg in Machine Learning brauchst, ist lineare Algebra – genau darum geht es in diesem Tutorial. Dieser Beitrag behandelt die Themen der linearen Algebra, die du kennen und verstehen solltest, um besser zu verstehen, wie und wann Machine-Learning-Methoden funktionieren – vom Blick auf Vektoren und Matrizen aus.
Am Ende des Tutorials fühlst du dich hoffentlich sicherer, einen Algorithmus genauer unter die Lupe zu nehmen!
Inhalt
Einführung
Eines der drei Grundthemen, die du beherrschen solltest, wenn du Data Science lernen willst, ist Machine Learning. Und wenn du richtig in Machine Learning einsteigst, ist es wichtig, tiefer zu gehen und ein Gefühl dafür zu entwickeln, wie die Algorithmen funktionieren.
Ich denke, du – angehende oder aktive Data Scientist:in – wirst mir zustimmen, dass das durchaus herausfordernd sein kann.
Aber das muss nicht so sein.
SciPy versus NumPy
Aus DataCamps NumPy-Tutorial weißt du, dass diese Bibliothek zu den Kernbibliotheken für wissenschaftliches Rechnen in Python gehört. Sie enthält eine Sammlung von Werkzeugen und Techniken, um mathematische Modelle aus Wissenschaft und Technik am Computer zu lösen. Das am häufigsten genutzte Werkzeug ist dabei ein performantes, mehrdimensionales Array-Objekt – eine leistungsstarke Datenstruktur, mit der sich Arrays und Matrizen effizient berechnen lassen.
Nun, SciPy ist im Grunde NumPy – und mehr.
Auch SciPy ist eines der zentralen Pakete für wissenschaftliches Rechnen und stellt mathematische Algorithmen sowie Komfortfunktionen bereit. Es basiert jedoch auf der NumPy-Erweiterung für Python. Das heißt: SciPy und NumPy werden oft gemeinsam genutzt!
Später in diesem Tutorial wird klar, wie selbstverständlich das Zusammenspiel der beiden Bibliotheken ist.
Mit NumPy und SciPy arbeiten
Um mit beiden Paketen effizient zu arbeiten, solltest du zunächst die Grundlagen dieser Bibliothek und ihrer mächtigen Datenstruktur kennen. Für die Arbeit mit Arrays gibt es eine große Zahl hochstufiger mathematischer Funktionen, die auf Matrizen und Arrays operieren.
Im Folgenden bekommst du einen schnellen Überblick über die Themen, die du beherrschen solltest, um mit SciPy effizient zu arbeiten. Im Kern geht es darum, die Array-Struktur zu verstehen, Datentypen zu handhaben und die Form von Arrays zu manipulieren. Wenn dir das fremd vorkommt, empfiehlt sich DataCamps Python NumPy Tutorial; wirf beim Lernen auch einen Blick auf das NumPy-Cheat Sheet.
Wenn du das schon drauf hast, spring zum Abschnitt „Lineare Algebra mit SciPy“ – halte aber das SciPy-Cheat Sheet für lineare Algebra bereit!
Das Wichtigste zu NumPy ndarray-Objekten
Ein Array ist strukturell gesehen nichts weiter als Zeiger: eine Kombination aus Speicheradresse, Datentyp, Form und Strides. Es enthält Informationen über die Rohdaten, wie ein Element gefunden und wie es interpretiert wird.
Speicheradresse und Strides sind wichtig, wenn du in die Low-Level-Details von Arrays eintauchst, während Datentyp und Form Grundlagen sind, die Einsteiger unbedingt kennen sollten. Zwei weitere nützliche Attribute sind data und size, mit denen du noch mehr Informationen zu deinem Array erhältst.
Auffrische die Verwendung der ndarray-Attribute im folgenden DataCamp-Light-Block. Das Array myArray ist bereits geladen. Du kannst es inspizieren, indem du es in die IPython-Shell eingibst und ENTER drückst.
Du wirst in den Ergebnissen des obigen Code-Blocks sehen, dass der Datentyp von myArray int64 ist. Wenn du intensiv mit Arrays arbeitest, wirst du dir merken, dass du mit der Methode astype() Arrays von einem Datentyp in einen anderen konvertieren kannst.
Wenn du SciPy und NumPy zusammen nutzt, sind zudem folgende NumPy-Funktionen für die Typbehandlung nützlich – besonders bei komplexen Zahlen:
Füge print()-Aufrufe hinzu, um die Ergebnisse zu sehen. Dann erkennst du: Komplexe Zahlen haben einen Real- und einen Imaginärteil. Die Funktionen np.real() und np.imag() liefern dir jeweils diese Teile.
Alternativ kannst du mit np.cast ein Array-Objekt in einen anderen Datentyp casten, etwa in float wie im Beispiel.
Etwas kniffliger ist np.real_if_close(). Übergibst du eine komplexe Eingabe wie myArray, bekommst du ein reales Array zurück, wenn die komplexen Anteile „nahe 0“ sind. Diese Schwelle kannst du mit dem Argument tol steuern. Spiele mit dem Schwellenwert und schau, was passiert!
Arrays erstellen
Du hast gesehen, wie du dein Array inspizierst und seinen Datentyp änderst, aber noch nicht explizit, wie du Arrays erstellst. Du weißt sicher, dass du dazu np.array() nutzen kannst, aber es gibt weitere Routinen, die du kennen solltest: np.eye() und np.identity().
Mit np.eye() erstellst du eine quadratische Matrix mit Dimensionen entsprechend der übergebenen positiven Ganzzahl. Die Einträge sind Null, nur die Diagonale enthält Einsen. np.identity() funktioniert ebenso und gibt ebenfalls eine Einheitsmatrix zurück.
Beachte, dass np.eye() ein zusätzliches Argument k akzeptiert, mit dem du den Index der Diagonale angibst, die mit Einsen befüllt werden soll.
Weitere hilfreiche Funktionen zur Array-Erzeugung für lineare Algebra sind:
np.arange()erzeugt ein Array mit gleichmäßig verteilten Werten zwischen zwei Zahlen; den Abstand zwischen den Elementen kannst du vorgeben,np.linspace()liefert ebenfalls gleichmäßig verteilte Werte, hier gibst du aber die Anzahl der Elemente an,np.logspace()erstellt gleichmäßig verteilte Werte auf einer logarithmischen Skala, d. h. die Abstände sind im Log10-Raum gleichmäßig.
Diese Funktionen erzeugen Wertegitter, die du etwa für Meshgrids verwenden kannst – wie weiter oben erwähnt.
Hinweis: numpy ist im folgenden Code bereits als np importiert!
Jetzt, da dein Gedächtnis zu Datentypen aufgefrischt ist, geht es an Indexing und Slicing.
Indexing und Slicing
Beim Indexing nutzt du eckige Klammern [], um auf Array-Werte zuzugreifen. So kannst du eine Teilmenge von Elementen auswählen. Slicing ist dem Subsetting ähnlich, geht aber weiter: Statt einzelner Positionen arbeitest du mit „Bereichen“ deiner Daten.
Frische beides mit diesen Beispielen auf:
Wenn Indexing und Slicing sitzen, helfen dir ein paar Index-Tricks, effizienter zu arbeiten. Vier Funktionen wirst du öfter sehen: np.mgrid(), np.ogrid(), np.r und np.c.
Die letzten beiden kennst du vielleicht schon: np.r und np.c nutzt du, um Arrays zeilen- bzw. spaltenweise zu stapeln – oft schneller, als np.concatenate() zu schreiben.
Warum Meshgrids? Damit erzeugst du zwei Arrays, die an jeder Position eines rechtwinkligen Gitters die x- und y-Koordinaten enthalten. np.meshgrid() nimmt zwei 1D-Arrays und gibt zwei 2D-Matrizen mit allen Paaren (x, y) zurück.
np.mgrid()ist wie MATLABs meshgrid und liefert Arrays gleicher Form – Dimensionen und Anzahl der Ausgabe-Arrays entsprechen der Anzahl der Indexdimensionen.np.ogrid()erzeugt ein „offenes“ Meshgrid und ist weniger dicht als das Ergebnis vonnp.mgrid(). Den visuellen Unterschied siehst du oben.
Mehr zu den Unterschieden findest du hier.
Eine weitere Funktion für index-/slice-basierte Auswahlen ist np.select(). Damit gibst du Bedingungen an (erstes Argument) und legst fest, aus welchen Arrays Werte entsprechend dieser Bedingungen ausgewählt werden (zweites Argument).
Sieh dir dieses Beispiel an:
Super! Nachdem du die passenden Werte aus deinem Ursprungsarray gewählt hast, kannst du weiterhin die Form auswählen und dein neues Array manipulieren.
Formauswahl und -manipulation
NumPy bietet viele Möglichkeiten, die Form deiner Arrays zu wählen und zu verändern – vieles davon kennst du wahrscheinlich schon. Hier folgt ein kurzer Überblick über besonders nützliche Funktionen.
Welche sind im Zusammenspiel mit SciPy am hilfreichsten?
Vor allem jene, mit denen du Arrays abflachen, stapeln und teilen kannst. np.c und np.r hast du schon gesehen; oft sind sie praktischer als np.concatenate(). Daneben solltest du kennen:
np.hstack() zum horizontalen, np.vstack() zum vertikalen Stapeln. Entsprechend trennen np.hsplit() und np.vsplit() Arrays horizontal bzw. vertikal. Beweise es im folgenden Codeblock:
Denk daran: np.eye() erstellt eine 2×2-Einheitsmatrix – perfekt, um sie mit dem 2D-Array aus dem Codeblock zu stapeln.
Mehr zu den Bedingungen fürs Stapeln findest du hier. Du kannst dir die „Regeln“ aber auch durch Ausprobieren schnell erschließen.
Beim Splitten ist die Form deines Arrays entscheidend, damit du den richtigen Index für die Teilung wählst.
Neben Stapel- und Split-Funktionen sind auch Funktionen wichtig, die sicherstellen, dass du mit Arrays einer bestimmten Dimension arbeitest – unverzichtbar im wissenschaftlichen Rechnen.
Betrachte diese Funktionen:
Hinweis zum Unterschied zwischen Reshape und Resize: Beim Reshapen änderst du nur die Form, nicht die Daten. Beim Resizing können sich – je nach gewählter Form – auch die enthaltenen Daten ändern.
Neben diesen Routinen und den Funktionen zur Array-Manipulation spielt auch „Vektorisierung“ eine Rolle. Wendest du eine Funktion auf ein Array an, arbeitet sie in der Regel elementweise – etwa np.cos(), np.sin() oder np.tan(). Wenn das funktioniert, ist die Funktion vektorisiert.
Definierst du eigene Funktionen – was im wissenschaftlichen Rechnen oft der Fall ist –, kannst du sie mit np.vectorize() vektorisieren:
Neben np.angle() für den Winkel komplexer Elemente sind auch grundlegende trigonometrische, Exponential- und Logarithmusfunktionen hilfreich.
Lineare Algebra mit SciPy
Jetzt, da du weißt, wie du beide Pakete zu deinem Vorteil nutzt, geht es ans eigentliche Thema: lineare Algebra.
Bevor du startest, stelle sicher, dass deine Umgebung bereit ist!
SciPy installieren
Stelle zunächst sicher, dass Python installiert ist. Gehe auf diese Seite, falls nicht :) Wenn du mit Windows arbeitest, füge Python zur PATH-Umgebungsvariable hinzu. Installiere außerdem einen Paketmanager wie pip, damit du die Open-Source-Bibliotheken von Python nutzen kannst.
Neuere Python-3-Versionen bringen pip bereits mit. Prüfe, ob es vorhanden ist, und aktualisiere es, bevor du weitere Pakete installierst:
pip install pip --upgrade pip --version
Nicht nur der Paketmanager ist nötig; Du brauchst auch das Wheel der Bibliothek: Lade es dir hier herunter. Öffne danach das Terminal im Download-Ordner auf deinem PC und installiere das Wheel. Prüfe zusätzlich, ob die Installation erfolgreich war und welche Version läuft:
# Install the wheel install "scipy‑0.18.1‑cp36‑cp36m‑win_amd64.whl"# Confirm successful installimport scipy# Check package versionscipy.__version__
Nach diesen Schritten kannst du loslegen!
Tipp: Installiere das Paket mit der Anaconda-Python-Distribution. So bist du schnell startklar, denn Anaconda bringt nicht nur 100 der beliebtesten Python-, R- und Scala-Pakete für Data Science mit, sondern auch Entwicklungsumgebungen wie Jupyter und Spyder. Wenn du mit Jupyter Notebook loslegen willst, sieh dir dieses Jupyter-Notebook-Tutorial an.
Wenn du Anaconda noch nicht hast, lade es hier herunter.
Vektoren und Matrizen: Die Basics
Nachdem deine Umgebung steht, kannst du endlich mit linearer Algebra in Python anfangen. Im Kern beschäftigt sich dieses Gebiet mit Vektorräumen und den linearen Abbildungen zwischen ihnen. Diese Abbildungen lassen sich mit Matrizen beschreiben – und damit auch leichter berechnen.
Merke: Ein Vektorraum ist ein grundlegendes Konzept der linearen Algebra. Er ist ein Raum, in dem du Vektoren addieren und skalieren kannst, ohne den Raum zu verlassen. Vektoren sind dabei Zeilen oder Spalten einer Matrix.
Wie setzt du das in Python um?
Mit np.array() erstellst du Vektoren. Eine oder zweidimensionale ndarray-Objekte kannst du mit np.matrix() oder np.mat() als Matrizen interpretieren.
Probier es aus:
Sind Arrays und Matrizen also gleich – abgesehen von der Darstellung?
Nicht ganz. Es gibt Unterschiede:
- Eine Matrix ist 2D, Arrays sind meist
n-dimensional, - Die Matrix ist eine Unterklasse von
ndarray, - Arrays und Matrizen haben
.T(), aber nur Matrizen haben.H()und.I(), - Matrixmultiplikation unterscheidet sich von elementweiser Array-Multiplikation und
- Der Operator
**verhält sich bei Matrizen anders als bei Arrays.
Manchmal arbeitest du mit Matrizen, in denen die meisten Elemente Null sind. Diese heißen „Sparse-Matrizen“, während Matrizen mit überwiegend von Null verschiedenen Einträgen „dicht“ sind.
Klingt trivial, ist aber für SciPy relevant: Für dichte Matrizen nutzt du scipy.linalg, für Sparse-Matrizen scipy.sparse sowie dessen scipy.sparse.linalg.
Für Sparse-Matrizen gibt es mehrere Erzeugungswege. Einige davon:
Weitere Optionen: Block-Sparse-Row-Matrizen mit bsr_matrix(), Koordinatenformat mit coo_matrix(), Diagonalspeicher mit dia_matrix() und zeilenbasierte verkettete Listen mit lil_matrix().
Welche wählst du nun?
Die Entscheidung hängt davon ab, wie du initialisierst und was du später damit tust.
Diese Checkliste hilft bei der Wahl:
- Füllst du die Matrix Element für Element, nutze
coo_matrix()oderdok_matrix(). - Initialisierst du mit einem Array als Diagonale, nimm
dia_matrix(). - Für slice-basierte Matrizen verwende
lil_matrix(). - Baust du aus Blöcken kleinerer Matrizen, nutze
bsr_matrix(). - Brauchst du schnellen Zugriff auf Zeilen bzw. Spalten, konvertiere mit
csr_matrix()bzw.csc_matrix(). Diese eignen sich weniger zur Initialisierung, sind aber bei Multiplikationen deutlich schneller.
Klingt machbar!
Vektoroperationen
Nachdem du den Unterschied zwischen Vektoren, dichten und Sparse-Matrizen kennst, schauen wir uns Vektoren und grundlegende Operationen darauf an. Der Fokus liegt hier bewusst auf mathematischen Operationen, um Parallelen und Unterschiede zu Matrizen zu sehen – denn ein Großteil der linearen Algebra arbeitet letztlich mit Matrizen.
Vektoren erstellst du mit np.array(). Für die folgenden Beispiele sind vector1 und vector2 bereits geladen:
Jetzt, da du Vektoroperationen gemeistert hast, geht’s an die eigentliche Matrixarbeit!
Matrizen: Operationen und Routinen
Du weißt, wie man Matrizen erstellt – aber wie nutzt du sie effektiv? Hier ein Überblick über nützliche Matrixfunktionen und grundlegende Routinen.
Zunächst einige Funktionen. Wenn du NumPy kennst, kommen sie dir bekannt vor. Andernfalls wirst du sehen: Der Einstieg ist leicht.
Beispiele: np.add() und np.subtract() zum Addieren und Subtrahieren von Arrays oder Matrizen, außerdem np.divide() und np.multiply für Division und Multiplikation. Auch np.dot() aus dem Vektorabschnitt funktioniert mit Matrizen – übergib dann zwei Matrizen statt Vektoren.
Soweit die Basics.
Etwas weiterführend: np.vdot() für das Skalarprodukt von Vektoren, np.inner() und np.outer() für innere bzw. äußere Produkte von Arrays, np.tensordot() sowie np.kron() für das Kronecker-Produkt zweier Arrays:
Tipp: Füge Print-Statements ein, um die Ergebnisse der einzelnen Produkte zu sehen.
Nützlich sind außerdem Funktionen aus dem Modul linalg: die Matrix-Exponentialfunktionen linalg.expm(), linalg.expm2() und linalg.expm3(). Sie unterscheiden sich in der Berechnungsmethode. Für allgemeine Fälle nutze expm(), probiere aber alle drei aus.
Dazu trigonometrische Funktionen wie linalg.cosm(), linalg.sinm(), linalg.tanm(), ihre hyperbolischen Varianten linalg.coshm(), linalg.sinhm(), linalg.tanhm(), die Vorzeichenfunktion linalg.signm(), der Matrixlogarithmus linalg.logm() und die Matrixwurzel linalg.sqrtm().
Du kannst Matrixfunktionen auch mit linalg.funm() auswerten. Beispiel:
Du übergibst als erstes die Matrix und als zweites die anzuwendende Funktion (hier eine Lambda-Funktion). Die Funktion muss vektorisiert sein.
Nun zu grundlegenden Matrixroutinen. Spannend sind zuerst die Matrix-Attribute: T für Transponieren, H für konjugiert Transponieren, I für die Inverse und A zum Cast in ein Array.
Probier’s aus:
Beim Transponieren werden Zeilen und Spalten vertauscht. Die konjugiert Transponierte vertauscht ebenfalls Zeilen/Spalten und bildet zusätzlich die komplex Konjugierten. Die Inverse ist die Matrix, die mit der Originalmatrix multipliziert die Einheitsmatrix ergibt.
Neben den Attributen gibt es Funktionen wie np.transpose() und linalg.inv() für Transposition und Inverse.
Mit np.trace() holst du die Spur (Summe der Hauptdiagonale). Mit linalg.matrix_rank aus NumPy bekommst du den Rang – also die Anzahl der SVD-Singularwerte, die größer als ein bestimmter Schwellwert sind.
Falls dir der Matrizenrang noch nichts sagt: Gleich kommt mehr dazu.
Zwei weitere wichtige Routinen:
- Die Norm einer Matrix berechnest du mit
linalg.norm. Sie liefert eine Kennzahl über die Größe der Einträge. - Die Determinante mit
linalg.det()fasst eine quadratische Matrix zu einer Zahl zusammen und zeigt u. a., ob sie invertierbar ist.
Das Lösen großer linearer Gleichungssysteme gehört zu den Basisanwendungen von Matrizen. Für ein System \(Ax = b\), mit quadratischem \(A\) und allgemeinem \(b\), hast du – je nach Matrixtyp – mehrere Optionen:
Für Sparse-Matrizen nutzt du linalg.spsolve(). Falls sich das System nicht lösen lässt, kannst du mit linalg.lstsq() eine Näherung für \(x\) finden.
Tipp: Verpasse nicht das SciPy-Cheat Sheet.
Jetzt, da du weißt, wie du Matrizen erzeugst und für Berechnungen nutzt, geht es an fortgeschrittene Themen, die du für Machine Learning brauchst.
Eigenwerte und Eigenvektoren
Als Erstes kommen Eigenwerte und Eigenvektoren.
Eigenwerte erlauben einen Blick ins „Herz“ einer Matrix. Zuerst jedoch: Was sind Eigenvektoren? Fast alle Vektoren ändern ihre Richtung, wenn sie mit einer Matrix multipliziert werden. Einige besondere Vektoren zeigen jedoch in die gleiche Richtung wie zuvor – das sind die Eigenvektoren.
Anders formuliert: Multiplizierst du einen Eigenvektor mit einer Matrix, ist das Ergebnis gleich dem ursprünglichen Eigenvektor multipliziert mit \(\lambda\), dem Eigenwert: \[Ax = \lambda x. \]
Der Eigenwert verrät, ob ein Eigenvektor durch die Matrix gestreckt, gestaucht, umgekehrt oder unverändert bleibt.
Mit eig() aus SciPys linalg-Modul löst du (verallgemeinerte) Eigenwertprobleme für quadratische Matrizen.
eigvals() gibt dir alternativ nur die Eigenwerte zurück.
Für Sparse-Matrizen nutzt du das Modul scipy.sparse, z. B. so:
la, v = sparse.linalg.eigs(myMatrix,1)
Beachte: Im Code oben wird die Anzahl der zurückzugebenden Eigenwerte/-vektoren auf 1 festgelegt.
Eigenwerte und -vektoren sind zentrale Bausteine vieler Computer-Vision- und Machine-Learning-Verfahren, etwa Principal Component Analysis (PCA) zur Dimensionsreduktion oder EigenFaces zur Gesichtserkennung.
Singulärwertzerlegung (SVD)
Als Nächstes: SVD – ein Muss, wenn du Data Science richtig lernen willst. Die Singulärwertzerlegung einer Matrix \(A\) ist die Zerlegung von \(A\) in das Produkt dreier Matrizen: \(A = U * \Sigma * V^t\).
Wenn \(A\) die Größe \(M\) × \(N\) hat, dann gilt:
- \(U\) ist \(M\) × \(M\)
- \(V\) ist \(N\) × \(N\)
- \(\Sigma\) ist \(M\) × \(N\)
Das \(*\) steht für Matrixmultiplikation, \(^t\) für die Transponierte.
Einfach gesagt: SVD zerlegt eine Matrix in einfachere, sinnvolle Bestandteile – die oft genau die Informationen tragen, die uns interessieren.
Hinweis: Für Sparse-Matrizen nutzt du sparse.linalg.svds().
Wenn du neu in Data Science bist, wirkt die Zerlegung zunächst abstrakt. SVD ist aber in vielen Aufgaben nützlich, z. B. bei Kompression, Rauschunterdrückung oder Datenanalyse. Im folgenden Beispiel siehst du, wie SVD zur Bildkompression eingesetzt wird:
# Import the necessary packagesimport numpy as npfrom scipy import linalgfrom skimage import dataimport matplotlib.pyplot as plt# Get an image from `skimage`img= data.camera()# Check number of singular valueslinalg.svdvals(img)# Singular Value DecompositionU, s, Vh = linalg.svd(img)# Use only 32 singular valuesA = np.dot(U[:,0:32], np.dot(np.diag(s[0:32]), Vh[0:32,:]))fig = plt.figure(figsize=(8, 3))# Add a subplot to the figureax = fig.add_subplot(121)# Plot `img` on grayscaleax.imshow(img, cmap='gray')# Add a second subplot to the figureax2 = fig.add_subplot(122)# Plot `A` in the second subplotax2.imshow(A)# Add a titlefig.suptitle('Image Compression with SVD', fontsize=14, fontweight='bold')# Show the plotplt.show()
Das ergibt folgendes Bild:

Noch zwei Beispiele, wo SVD eingesetzt wird:
- Enge Verbindung zu Principal Component Analysis (PCA) für Dimensionsreduktion: Beide liefern „neue Achsen“, konstruiert als Linearkombinationen der ursprünglichen Merkmalsachsen. Diese „neuen Achsen“ zerlegen die Varianz der Datenpunkte nach ihrem Beitrag zur Gesamtvarianz. Ein praktisches Beispiel findest du im Scikit-Learn-Tutorial.
- Ein weiteres Feld ist Data Mining und Natural Language Processing (NLP): Latent Semantic Indexing (LSI). Diese Technik dient der Dokumentenrecherche und Wortähnlichkeit. LSI nutzt SVD, um Dokumente zu den Konzepten zu gruppieren, die aus verschiedenen darin enthaltenen Wörtern bestehen können. So werden Rauscheffekte reduziert und die Dimensionalität gesenkt.
Du siehst: SVD ist ein wichtiger Meilenstein auf deiner Data-Science-Reise. Gehe ruhig tiefer als dieses Tutorial – zum Beispiel hier.
Wie geht’s weiter?
Geschafft – du bist am Ende des Tutorials! Wie es für dich weitergeht, liegt ganz bei dir.
Aber Moment!
Verpasse keine Kurse, die tiefer in lineare Algebra eintauchen: Dieses Tutorial ist nur ein Einstieg und deckt nicht alles ab!
Schau dir unbedingt auch DataCamps Machine-Learning-Tutorial an – eine wertvolle Ergänzung zu deinem Lernprogramm nach diesem SciPy-Tutorial zur linearen Algebra. Wenn du die Grundlagen auffrischen willst, arbeite unser NumPy-Tutorial oder den Kurs Intermediate Python for Data Science durch.
