Áp dụng PCA trên ma trận thưa thớt rất lớn


16

Tôi đang thực hiện một nhiệm vụ phân loại văn bản với R và tôi có được ma trận thuật ngữ tài liệu với kích thước 22490 x 120.000 (chỉ có 4 triệu mục nhập khác không, các mục nhập dưới 1%). Bây giờ tôi muốn giảm tính chiều bằng cách sử dụng PCA (Phân tích thành phần chính). Thật không may, R không thể xử lý ma trận khổng lồ này, vì vậy tôi lưu trữ ma trận thưa thớt này trong một tệp ở "Định dạng thị trường ma trận", hy vọng sử dụng một số kỹ thuật khác để làm PCA.

Vì vậy, bất cứ ai cũng có thể cho tôi một số gợi ý cho các thư viện hữu ích (dù là ngôn ngữ lập trình), có thể thực hiện PCA với ma trận quy mô lớn này một cách dễ dàng hay nói cách khác là tự mình thực hiện PCA, nói cách khác là tính toán ma trận hiệp phương sai sau đó tính toán giá trị riêng và hàm riêng cho ma trận hiệp phương sai .

Điều tôi muốn là tính toán tất cả các PC (120.000) và chỉ chọn N PC hàng đầu, những người chiếm 90% phương sai . Rõ ràng, trong trường hợp này, tôi phải đưa ra một ngưỡng để đặt một số giá trị phương sai rất nhỏ thành 0 (trong ma trận hiệp phương sai), nếu không, ma trận hiệp phương sai sẽ không thưa thớt và kích thước của nó sẽ là 120.000 x 120.000, đó là không thể xử lý với một máy duy nhất. Ngoài ra, các tải (eigenvector) sẽ rất lớn và nên được lưu trữ ở định dạng thưa thớt.

Cảm ơn rất nhiều sự giúp đỡ nào !

Lưu ý: Tôi đang sử dụng máy có RAM 24GB và 8 lõi cpu.


Làm thế nào thưa thớt là ma trận? Làm thế nào để bạn sử dụng kết quả SVD? Nếu bạn chỉ cần một phần của nó, bạn có thể ước chừng nó rẻ hơn nhiều.
Arnold Neumaier

@ArnoldNeumaier Xin lỗi, tôi quên thêm thông tin thưa thớt. Tôi đã cập nhật bài viết, cùng với ý tưởng hoàn chỉnh của tôi.
Consom Hodder

mỗi SLEPc, mahout và irlba được đề xuất trong các câu trả lời cho đến nay dường như phù hợp với vấn đề của bạn.
Arnold Neumaier

1
Tại sao bạn muốn tính tất cả 120k? Có vẻ như bạn chỉ muốn những người chiếm 90% phương sai, nên rẻ hơn nhiều để tính toán.
Jed Brown

@JedBrown Này Jed, bạn hoàn toàn đúng! Tôi chỉ quan tâm đến những người chiếm 90% phương sai, và cả các hàm riêng tương ứng (để chuyển đổi tập dữ liệu thử nghiệm sau đó). Bạn có thể vui lòng cho tôi biết phương pháp rẻ hơn của bạn ?
Consom Hodder

Câu trả lời:


4

Tôi đề nghị gói irlba - nó tạo ra kết quả gần như tương tự như svd, tuy nhiên bạn có thể xác định một số lượng nhỏ hơn các giá trị số ít để giải quyết. Một ví dụ, sử dụng ma trận thưa thớt để giải thưởng Netflix, có thể tìm thấy ở đây: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html


Cảm ơn ý kiến ​​của bạn. Trên thực tế, tôi đã xem video đó và cũng đã thử gói irlba ngày hôm qua, nhưng dường như nó chỉ có thể được sử dụng để tính một vài giá trị số ít. Tuy nhiên, như đã nêu trong bài đăng, tôi muốn tính TẤT CẢ các giá trị số ít (120.000), để chọn số lượng PC phù hợp theo phương sai mà chúng chiếm. Trong trường hợp này, tôi đoán irlba không còn phù hợp.
Consom Hodder

Bạn có thể sử dụng kết quả của SVD theo cách tương tự như PCA không? Bạn không cần phải tập trung dữ liệu TRƯỚC KHI thực hiện SVD, để thực hiện PCA?
Zach

@Zach - SVD là thuật toán chính đằng sau PCA (xem prcomp - stat.ethz.ch/R-manual/R-patched/l Library / stat / html / prcomp.html ). Việc định tâm dữ liệu cũng là quy trình chuẩn trước khi tuân theo PCA, mặc dù có rất nhiều tùy chọn tùy thuộc vào câu hỏi của bạn (ví dụ: các loại tỷ lệ khác nhau cũng có thể được áp dụng).
Marc trong hộp

Làm thế nào lớn của một thỏa thuận nếu tôi không tập trung dữ liệu trước SVD? Tôi có một ma trận thưa thớt phù hợp với bộ nhớ, nhưng việc định tâm sẽ khiến nó dày đặc và quá lớn để phù hợp với bộ nhớ.
Zach

@Zach - Nó thực sự phụ thuộc vào cách bạn muốn liên kết các mẫu của bạn với nhau. Nếu bạn không thể làm việc với dữ liệu tập trung do giới hạn bộ nhớ, thì tôi đoán rằng quyết định đã được đưa ra cho bạn. Nói chung, dữ liệu định tâm có PCA hoạt động trên ma trận hiệp phương sai của các mẫu trong khi định tâm và chia tỷ lệ dữ liệu có PCA hoạt động trên ma trận tương quan. Để hiểu rõ hơn về các quyết định này, bạn có thể xem xét đặt câu hỏi tại stats.stackexchange.com hoặc tìm kiếm thông qua các câu trả lời hiện có liên quan đến PCA.
Marc trong hộp

8

Tôi đề nghị sử dụng SLEPc để tính toán một phần SVD. Xem Chương 4 của Hướng dẫn sử dụngtrang man SVD để biết chi tiết.


1
Vì anh ta muốn PCA, anh ta phải tập trung dữ liệu trước khi tính toán SVD. Điều này sẽ phá hỏng sự thưa thớt. Có cách nào mà SLEPc thích nghi cho việc này không?
dranxo

3
Đó chỉ là thưa thớt + thứ hạng thấp. SLEPc không cần các mục ma trận, chỉ cần một toán tử tuyến tính, có thể được áp dụng như một ma trận thưa thớt cộng với một sự điều chỉnh.
Jed Brown

2

Tôi bỏ phiếu cho mahout , điều này cũng tốt cho các nhiệm vụ NLP / TA khác và thực hiện / giảm bản đồ.


Vâng, bạn đã đúng, mahout chính xác là trong bản đồ đường bộ của tôi. Nhưng tôi thích tạo ra một nguyên mẫu với một số kỹ thuật "đơn giản" (tôi cho là) ​​trước.
Consom Hodder

1

Tôi khuyên bạn nên sử dụng phân rã giá trị số ít tăng dần, trong đó có nhiều tài liệu. Ví dụ:

  • các báo cáo kỹ thuật của Matthew Brand 12 khá dễ theo dõi
  • Luận văn thạc sĩ của Chris Baker , phần mềm IncPACK của anh ấy, và bài báo sau này của anh ấy về phương pháp SVD gia tăng
  • Bunch và Nielsen đã xuất bản bài báo được biết đến sớm nhất
  • Giấy tờ của Hall về việc cập nhật các vấn đề eigenvalue 12
  • Phân tích tuần tự Karhunen-Loeve của Levy và cộng sự, về cơ bản là giống nhau

Tất cả các cách tiếp cận này giảm xuống như sau:

  • bắt đầu với một tập dữ liệu nhỏ
  • tính toán một SVD bằng cách nào đó (bước này là tầm thường đối với một ma trận cột đơn)
  • lặp lại cho đến khi hoàn thành:
    • thêm tập dữ liệu mới
    • sử dụng các quy tắc cập nhật và SVD hiện có để tính toán SVD của tập dữ liệu mới

N


0

Bạn vẫn có thể sử dụng R.

Revolution Rlà bản dựng của R xử lý các tập dữ liệu lớn hơn RAM. Sử dụng chức năng princomp.

Nó cũng có đầy đủ các chức năng thống kê được thiết kế đặc biệt cho các vấn đề về kiểu dữ liệu lớn không phù hợp với RAM, ví dụ như hồi quy tuyến tính, hồi quy logistic, lượng tử, v.v.

Bạn có thể tải xuống miễn phí phiên bản Học thuật đầy đủ tính năng, bằng cách đánh dấu vào ô "Tôi là một học giả".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.