Làm thế nào để làm SVD và PCA với dữ liệu lớn?


29

Tôi có một bộ dữ liệu lớn (khoảng 8GB). Tôi muốn sử dụng máy học để phân tích nó. Vì vậy, tôi nghĩ rằng tôi nên sử dụng SVD sau đó là PCA để giảm tính hiệu quả của dữ liệu. Tuy nhiên, MATLAB và Octave không thể tải một tập dữ liệu lớn như vậy.

Những công cụ nào tôi có thể sử dụng để làm SVD với lượng dữ liệu lớn như vậy?


Xin chào, và chào mừng đến với DS! Có lẽ bạn có thể xây dựng một chút về tập dữ liệu của bạn. Bạn có bao nhiêu hàng và cột? Điều này có thể có tác động đến các giải pháp có thể.
S. Kolassa - Tái lập Monica

23711341 hàng và 8 cột. Tôi có thể thử xóa 1-2 cột. Họ dường như không liên quan đến vấn đề của tôi.
David S.

Bạn nên lấy mẫu các hàng trước các cột ở đây. Có một lý do bạn không thể lấy mẫu hàng ngẫu nhiên để giảm kích thước dữ liệu? Tôi giả sử các hàng ở đây có liên quan đến người dùng hoặc thứ gì đó
cwharland

Xin lỗi nếu tôi không làm cho mình rõ ràng. Mục tiêu của tôi là làm PCA. Tôi nghĩ rằng SVD trên dữ liệu mẫu không thể giúp tôi làm PCA, phải không?
David S.

PCA thường được thực hiện bằng cách tính toán SVD trên ma trận hiệp phương sai. Tính toán ma trận hiệp phương sai là một nhiệm vụ song song lúng túng, vì vậy nó nên mở rộng dễ dàng với số lượng bản ghi.
Anony-Mousse

Câu trả lời:


41

Trước hết, giảm kích thước được sử dụng khi bạn có nhiều kích thước đồng biến và muốn giảm kích thước bài toán bằng cách xoay các điểm dữ liệu thành cơ sở trực giao mới và chỉ lấy các trục có phương sai lớn nhất. Với 8 biến (cột), không gian của bạn đã có chiều thấp, việc giảm số lượng biến hơn nữa không thể giải quyết các vấn đề kỹ thuật với kích thước bộ nhớ, nhưng có thể ảnh hưởng rất nhiều đến chất lượng dữ liệu. Trong trường hợp cụ thể của bạn, hứa hẹn sẽ có một cái nhìn về học tập trực tuyếnphương pháp. Nói một cách đơn giản, thay vì làm việc với toàn bộ tập dữ liệu, các phương thức này chiếm một phần nhỏ trong số chúng (thường được gọi là "các lô nhỏ") tại một thời điểm và xây dựng mô hình tăng dần. (Cá nhân tôi thích diễn giải từ "trực tuyến" là một tham chiếu đến một nguồn dữ liệu dài vô tận từ Internet như nguồn cấp dữ liệu Twitter, nơi bạn không thể tải toàn bộ dữ liệu cùng một lúc).

Nhưng nếu bạn thực sự muốn áp dụng kỹ thuật giảm kích thước như PCA cho bộ dữ liệu không phù hợp với bộ nhớ thì sao? Thông thường một tập dữ liệu được biểu diễn dưới dạng ma trận dữ liệu X có kích thước n x m , trong đó n là số lượng quan sát (hàng) và m là một số biến (cột). Thông thường các vấn đề với bộ nhớ chỉ đến từ một trong hai số này.

Quá nhiều quan sát (n >> m)

Khi bạn có quá nhiều quan sát , nhưng số lượng biến là từ nhỏ đến trung bình, bạn có thể xây dựng ma trận hiệp phương sai tăng dần . Thật vậy, PCA điển hình bao gồm xây dựng một ma trận hiệp phương sai có kích thước m x m và áp dụng phân rã giá trị số ít cho nó. Với m = 1000 biến kiểu float64, ma trận hiệp phương sai có kích thước 1000 * 1000 * 8 ~ 8Mb, dễ dàng phù hợp với bộ nhớ và có thể được sử dụng với SVD. Vì vậy, bạn chỉ cần xây dựng ma trận hiệp phương sai mà không tải toàn bộ dữ liệu vào bộ nhớ - nhiệm vụ khá dễ điều khiển .

Ngoài ra, bạn có thể chọn một mẫu đại diện nhỏ từ tập dữ liệu của mình và xấp xỉ ma trận hiệp phương sai . Ma trận này sẽ có tất cả các thuộc tính giống như bình thường, chỉ kém chính xác hơn một chút.

Quá nhiều biến số (n << m)

Mặt khác, đôi khi, khi bạn có quá nhiều biến , chính ma trận hiệp phương sai sẽ không phù hợp với bộ nhớ. Ví dụ: nếu bạn làm việc với hình ảnh 640x480, mọi quan sát có 640 * 480 = 307200 biến, dẫn đến ma trận hiệp phương sai 703Gb! Đó chắc chắn không phải là những gì bạn muốn giữ trong bộ nhớ của máy tính của bạn, hoặc thậm chí trong bộ nhớ của cụm của bạn. Vì vậy, chúng ta cần giảm kích thước mà không cần xây dựng ma trận hiệp phương sai.

Phương pháp yêu thích của tôi để làm điều đó là Chiếu ngẫu nhiên . Nói tóm lại, nếu bạn có tập dữ liệu X có kích thước n x m , bạn có thể nhân nó với một số ma trận ngẫu nhiên thưa thớt R có kích thước m x k (với k << m ) và thu được ma trận X ' mới có kích thước nhỏ hơn nhiều n x k với các thuộc tính gần giống như bản gốc. Tại sao nó hoạt động? Chà, bạn nên biết rằng PCA nhằm mục đích tìm tập hợp các trục trực giao (thành phần chính) và chiếu dữ liệu của bạn lên k đầu tiêncủa họ. Nó chỉ ra rằng các vectơ ngẫu nhiên thưa thớt gần như trực giao và do đó cũng có thể được sử dụng làm cơ sở mới.

Và, tất nhiên, bạn không phải nhân toàn bộ tập dữ liệu X với R - bạn có thể dịch mọi quan sát x sang cơ sở mới một cách riêng biệt hoặc theo từng đợt nhỏ.

Cũng có một số thuật toán tương tự được gọi là Random SVD . Tôi không có bất kỳ kinh nghiệm thực tế nào với nó, nhưng bạn có thể tìm thấy mã ví dụ với các giải thích ở đây .


Là điểm mấu chốt, đây là danh sách kiểm tra ngắn để giảm kích thước của các bộ dữ liệu lớn:

  1. Nếu bạn không có nhiều thứ nguyên (biến), chỉ cần sử dụng thuật toán học trực tuyến.
  2. Nếu có nhiều quan sát, nhưng số lượng biến vừa phải (ma trận hiệp phương sai phù hợp với bộ nhớ), xây dựng ma trận tăng dần và sử dụng SVD bình thường.
  3. Nếu số lượng biến quá cao, hãy sử dụng thuật toán gia tăng.

3
Nhìn chung, tôi thích câu trả lời của bạn nhưng câu mở đầu không hoàn toàn đúng. PCA không phù hợp với nhiều chiều có phương sai thấp; thay vào đó, nó phù hợp với nhiều chiều với phương sai tương quan . Đối với một tập dữ liệu nhất định, phương sai có thể cao ở tất cả các chiều nhưng miễn là có hiệp phương sai cao, thì PCA vẫn có thể mang lại sự giảm kích thước đáng kể.
bogatron

1
@bogatron: bắt tốt, cảm ơn. Trong thực tế, tôi đã đề cập đến phương sai cao / thấp ở một số chiều, có thể không phải là nguyên bản. Ví dụ, trong hình này, các kích thước này được xác định bởi 2 mũi tên, không phải trục x / y gốc. PCA tìm cách tìm ra các trục mới này và sắp xếp chúng theo giá trị của phương sai dọc theo mỗi trục. Dù sao, như bạn đã chỉ ra, đó là một từ ngữ xấu, vì vậy tôi đã cố gắng cải tổ ý tưởng của mình. Hy vọng, bây giờ nó rõ ràng hơn.

Điều đó có ý nghĩa với tôi. +1.
bogatron

7

Đừng bận tâm.

Quy tắc đầu tiên của lập trình - cũng áp dụng cho khoa học dữ liệu: làm mọi thứ hoạt động trong một vấn đề thử nghiệm nhỏ.

vì vậy hãy lấy một mẫu ngẫu nhiên dữ liệu của bạn là 100.000 hàng. thử các thuật toán khác nhau, vv một khi bạn đã làm mọi thứ thỏa mãn, bạn có thể thử các tập dữ liệu lớn hơn (và lớn hơn) - và xem lỗi kiểm tra giảm như thế nào khi bạn thêm nhiều dữ liệu.

hơn nữa bạn không muốn áp dụng svd cho chỉ 8 cột: bạn áp dụng nó khi bạn có nhiều cột.


1
+1 cho bạn không muốn áp dụng svd cho chỉ 8 cột: bạn áp dụng nó khi bạn có nhiều cột.
S. Kolassa - Tái lập Monica

6

PCA thường được thực hiện bằng cách tính toán SVD trên ma trận hiệp phương sai.

Tính toán ma trận hiệp phương sai là một nhiệm vụ song song đáng xấu hổ , do đó, nó chia tỷ lệ tuyến tính với số lượng bản ghi và không quan trọng để phân phối trên nhiều máy!

Chỉ cần vượt qua dữ liệu của bạn để tính toán phương tiện. Sau đó, một thông qua thứ hai để tính ma trận hiệp phương sai. Điều này có thể được thực hiện với việc giảm bản đồ một cách dễ dàng - về cơ bản nó giống như tính toán lại các phương tiện. Các thuật ngữ như trong hiệp phương sai là tầm thường để song song! Bạn có thể chỉ cần chú ý đến số khi tổng hợp rất nhiều giá trị có độ lớn tương tự.

Mọi thứ trở nên khác biệt khi bạn có một số lượng lớn các biến . Nhưng trên hệ thống 8 GB, bạn sẽ có thể chạy PCA trên bộ nhớ trong tối đa 20.000 kích thước với các thư viện BLAS. Nhưng sau đó bạn có thể gặp phải vấn đề PCA không còn đáng tin nữa, vì nó có quá nhiều mức độ tự do. Nói cách khác: nó dễ mặc trang phục. Tôi đã thấy đề xuất có ít nhất 10 * d * d hồ sơ (hoặc là d ^ 3). Vì vậy, đối với 10000 kích thước, bạn nên có ít nhất một tỷ bản ghi (trong số 10000 kích thước ... đó là rất nhiều!) Để kết quả được thống kê đáng tin cậy.


1

Mặc dù bạn có thể tìm thấy một số công cụ sẽ cho phép bạn làm điều đó trên một máy duy nhất, nhưng bạn đang đi vào phạm vi có ý nghĩa khi xem xét các công cụ "dữ liệu lớn" như Spark, đặc biệt nếu bạn nghĩ rằng tập dữ liệu của bạn có thể phát triển. Spark có một thành phần gọi là MLlib hỗ trợ PCA và SVD. Các tài liệu có ví dụ .


1

Chúng tôi đã triển khai SVD thành một tập dữ liệu lớn hơn bằng PySpark. Chúng tôi cũng so sánh tính nhất quán giữa các gói khác nhau. Đây là liên kết.


0

Tôi sẽ giới thiệu python nếu bạn lười biếng đánh giá tệp bạn sẽ có dấu chân bộ nhớ rất nhỏ và numpy / scipy cung cấp cho bạn quyền truy cập vào tất cả các công cụ mà Octave / Matlab sẽ làm.

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.