Làm thế nào để thực hiện PCA cho dữ liệu có chiều rất cao?


12

Để thực hiện phân tích thành phần chính (PCA), bạn phải trừ phương tiện của từng cột khỏi dữ liệu, tính toán ma trận hệ số tương quan và sau đó tìm các giá trị riêng và giá trị riêng. Chà, đúng hơn, đây là những gì tôi đã làm để triển khai nó trong Python, ngoại trừ nó chỉ hoạt động với các ma trận nhỏ vì phương pháp tìm ma trận hệ số tương quan (Corrcoef) không cho phép tôi sử dụng một mảng có chiều cao. Vì tôi phải sử dụng nó cho hình ảnh, việc triển khai hiện tại của tôi không thực sự giúp tôi.

Tôi đã đọc rằng nó có thể chỉ mất dữ liệu của bạn ma trận và tính toán D D / n thay vì D D / n , nhưng điều đó không làm việc cho tôi. Vâng, tôi không chắc chắn chính xác Tôi hiểu ý nghĩa của nó, bên cạnh thực tế là nó là nghĩa vụ phải là một n × n ma trận thay vì p × p (trong trường hợp của tôi p » n ). Tôi đã đọc về những người trong các hướng dẫn về eigenfaces nhưng dường như không ai trong số họ giải thích nó theo cách mà tôi thực sự có thể có được nó.DDD/nDD/nn×np×ppn

Tóm lại, có một mô tả thuật toán đơn giản của phương pháp này để tôi có thể làm theo nó không?


Những gì bạn đọc là chính xác. Ma trận được gọi là ma trận Gram. Eigenvector của nó là (thành phần) chính. Các giá trị riêng của nó giống hệt nhau, cho đến hệ số 1 / n , với các giá trị riêng của ma trận hiệp phương sai D D / n . DD1/nDD/n
amip nói rằng Phục hồi lại

Câu trả lời:


10

Cách dễ nhất để thực hiện PCA tiêu chuẩn là căn giữa các cột trong ma trận dữ liệu của bạn (giả sử các cột tương ứng với các biến khác nhau) bằng cách trừ đi các phương tiện cột, sau đó thực hiện một SVD. Các vectơ số ít bên trái, nhân với giá trị số ít tương ứng, tương ứng với các thành phần chính (ước tính). Các vectơ số ít bên phải tương ứng với các hướng thành phần chính (ước tính) - chúng giống như các hàm riêng do PCA đưa ra. Các giá trị số ít tương ứng với độ lệch chuẩn của các thành phần chính (nhân với hệ số gốc n, trong đó n là số hàng trong ma trận dữ liệu của bạn) - giống như căn bậc hai của giá trị riêng do PCA đưa ra.

Nếu bạn muốn làm PCA trên ma trận tương quan, bạn sẽ cần chuẩn hóa các cột của ma trận dữ liệu trước khi áp dụng SVD. Số tiền này để trừ đi các phương tiện (định tâm) và sau đó chia cho độ lệch chuẩn (chia tỷ lệ).

Đây sẽ là cách tiếp cận hiệu quả nhất nếu bạn muốn có PCA đầy đủ. Bạn có thể xác minh với một số đại số rằng điều này cho bạn câu trả lời giống như thực hiện phân rã phổ của ma trận hiệp phương sai mẫu.

Ngoài ra còn có các phương pháp hiệu quả để tính toán một phần SVD, khi bạn chỉ cần một vài PC. Một số trong số này là các biến thể của vòng lặp sức mạnh. Các thuật toán Lanczos là một trong những ví dụ mà cũng liên quan đến một phần bình phương nhỏ nhất. Nếu ma trận của bạn rất lớn, bạn có thể tốt hơn với một phương pháp gần đúng. Ngoài ra còn có lý do thống kê để thường xuyên PCA khi đây là trường hợp.


Sửa lỗi cho tôi nếu tôi sai, nhưng tôi nghĩ thuật toán Lanczos thực hiện quá trình xuất tinh và không phải là SVD.
amip nói rằng Phục hồi lại

1
Một độc giả quan tâm có thể xem tại đây để biết thêm chi tiết về việc thực hiện PCA thông qua SVD: Mối quan hệ giữa SVD và PCA. Làm thế nào để sử dụng SVD để thực hiện PCA?
amip nói rằng Phục hồi Monica

8

Nghe có vẻ như những gì bạn muốn là thuật toán NIPALS để thực hiện PCA. Đó là một thuật toán rất phổ biến trong số các nhà thống kê. Nó có nhiều ưu điểm:

  • Tính toán ít tốn kém hơn so với các phương pháp phân rã SVD hoặc eigenvalue nếu chỉ cần một vài thành phần đầu tiên.
  • Có yêu cầu lưu trữ khiêm tốn hơn nói chung vì ma trận hiệp phương sai không bao giờ được hình thành. Đây là một tài sản rất quan trọng cho các bộ dữ liệu rất lớn.
  • Có thể xử lý dữ liệu bị thiếu trong bộ dữ liệu (mặc dù đó không phải là vấn đề trong vấn đề của bạn, vì bạn đang xử lý hình ảnh).

Mô tả
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Thuật toán
Đây là một mô tả đơn giản và xuất sắc về thuật toán (trong phần 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Trước tiên hãy nhớ quy mô trung tâm trước khi thực hiện PCA vì nó nhạy cảm với quy mô.


8

Những gì bạn đang làm ngay bây giờ rất gần, nhưng bạn cần chắc chắn rằng bạn nhân các hàm riêng (data . data.T) / linesở bên trái data.T, để có được các hàm riêng (data.T . data) / lines. Điều này đôi khi được gọi là "lừa chuyển đổi".

AAATA

Am×nn>>mATAn×nATAm×mAATATAAAT

vAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

Nói cách khác, nếu là một hàm riêng của A AvAATATvATAAATAvAATATATvATA


1
Điều này nghe có vẻ như "thủ thuật kernel" được áp dụng cho PCA. vi.wikipedia.org/wiki/Kernel_PCA Đó là một cách rất tốt để xử lý một số ma trận lớn.
Gilead

AA

4

Để thêm vào câu trả lời của Gilead, chúng là các thuật toán tính toán ít tốn kém hơn cho các PCA bị cắt cụt. NIPALS thực sự rất phổ biến, nhưng tôi đã gặt hái được nhiều thành công với các phương pháp gần đúng thực hiện nối tiếp dữ liệu một phần (thường được gọi là PCA bằng phép chiếu ngẫu nhiên). Điều này đã được thảo luận trong một metaoptimize chủ đề.

Như bạn đã đề cập đến Python, hãy để tôi chỉ ra rằng thuật toán được triển khai trong scikit-learn : lớp PCA . Cụ thể, nó được sử dụng trong một ví dụ minh họa các không gian riêng .

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.