Skip to content
Menu
Saayarelo
Saayarelo

KDnuggets

Posted on Januar 10, 2022
By Matthew Mayo, KDnuggets.

Die meisten Praktiker des maschinellen Lernens sind daran gewöhnt, eine Matrixdarstellung ihrer Datensätze anzunehmen, bevor sie die Daten in einen Algorithmus für maschinelles Lernen einspeisen. Matrizen sind eine ideale Form dafür, wobei die Zeilen in der Regel die Instanzen des Datensatzes und die Spalten die Merkmale darstellen.

Eine dünnbesetzte Matrix ist eine Matrix, in der die meisten Elemente Nullen sind. Dies steht im Gegensatz zu einer dichten Matrix, deren Unterscheidungsmerkmal Sie an dieser Stelle wahrscheinlich ohne Hilfe herausfinden können.

Abbildung

Bildquelle: TU Berlin

Oft sind unsere Daten dicht, mit Merkmalsspalten, die für jede Instanz, die wir haben, ausgefüllt sind. Wenn wir eine endliche Anzahl von Spalten verwenden, um etwas robust zu beschreiben, haben die zugewiesenen beschreibenden Werte für einen bestimmten Datenpunkt in der Regel alle Hände voll zu tun, um eine aussagekräftige Darstellung zu liefern: eine Person, ein Bild, eine Iris, Immobilienpreise, ein potenzielles Kreditrisiko.

Es gibt jedoch auch Daten, die eine solche Ausführlichkeit in ihrer Darstellung nicht benötigen. Denken Sie an Beziehungen. Es mag eine große Anzahl potenzieller Dinge geben, deren Beziehungsstatus wir erfassen müssen, aber an der Schnittstelle dieser Dinge müssen wir vielleicht einfach nur festhalten: ja, es gibt eine Beziehung, oder nein, es gibt keine.

Hat diese Person diesen Gegenstand gekauft? Kommt in diesem Satz dieses Wort vor? Es gibt viele potenzielle Wörter, die in einem beliebigen Satz vorkommen könnten, aber nur wenige von ihnen kommen tatsächlich vor. Ähnlich kann es viele Artikel geben, die zum Verkauf stehen, aber eine einzelne Person wird nicht viele davon gekauft haben.

Dies ist eine Möglichkeit, wie spärliche Matrizen beim maschinellen Lernen ins Spiel kommen. Stellen Sie sich eine Spalte als Artikel für Verkäufe und Zeilen als Käufer vor. Für jeden Schnittpunkt, an dem ein bestimmter Artikel nicht von einem bestimmten Käufer gekauft wurde, müsste eine „Nein“-Darstellung (Null), z. B. eine 0, vorhanden sein. Nur für Schnittpunkte, an denen der bestimmte Artikel von einem bestimmten Käufer gekauft wurde, müsste eine „Ja“-Darstellung, z. B. eine 1, vorhanden sein. Dasselbe gilt für das Vorkommen bestimmter Wörter in bestimmten Sätzen. Sie können sich vorstellen, warum solche Matrizen viele Nullen enthalten würden, was bedeutet, dass sie spärlich sind.

Ein Problem, das bei spärlichen Matrizen auftritt, ist, dass sie den Speicher sehr belasten können. Wenn man einen Standardansatz für die Darstellung einer 2×2-Matrix wählt, müssen Zuweisungen für jede Null-Darstellung im Speicher vorgenommen werden, obwohl keine nützlichen Informationen erfasst werden. Diese Speicherbelastung setzt sich auch auf dem permanenten Speicher fort. Bei einem Standardansatz zur Matrixdarstellung sind wir gezwungen, auch die Abwesenheit einer Sache aufzuzeichnen, im Gegensatz zu ihrer bloßen Anwesenheit.

Aber halt. Es muss doch einen besseren Weg geben!

Zufällig gibt es einen. Spärliche Matrizen müssen nicht in der Standardmatrixform dargestellt werden. Es gibt eine Reihe von Ansätzen, um den Stress zu verringern, den diese Standardform unseren Rechensystemen auferlegt, und zufälligerweise akzeptieren einige Algorithmen im weit verbreiteten Python-Workhorse für maschinelles Lernen Scikit-learn einige dieser spärlichen Darstellungen als Eingabe. Wenn Sie sich damit vertraut machen, können Sie Zeit, Ärger und Verstand sparen.

Wie können wir diese spärlichen Matrizen besser darstellen? Wir brauchen eine Art und Weise, in der wir verfolgen können, wo Nullen nicht sind. Wie wäre es mit einer zweispaltigen Tabelle, in der wir in einer Spalte row,col festhalten, wo ein Element ungleich Null existiert, und den entsprechenden Wert in der anderen Spalte? Denken Sie daran, dass spärliche Matrizen nicht unbedingt nur Nullen und Einsen enthalten müssen; solange die meisten Elemente Nullen sind, ist die Matrix spärlich, unabhängig davon, was in den Nicht-Null-Elementen vorkommt.

Wir brauchen auch eine Reihenfolge, in der wir die spärliche Matrix erstellen – gehen wir Zeile für Zeile vor und speichern jedes Nicht-Null-Element, wenn wir darauf stoßen, oder gehen wir spaltenweise vor? Wenn wir uns dafür entscheiden, zeilenweise vorzugehen, haben Sie soeben eine komprimierte dünnbesetzte Zeilenmatrix erstellt – herzlichen Glückwunsch! Wenn Sie spaltenweise vorgehen, haben Sie jetzt eine komprimierte spärliche Spaltenmatrix. Praktischerweise bietet Scipy Unterstützung für beides.

Schauen wir uns an, wie man diese Matrizen erstellt. Zuerst erstellen wir eine einfache Matrix in Numpy.

import numpy as npfrom scipy import sparseX = np.random.uniform(size=(6, 6))print(X)
 ]

Dann müssen wir einen Großteil der Matrixelemente auf Null setzen, damit sie spärlich wird.

X = 0print(X)
 ]

Nun speichern wir die Standardmatrix X als komprimierte spärliche Zeilenmatrix. Dazu werden die Elemente zeilenweise von links nach rechts durchlaufen und in diese komprimierte Matrixdarstellung eingetragen, wenn sie auf sie stoßen.

X_csr = sparse.csr_matrix(X)print(X_csr)
 (0, 0)0.799042106215471 (0, 1)0.7662107548809229 (0, 3)0.7260679774297479 (0, 5)0.9083885095042665 (2, 0)0.9223461264672205 (2, 1)0.7823169848589594 (2, 4)0.7889976504606654 (3, 1)0.7222135307432606 (4, 4)0.9004315651436953 (4, 5)0.8787011979799789 (5, 0)0.7136004887949333 (5, 3)0.9614800409505844

Presto!

Und was ist mit einer komprimierten Sparse-Spaltenmatrix? Zu ihrer Erstellung werden die Elemente spaltenweise von oben nach unten durchlaufen und in die komprimierte Darstellung eingetragen, sobald sie gefunden werden.

X_csc = sparse.csc_matrix(X)print(X_csc)
 (0, 0)0.799042106215471 (2, 0)0.9223461264672205 (5, 0)0.7136004887949333 (0, 1)0.7662107548809229 (2, 1)0.7823169848589594 (3, 1)0.7222135307432606 (0, 3)0.7260679774297479 (5, 3)0.9614800409505844 (2, 4)0.7889976504606654 (4, 4)0.9004315651436953 (0, 5)0.9083885095042665 (4, 5)0.8787011979799789

Beachten Sie die Unterschiede zwischen den resultierenden Sparse-Matrix-Darstellungen, insbesondere den Unterschied in der Position der gleichen Elementwerte.

Wie bereits erwähnt, akzeptieren viele Scikit-Learn-Algorithmen scipy.sparse-Matrizen der Form anstelle von Numpy-Arrays, so dass es nicht zwingend erforderlich ist, sie an dieser Stelle zurück in die Standard-Numpy-Darstellung zu transformieren. Es könnten auch Speicherbeschränkungen bestehen, die eine solche Umwandlung verhindern (dies war einer der Hauptgründe für die Verwendung dieses Ansatzes). Zur Veranschaulichung zeigen wir hier, wie eine dünn besetzte Scipy-Matrixdarstellung in ein mehrdimensionales Numpy-Array umgewandelt wird.

print(X_csr.toarray())
 ]

Und wie sieht es mit dem Unterschied im Speicherbedarf zwischen den beiden Darstellungen aus? Gehen wir den Prozess noch einmal durch, indem wir mit einer größeren Matrix in der Standard-Numpy-Form beginnen und dann den Speicher (in Bytes) berechnen, den jede Darstellung benötigt.

import numpy as npfrom scipy import sparseX = np.random.uniform(size=(10000, 10000))X = 0X_csr = sparse.csr_matrix(X)print(f "Size in bytes of original matrix: {X.nbytes}")print(f "Size in bytes of compressed sparse row matrix: {X_csr.data.nbytes + X_csr.indptr.nbytes + X_csr.indices.nbytes}")
Size in bytes of original matrix: 800000000Size in bytes of compressed sparse row matrix: 360065312

Hier sehen Sie, dass die komprimierte Matrixform im Vergleich zur Standard-Numpy-Darstellung eine erhebliche Speicherersparnis bringt, etwa 360 Megabyte gegenüber 800 Megabyte. Das ist eine Einsparung von 440 Megabyte, und das fast ohne Zeitaufwand, da die Konvertierung zwischen den Formaten stark optimiert ist. Natürlich können diese spärlichen SciPy-Matrizen auch direkt erstellt werden, wodurch der speicherfressende Zwischenschritt eingespart wird.

Stellen Sie sich nun vor, Sie arbeiten an einem riesigen Datensatz, und denken Sie an die Speichereinsparungen (und die damit verbundenen Speicher- und Verarbeitungszeiten), die Sie durch die korrekte Verwendung eines spärlichen Matrixformats erzielen könnten.

Verwandt:

  • Vergleich von Abstandsmessungen mit Python und SciPy
  • Notizen zur Merkmalsvorverarbeitung: Das Was, das Warum und das Wie
  • Nichts als NumPy: Verstehen & Neuronale Netze mit Computergraphen von Grund auf neu erstellen

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Neueste Beiträge

  • Was macht den Labyrinthfisch anders?
  • Systemische Kortikosteroide werden häufig bei Psoriasis verschrieben
  • 5 Fragen mit … Melissa McGurren | RSN
  • Die neutestamentlichen Bücher der Bibel
  • Tilapia Almondine
  • Männerhaartypen: Pflege + 12 Styling-Ideen
  • 15 Texting and Driving Quotes and Slogans to Reminder You to Stay off Your Phone
  • 101 Best Art Captions for Instagram
  • Zahnmedizin
  • Was ist Schneeschimmel? (And How to Get Rid of It)

Archive

  • Februar 2022
  • Januar 2022
  • Dezember 2021
  • November 2021
  • Oktober 2021
  • Deutsch
  • Nederlands
  • Svenska
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
©2022 Saayarelo | WordPress Theme: EcoCoded