2012-09-15 7 views
5

Ich habe eine sehr große Trainingsmenge (~ 2 GB) in einer CSV-Datei. Die Datei ist zu groß direkt in den Speicher zu lesen (read.csv() bringt den Computer zum Stillstand) und ich möchte die Größe der Datendatei mit PCA reduzieren. Das Problem ist, dass (soweit ich das beurteilen kann) ich die Datei in den Speicher lesen muss, um einen PCA-Algorithmus auszuführen (z. B. princomp()).tun PCA auf sehr großen Datensatz in R

Ich habe versucht, das Paket bigmemory die Datei in als big.matrix zu lesen, aber princomp funktioniert nicht auf big.matrix Objekte und es scheint nicht, wie big.matrix kann wie ein data.frame in etwas umgewandelt werden.

Gibt es eine Möglichkeit princomp auf einer großen Datei zu laufen, die ich vermisse?

Ich bin ein relativer Neuling bei R, so dass einige davon für erfahrene Benutzer offensichtlich sein können (Entschuldigung in Avance).

Danke für jede Info.

+0

Grundsätzlich müssen Sie PCA tun, ohne die Probe Kovarianzmatrix abzuschätzen. Es gibt eine große Literatur über hochdimensionale PCA, insbesondere mit Anwendungen für Bildverarbeitung und Finanzmärkte. Es ist jedoch mehr als wahrscheinlich, dass es nicht trivial ist. – John

+2

Wie viele Beobachtungen und wie viele Variablen enthält die Datei? – rolando2

+0

@ rolando2 Es enthält etwa 50K Zeilen und ~ 10000 Spalten – user141146

Antwort

8

Die Art, wie ich es gelöst habe, war durch iterative Berechnung der Probe Kovarianzmatrix. Auf diese Weise benötigen Sie nur einen Teil der Daten für einen beliebigen Zeitpunkt. Das Einlesen nur einer Teilmenge der Daten kann unter Verwendung von readLines erfolgen, wobei Sie eine Verbindung zur Datei öffnen und iterativ lesen. Der Algorithmus sieht ungefähr so ​​aus (es ist ein zweistufiger Algorithmus):

die Mittelwerte pro Spalte Berechnen (unter der Annahme, dass die Variablen)

  1. Datei öffnen Verbindung (con = open(...))
  2. lesen 1000 Zeilen (readLines(con, n = 1000))
  3. berechnen Summen der Quadrate pro Spalte
  4. In diese Summen der Quadrate an eine Variable (sos_column = sos_column + new_sos)
  5. R Wiederholen Sie 2-4 bis zum Ende der Datei.
  6. Dividieren Sie nach Anzahl der Zeilen minus 1, um den Mittelwert zu erhalten.

die Kovarianzmatrix berechnen:

  1. Datei öffnen Verbindung (con = open(...))
  2. lesen 1000 Zeilen (readLines(con, n = 1000))
  3. berechnen alle crossproducts crossprod
  4. diese crossproducts in ein Speichern mit Variable
  5. Wiederholen Sie 2-4 bis Ende der Datei.
  6. Division durch die Anzahl der Zeilen minus 1, um die Kovarianz zu erhalten.

Wenn Sie die Kovarianzmatrix haben, rufen Sie einfach princomp mit covmat = your_covmat und princomp überspringen wird die Kovarianzmatrix sich calulating.

Auf diese Weise sind die Datensätze, die Sie verarbeiten können, viel, viel größer als Ihr verfügbarer RAM. Während der Iterationen ist die Speichernutzung ungefähr der Speicher, den der Block benötigt (z.B.1000 Zeilen), danach ist die Speichernutzung auf die Kovarianzmatrix beschränkt (nvar * nvar doubles).

+0

vielleicht gibt es eine Möglichkeit, nicht alle Kovarianzmatrix im Speicher zu speichern? – mrgloom

+0

Wenn Sie eine neue Frage haben, erstellen Sie bitte eine neue und beziehen Sie sich vielleicht auf diese Frage. –

0

Wichtige Punkte beim Importieren eines großen Datasets.

  1. Speicherbedarf. ; Read.table ("datatable.csv", nrows = 100) -

    anfänglichen <:

  2. die Struktur des Datensatzes verstehen zu den folgenden Beispielcode verwenden importiert

    Klassen < - sapply (initial, class);

    tabAll < - read.table ("datatable.csv", colClasses = Klassen)

  3. Wenn Datenmenge ist groß Verwendung fread() Funktion von Daten, Tabellenklasse.

  4. Führen Sie vor der PCA-Anwendung eine Reduzierung der Dimensionalität durch. Entfernen Sie beispielsweise stark korrelierte Variablen oder nearZeroVariance-Variablen, da sie nicht zur Ausgabe beitragen.

  5. Dann PCA anwenden.

Ich hoffe, es hilft