PCA quá chậm khi cả n, p đều lớn: Lựa chọn thay thế?


9

Sự cố thiết lập

Tôi có các điểm dữ liệu (hình ảnh) có kích thước cao (4096), mà tôi đang cố gắng hình dung ở dạng 2D. Cuối cùng, tôi đang sử dụng t-sne theo cách tương tự như mã ví dụ sau của Karpathy .

Tài liệu scikit-learn khuyên bạn nên sử dụng PCA để trước tiên hạ thấp kích thước của dữ liệu:

Rất khuyến khích sử dụng phương pháp giảm kích thước khác (ví dụ PCA cho dữ liệu dày đặc hoặc TruncatedSVD cho dữ liệu thưa) để giảm số lượng kích thước xuống mức hợp lý (ví dụ 50) nếu số lượng tính năng rất cao.

Tôi đang sử dụng mã này bởi Darks.Liu để thực hiện PCA trong Java:

//C=X*X^t / m
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//Sort sigen vector from big to small by eigen values 
List<PCABean> beans = new ArrayList<PCA.PCABean>();
for (int i = 0; i < eigVectors.columns; i++) {
    beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; i < dimension; i++) {
    ComplexDoubleMatrix dm = beans.get(i).vector;
    DoubleMatrix real = dm.getReal();
    newVec.putRow(i, real);
}
return newVec.mmul(source);

Nó sử dụng jblas cho các phép toán đại số tuyến tính, từ những gì tôi đã đọc được cho là lựa chọn nhanh nhất ngoài kia. Tuy nhiên, việc tính toán các giá trị riêng và giá trị riêng (dòng 3,4) hóa ra là một nút cổ chai lớn (~ 10 phút, lâu hơn nhiều so với khả năng của tôi trong giai đoạn này).

Tôi đã đọc về Kernel PCA, được cho là tốt cho các trường hợp kích thước rất lớn, nhưng thời gian chạy của nó là có thể có vấn đề vì tôi cũng muốn xử lý các trường hợp cả về chiều số ví dụ là lớn.O(n3)

Như tôi thấy, các tùy chọn của tôi là "tối ưu hóa" PCA hoặc chọn phương pháp giảm kích thước khác vốn nhanh hơn.

Những câu hỏi của tôi

  1. Có bất kỳ hy vọng rằng PCA có thể được sử dụng theo kiểu "ngoại tuyến" không? tức là sử dụng một tập hợp dữ liệu lớn của hình ảnh, thực hiện PCA trên chúng và sau đó sử dụng các thành phần chính được tính toán cho chúng để giảm kích thước của các điểm dữ liệu (mới!) khác?
  2. Tôi có thể tăng tốc tính toán eigenvector không, giả sử tôi biết trước thời gian mà tôi chỉ quan tâm, giả sử, 100 thành phần chính hàng đầu?
  3. Có một phương pháp giảm kích thước thay thế phù hợp trong trường hợp của tôi (tức là trước khi áp dụng t-sne) sẽ nhanh hơn PCA không? Tôi đang tìm kiếm một cái gì đó có thể được thực hiện dễ dàng trong Java.

Câu trả lời:


8

Câu hỏi 1: Giả sử bạn đã quan sát ma trận dữ liệu . Từ đó bạn có thể tính toán eigendecomposition . Câu hỏi bây giờ là: nếu chúng ta nhận được dữ liệu mới đến từ cùng một quần thể, có lẽ được thu thập vào ma trận , liệu có gần với phép quay trực giao lý tưởng của không? Loại câu hỏi này được giải quyết theo định lý Davis-Kahan và lý thuyết nhiễu loạn ma trận nói chung (nếu bạn có thể nhận được một bản sao, sách giáo khoa năm 1990 của Stewart và Sun là tài liệu tham khảo tiêu chuẩn). X T X = Q Λ Q T Z R m × p Z Q ZXRn×pXTX=QΛQTZRm×pZQZ

Câu hỏi 2: bạn chắc chắn có thể tăng tốc mọi thứ nếu bạn biết bạn chỉ cần những người bản địa hàng đầu . Trong RI sử dụng cho điều này; Tôi chắc chắn rằng có một tương đương Java vì dù sao tất cả chúng đều là các trình bao bọc fortran.krARPACK

Câu hỏi 3: Tôi không biết gì về triển khai Java, nhưng luồng này thảo luận về việc tăng tốc PCA cũng như luồng CV này . Có rất nhiều nghiên cứu về loại điều này và có rất nhiều phương pháp sử dụng những thứ như xấp xỉ thứ hạng thấp hoặc ngẫu nhiên.


3

Mã bạn đang sử dụng sẽ đảo ngược toàn bộ ma trận. Đây có lẽ là O (p ^ 3) rồi. Bạn có thể tính gần đúng kết quả trong O (p ^ 2) nhưng điều đó vẫn sẽ chậm (nhưng có thể nhanh hơn 100 lần). Về cơ bản, lấy một vectơ tùy ý và thực hiện các bước lặp sức mạnh. Với xác suất cao, bạn sẽ có được xấp xỉ tốt của trình xác định đầu tiên. Sau đó loại bỏ yếu tố này khỏi ma trận, lặp lại để có được thứ hai. Vân vân.

Nhưng bạn đã thử nếu các triển khai Barnes Hut tSNE nhanh trong ELKI có thể chỉ hoạt động trên dữ liệu của bạn với một chỉ mục như cây che phủ? Tôi đã thực hiện công việc đó tốt khi những người khác thất bại.


3
"Whp." Là viết tắt của?
Nhà khoa học Kodi

Với xác suất cao. Xem tài liệu thống kê.
Có QUIT - Anony-Mousse

2

Nếu mục tiêu của bạn chỉ là thực hiện giảm kích thước theo cách đơn giản và trực tiếp, bạn có thể thử một kỹ thuật bình phương nhỏ nhất (ALS) xen kẽ. Chẳng hạn, Apache Spark's mlibcó triển khai ALS và tôi tin rằng cung cấp một api Java. Điều này sẽ cung cấp cho bạn một ma trận và ma trận . Các ma trận sẽ chứa vectơ hàng visualisable.K × p K × pn×KK×pK×p

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.