2012-09-15 57 views
5

Tôi có tập huấn luyện rất lớn (~ 2Gb) trong tệp CSV. Tệp là quá lớn để đọc trực tiếp vào bộ nhớ (read.csv() khiến máy tính tạm dừng) và tôi muốn giảm kích thước của tệp dữ liệu bằng PCA. Vấn đề là (theo như tôi có thể nói) tôi cần phải đọc các tập tin vào bộ nhớ để chạy một thuật toán PCA (ví dụ, princomp()).thực hiện PCA trên tập dữ liệu rất lớn trong R

Tôi đã thử các bigmemory gói để đọc các tập tin trong như một big.matrix, nhưng princomp không hoạt động trên big.matrix đối tượng và nó không có vẻ như big.matrix có thể được chuyển đổi thành một cái gì đó giống như một data.frame.

Có cách nào để chạy princomp trên tệp dữ liệu lớn mà tôi bị thiếu không?

Tôi là người mới tương đối ở R, vì vậy một số điều này có thể hiển nhiên đối với những người dùng dày dạn kinh nghiệm hơn (lời xin lỗi trong tình trạng khẩn cấp).

Cảm ơn mọi thông tin.

+0

Về cơ bản bạn cần làm PCA mà không ước tính ma trận hiệp phương sai mẫu. Có một tài liệu lớn về PCA cao cấp, đặc biệt là với các ứng dụng xử lý hình ảnh và thị trường tài chính. Tuy nhiên, nó nhiều hơn khả năng không phải là một cái gì đó tầm thường để làm. – John

+2

Có bao nhiêu quan sát và chứa bao nhiêu biến? – rolando2

+0

@ rolando2 Nó chứa khoảng 50K hàng và ~ 10000 cột – user141146

Trả lời

8

Cách tôi giải quyết nó bằng cách tính toán ma trận hiệp phương sai mẫu lặp lại. Bằng cách này, bạn chỉ cần một tập con của dữ liệu cho bất kỳ điểm nào trong thời gian. Đọc chỉ trong một tập con của dữ liệu có thể được thực hiện bằng cách sử dụng readLines nơi bạn mở một kết nối đến tệp và đọc lặp lại. Thuật toán trông giống như sau (nó là một thuật toán hai bước):

Tính giá trị trung bình cho mỗi cột (giả định rằng là các biến)

  1. kết nối tập tin mở (con = open(...))
  2. đọc 1000 dòng (readLines(con, n = 1000))
  3. Tính tổng các bình phương mỗi cột
  4. Thêm những tổng các bình phương cho một biến (sos_column = sos_column + new_sos)
  5. R epeat 2-4 cho đến khi kết thúc tập tin.
  6. Chia cho số hàng trừ 1 để lấy giá trị trung bình.

Tính ma trận hiệp phương sai:

  1. kết nối tập tin mở (con = open(...))
  2. đọc 1000 dòng (readLines(con, n = 1000))
  3. Tính tất cả crossproducts sử dụng crossprod
  4. Lưu những crossproducts trong một biến
  5. Lặp lại 2-4 cho đến khi kết thúc tệp.
  6. chia cho số hàng trừ 1 để có được hiệp phương sai.

Khi bạn có ma trận hiệp phương sai, chỉ cần gọi princomp với covmat = your_covmatprincomp sẽ bỏ calulating ma trận hiệp phương sai mình.

Bằng cách này, các bộ dữ liệu bạn có thể xử lý nhiều, lớn hơn nhiều so với RAM sẵn có của bạn. Trong các lần lặp lại, việc sử dụng bộ nhớ là khoảng bộ nhớ mà đoạn dữ liệu mất (ví dụ:1000 hàng), sau đó việc sử dụng bộ nhớ được giới hạn trong ma trận hiệp phương sai (nvar * nvar tăng gấp đôi).

+0

có thể có cách nào không lưu trữ tất cả ma trận hiệp phương sai trong bộ nhớ? – mrgloom

+0

Nếu bạn có câu hỏi mới, vui lòng tạo câu hỏi mới, có thể đề cập đến câu hỏi này. –

0

Những điều cần lưu ý khi nhập tập dữ liệu lớn.

  1. Yêu cầu bộ nhớ.

  2. Hiểu được cấu trúc của bộ dữ liệu được nhập khẩu sử dụng đoạn mã sau mẫu:

    ban đầu < - read.table ("datatable.csv", nrows = 100);

    các lớp < - sapply (ban đầu, lớp);

    tabAll < - read.table ("datatable.csv", colClasses = lớp)

  3. Nếu tập dữ liệu lớn sử dụng hàm fread() từ dữ liệu, lớp bảng.

  4. Thực hiện kỹ thuật giảm thứ nguyên trước khi áp dụng PCA. Ví dụ, loại bỏ các biến tương quan cao hoặc biến nearZeroVariance khi chúng không đóng góp cho đầu ra.

  5. Sau đó áp dụng PCA.

Tôi hy vọng nó giúp

Các vấn đề liên quan