2012-09-15 15 views
5

Mam bardzo duży zestaw treningowy (~ 2 GB) w pliku CSV. Plik jest zbyt duży do odczytu bezpośrednio do pamięci (read.csv() przynosi komputer do zatrzymania) i chciałbym zmniejszyć rozmiar pliku danych przy użyciu PCA. Problem polega na tym, że (o ile wiem) muszę odczytać plik w pamięci w celu uruchomienia algorytmu PCA (np. princomp()).robi PCA na bardzo dużym zestawie danych w R

Próbowałem pakiet bigmemory przeczytać plik w postaci big.matrix, ale princomp nie działa na big.matrix obiektów i to nie wydaje się big.matrix można przekształcić w coś w rodzaju data.frame.

Czy istnieje sposób na uruchomienie na dużym pliku danych, którego mi brakuje?

Jestem względną nowicjuszką w R, więc niektóre z nich mogą być oczywiste dla bardziej doświadczonych użytkowników (przeprosiny w awansie).

Dzięki za wszelkie informacje.

+0

Zasadniczo trzeba zrobić PCA bez szacowania macierzy kowariancji próbki. Istnieje obszerna literatura na temat wielowymiarowego PCA, szczególnie w przypadku aplikacji do przetwarzania obrazu i rynków finansowych. Jednak bardziej niż prawdopodobne jest, że nie jest to łatwe. – John

+2

Ile obserwacji i ile zmiennych zawiera plik? – rolando2

+0

@ rolando2 Zawiera około 50K wierszy i ~ 10000 kolumn – user141146

Odpowiedz

8

Sposób, w jaki to rozwiązałem, polegał na iteracyjnym obliczaniu próbki macierzy kowariancji. W ten sposób potrzebny jest tylko podzbiór danych dla dowolnego punktu w czasie. Odczytanie tylko w pewnym podzbiorze danych można wykonać przy użyciu readLines, w którym otwiera się połączenie z plikiem i czyta się iteracyjnie. Algorytm wygląda mniej więcej tak (jest to algorytm dwustopniowy):

obliczanie średniej wartości na kolumnie (zakładając, że są zmienne)

  1. Otwarte połączenie plik (con = open(...))
  2. Czytaj 1000 linii (readLines(con, n = 1000))
  3. Obliczenie sumy kwadratów na kolumnę
  4. Dodaj tych sum kwadratów zmiennej (sos_column = sos_column + new_sos)
  5. R epeat 2-4 do końca pliku.
  6. Podziel według liczby rzędów minus 1, aby otrzymać średnią.

Oblicz macierz kowariancji:

  1. Otwarte połączenie plik (con = open(...))
  2. Czytaj 1000 linii (readLines(con, n = 1000))
  3. obliczyć wszystkie crossproducts wykorzystujące crossprod
  4. zapisać te w krótkim crossproducts zmienna
  5. Powtarzaj 2-4 do końca pliku.
  6. podzielić przez liczbę wierszy minus 1, aby uzyskać kowariancję.

Kiedy masz macierz kowariancji, zadzwoń princomp z covmat = your_covmat i princomp pominie calulating macierz kowariancji siebie.

W ten sposób zbiory danych, które można przetworzyć, są znacznie, dużo większe niż dostępna pamięć RAM. Podczas iteracji użycie pamięci to w przybliżeniu pamięć, którą zajmuje porcja (np.1000 wierszy), po czym użycie pamięci jest ograniczone do macierzy kowariancji (podwajany jest nvar * nvar).

+0

Być może istnieje sposób, aby nie przechowywać całej macierzy kowariancji w pamięci? – mrgloom

+0

Jeśli masz nowe pytanie, utwórz nowe, może odwołując się do tego pytania. –

0

O czym należy pamiętać podczas importowania dużego zestawu danych.

  1. Wymagana pamięć.

  2. rozumieć strukturę zbioru danych importowane użyć następującego Kod próbki:

    początkowy < - read.table ("datatable.csv" nrows = 100);

    klasy < - sapply (początkowy, klasa);

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

  3. Jeśli zestaw danych jest duża wykorzystanie fread (funkcja) z danymi, klasa stół.

  4. Wykonaj technikę redukcji wymiarów przed zastosowaniem PCA. Przykład: usuń wysoce skorelowane zmienne lub bliskie zmienne ZeroVariance, ponieważ nie przyczyniają się one do wyjścia.

  5. Następnie zastosować PCA.

Mam nadzieję, że to pomaga

Powiązane problemy