Erstens wird die Dimensionsreduktion verwendet, wenn Sie viele kovariierte Dimensionen haben und die Problemgröße reduzieren möchten, indem Sie Datenpunkte auf eine neue orthogonale Basis drehen und nur Achsen mit der größten Varianz nehmen. Mit 8 Variablen (Spalten) ist Ihr Speicherplatz bereits niedrig dimensioniert. Wenn Sie die Anzahl der Variablen weiter verringern, werden technische Probleme mit der Speichergröße wahrscheinlich nicht gelöst, die Datenqualität kann jedoch erheblich beeinträchtigt werden. In Ihrem konkreten Fall ist es vielversprechender, einen Blick auf das Online-Lernen zu werfenMethoden. Anstatt mit dem gesamten Datensatz zu arbeiten, nehmen diese Methoden grob gesagt jeweils einen kleinen Teil von ihnen (oft als "Mini-Batches" bezeichnet) und erstellen inkrementell ein Modell. (Ich persönlich interpretiere das Wort "online" gerne als Hinweis auf eine unendlich lange Datenquelle aus dem Internet wie einen Twitter-Feed, bei dem Sie nicht den gesamten Datensatz auf einmal laden können.)
Aber was ist, wenn Sie wirklich Dimensionalitätsreduzierungstechniken wie PCA auf einen Datensatz anwenden möchten, der nicht in ein Gedächtnis passt? Normalerweise wird ein Datensatz als Datenmatrix X der Größe n x m dargestellt , wobei n die Anzahl der Beobachtungen (Zeilen) und m die Anzahl der Variablen (Spalten) ist. Typischerweise entstehen Speicherprobleme nur durch eine dieser beiden Zahlen.
Zu viele Beobachtungen (n >> m)
Wenn Sie zu viele Beobachtungen haben , die Anzahl der Variablen jedoch zwischen klein und moderat liegt, können Sie die Kovarianzmatrix schrittweise erstellen . Tatsächlich besteht eine typische PCA darin, eine Kovarianzmatrix der Größe m × m zu konstruieren und eine Singularwertzerlegung darauf anzuwenden. Mit m = 1000 Variablen vom Typ float64 hat eine Kovarianzmatrix eine Größe von 1000 * 1000 * 8 ~ 8 MB, die leicht in den Speicher passt und mit SVD verwendet werden kann. Sie müssen also nur die Kovarianzmatrix erstellen, ohne den gesamten Datensatz in den Speicher zu laden - eine ziemlich nachvollziehbare Aufgabe .
Alternativ können Sie eine kleine repräsentative Stichprobe aus Ihrem Datensatz auswählen und die Kovarianzmatrix approximieren . Diese Matrix hat dieselben Eigenschaften wie normal, ist jedoch etwas ungenauer.
Zu viele Variablen (n << m)
Andererseits passt manchmal, wenn Sie zu viele Variablen haben , die Kovarianzmatrix selbst nicht in den Speicher. Wenn Sie beispielsweise mit 640 x 480 Bildern arbeiten, hat jede Beobachtung 640 * 480 = 307200 Variablen, was zu einer 703-GB-Kovarianzmatrix führt! Das ist definitiv nicht das, was Sie im Speicher Ihres Computers oder sogar im Speicher Ihres Clusters behalten möchten. Wir müssen also die Dimensionen reduzieren, ohne überhaupt eine Kovarianzmatrix zu erstellen.
Meine Lieblingsmethode ist die Zufallsprojektion . Kurz gesagt, wenn Sie einen Datensatz X der Größe n x m haben , können Sie ihn mit einer spärlichen Zufallsmatrix R der Größe m x k (mit k << m ) multiplizieren und eine neue Matrix X ' mit einer viel kleineren Größe n x k erhalten mit ungefähr den gleichen Eigenschaften wie die ursprüngliche. Warum funktioniert es? Nun, Sie sollten wissen, dass PCA darauf abzielt, orthogonale Achsen (Hauptkomponenten) zu finden und Ihre Daten auf das erste k zu projizierenvon ihnen. Es zeigt sich, dass spärliche Zufallsvektoren nahezu orthogonal sind und somit auch als neue Basis verwendet werden können.
Und natürlich müssen Sie nicht den gesamten Datensatz X mit R multiplizieren - Sie können jede Beobachtung x einzeln oder in kleinen Mengen in die neue Basis übersetzen .
Es gibt auch einen ähnlichen Algorithmus namens Random SVD . Ich habe keine wirklichen Erfahrungen damit, aber Sie können hier Beispielcode mit Erklärungen finden .
Im Folgenden finden Sie eine kurze Checkliste zur Reduzierung der Dimensionalität großer Datensätze:
- Wenn Sie nicht so viele Dimensionen (Variablen) haben, verwenden Sie einfach Online-Lernalgorithmen.
- Wenn es viele Beobachtungen gibt, aber eine moderate Anzahl von Variablen (Kovarianzmatrix passt in den Speicher), konstruieren Sie die Matrix inkrementell und verwenden Sie die normale SVD.
- Wenn die Anzahl der Variablen zu hoch ist, verwenden Sie inkrementelle Algorithmen.