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 và số ví dụ là lớn.
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
- 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?
- 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?
- 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.