Налаштування проблеми
У мене є точки даних (зображення) високого розміру (4096), які я намагаюся візуалізувати у 2D. З цією метою я використовую t-sne таким чином, як у наведеному нижче прикладі коду Карпаті .
Документація scikit-learn рекомендує використовувати PCA, щоб спочатку зменшити розмірність даних:
Настійно рекомендується використовувати інший метод зменшення розмірності (наприклад, PCA для щільних даних або усіченийSVD для розріджених даних), щоб зменшити кількість розмірів до розумної кількості (наприклад, 50), якщо кількість особливостей дуже велика.
Я використовую цей код від Darks.Liu для виконання PCA на 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);
Він використовує jblas для операцій лінійної алгебри, яка, з того, що я читав, повинна бути найшвидшим варіантом там. Однак обчислення власних векторів та власних значень (рядки 3,4) виявляється величезним вузьким місцем (~ 10 хвилин, що набагато довше, ніж я можу дозволити собі на цьому етапі).
Я читав про Kernel PCA, який повинен бути хорошим для випадків, коли розмірність дуже велика, але час її виконання становить що може бути проблематично, оскільки я також хочу розглянути справи як розмірності, так і числа прикладів є великими.
Як я бачу, мої варіанти - або "оптимізувати" PCA, або вибрати інший метод зменшення розмірності, який по суті є швидшим.
Мої запитання
- Чи є надія, що PCA можна використовувати в режимі "офлайн"? тобто, використовуючи великий набір зображень даних, виконайте на них PCA, а потім використовуйте обчислені для них основні компоненти, щоб зменшити розмірність інших (нових!) точок даних?
- Чи можу я пришвидшити розрахунок власних векторів, якщо припустити, що я знаю заздалегідь, що мене цікавлять лише, скажімо, основні 100 основних компонентів?
- Чи є альтернативний метод зменшення розмірності, відповідний в моєму випадку (тобто перед застосуванням t-sne), який буде швидшим, ніж PCA? Я шукаю те, що можна легко реалізувати на Java.