Wie mache ich SVD und PCA mit Big Data?


29

Ich habe eine große Datenmenge (ca. 8 GB). Ich möchte maschinelles Lernen nutzen, um es zu analysieren. Daher denke ich, dass ich SVD und dann PCA verwenden sollte, um die Datendimensionalität aus Gründen der Effizienz zu reduzieren. MATLAB und Octave können jedoch einen so großen Datensatz nicht laden.

Mit welchen Tools kann ich SVD mit einer so großen Datenmenge erstellen?


Hallo und willkommen bei DS! Vielleicht könnten Sie Ihren Datensatz etwas näher erläutern. Wie viele Zeilen und Spalten haben Sie? Dies könnte sich auf mögliche Lösungen auswirken.
S. Kolassa - Wiedereinsetzung von Monica

23711341 Zeilen und 8 Spalten. Ich könnte versuchen, 1-2 Spalten zu entfernen. Sie scheinen nicht mit meinem Problem zu tun zu haben.
David S.

Sie sollten hier Zeilen vor Spalten testen. Gibt es einen Grund, warum Sie keine zufälligen Stichproben zur Reduzierung der Datengröße erstellen können? Ich gehe davon aus, dass Zeilen hier mit Benutzern oder etwas verwandt sind
cwharland

Entschuldigung, wenn ich mich nicht klar ausgedrückt habe. Mein Ziel ist es, PCA zu machen. Ich denke, SVD auf Beispieldaten kann mir nicht helfen, PCA zu machen, richtig?
David S.

PCA wird normalerweise durch Berechnung der SVD auf der Kovarianzmatrix implementiert. Das Berechnen der Kovarianzmatrix ist eine peinlich parallele Aufgabe, daher sollte es sich leicht mit der Anzahl der Datensätze skalieren lassen.
Anony-Mousse

Antworten:


41

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:

  1. Wenn Sie nicht so viele Dimensionen (Variablen) haben, verwenden Sie einfach Online-Lernalgorithmen.
  2. 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.
  3. Wenn die Anzahl der Variablen zu hoch ist, verwenden Sie inkrementelle Algorithmen.

3
Insgesamt mag ich Ihre Antwort, aber der Anfangssatz ist nicht ganz richtig. PCA eignet sich nicht für viele Dimensionen mit geringer Varianz. Vielmehr eignet es sich für viele Dimensionen mit korrelierter Varianz. Für einen gegebenen Datensatz könnte die Varianz in allen Dimensionen hoch sein, aber solange es eine hohe Kovarianz gibt, kann PCA immer noch eine signifikante Verringerung der Dimensionalität ergeben.
Bogatron

1
@ Bogatron: Guter Fang, danke. Tatsächlich bezog ich mich in einigen Dimensionen auf hohe / niedrige Varianz , möglicherweise nicht auf originale. In diesem Bild sind diese Abmessungen beispielsweise durch 2 Pfeile definiert, nicht durch die ursprünglichen x / y-Achsen. PCA sucht nach diesen neuen Achsen und sortiert sie nach dem Varianzwert entlang jeder Achse. Wie Sie bereits betont haben, war es eine schlechte Formulierung, und ich habe versucht, meine Idee neu zu formulieren. Hoffentlich ist es jetzt klarer.
Freund

Das ergibt für mich einen Sinn. +1.
Bogatron

7

Mach dir keine Sorgen.

Erste Regel der Programmierung - das gilt auch für die Datenwissenschaft: Alles daran setzen, ein kleines Testproblem zu lösen.

Nehmen Sie also eine zufällige Stichprobe Ihrer Daten von beispielsweise 100.000 Zeilen. Probieren Sie verschiedene Algorithmen usw. aus. Wenn Sie alle Funktionen zu Ihrer Zufriedenheit ausgeführt haben, können Sie größere (und größere) Datensätze ausprobieren - und sehen, wie sich der Testfehler verringert, wenn Sie weitere Daten hinzufügen.

Außerdem möchten Sie svd nicht auf nur 8 Spalten anwenden: Sie wenden es an, wenn Sie viele Spalten haben.


1
+1 für Sie möchten svd nicht nur auf 8 Spalten anwenden: Sie wenden es an, wenn Sie viele Spalten haben.
S. Kolassa - Wiedereinsetzung von Monica

6

PCA wird normalerweise durch Berechnung der SVD auf der Kovarianzmatrix implementiert.

Das Berechnen der Kovarianzmatrix ist eine peinlich parallele Aufgabe, daher skaliert sie linear mit der Anzahl der Datensätze und lässt sich trivial auf mehrere Computer verteilen!

Überfliegen Sie Ihre Daten nur einmal, um die Mittel zu berechnen. Dann ein zweiter Durchgang, um die Kovarianzmatrix zu berechnen. Dies kann einfach mit Kartenreduzierung durchgeführt werden - im Grunde ist es dasselbe wie das erneute Berechnen der Mittel. Summenbegriffe wie in Kovarianz sind trivial zu parallelisieren! Möglicherweise müssen Sie nur auf Zahlen achten, wenn Sie viele Werte ähnlicher Größe summieren.

Bei einer Vielzahl von Variablen sieht es anders aus . Auf einem 8-GB-System sollte es jedoch möglich sein, PCA mit den BLAS-Bibliotheken auf bis zu 20.000 Dimensionen im Arbeitsspeicher auszuführen. Aber dann könnten Sie auf das Problem stoßen, dass PCA nicht mehr so ​​zuverlässig ist, weil es zu viele Freiheitsgrade hat. Mit anderen Worten: Es passt leicht. Ich habe die Empfehlung gesehen, mindestens 10 * d * d Datensätze zu haben (oder war es d ^ 3). Für 10000 Dimensionen sollten Sie also mindestens eine Milliarde Datensätze (von 10000 Dimensionen ... das ist eine Menge!) Haben, damit das Ergebnis statistisch zuverlässig ist.


1

Obwohl Sie wahrscheinlich einige Tools finden, mit denen Sie dies auf einer einzelnen Maschine tun können, befinden Sie sich in einem Bereich, in dem es sinnvoll ist, Tools wie Spark für "große Datenmengen" in Betracht zu ziehen, insbesondere, wenn Sie glauben, dass Ihre Datenmenge zunehmen könnte. Spark hat eine Komponente namens MLlib, die PCA und SVD unterstützt. Die Dokumentation enthält Beispiele .


1

Wir haben SVD mit PySpark in einen größeren Datensatz implementiert. Wir haben auch die Konsistenz über verschiedene Pakete hinweg verglichen. Hier ist der Link.


0

Ich würde Python empfehlen, wenn Sie die Datei faul auswerten, Sie einen winzigen Speicherbedarf haben und numpy / scipy Ihnen Zugriff auf alle Tools geben würden, die Octave / Matlab verwenden würde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.