Настройка проблемы
У меня есть данные (изображения) высокой размерности (4096), которые я пытаюсь визуализировать в 2D. С этой целью я использую t-sne способом, подобным следующему примеру кода Karpathy .
Документация Scikit-Learn рекомендует использовать PCA, чтобы сначала уменьшить размерность данных:
Настоятельно рекомендуется использовать другой метод уменьшения размерности (например, PCA для плотных данных или TruncatedSVD для разреженных данных), чтобы уменьшить количество измерений до разумного значения (например, 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 минут, что намного дольше, чем я могу себе позволить на этом этапе).
На мой взгляд, я могу либо «оптимизировать» PCA, либо выбрать другой метод уменьшения размерности, который по своей природе быстрее.
Мои вопросы
- Есть ли надежда, что PCA можно будет использовать «в автономном режиме»? то есть, используя большой набор данных изображений, выполните PCA для них, а затем используйте основные компоненты, рассчитанные для них, чтобы уменьшить размерность других (новых!) точек данных?
- Могу ли я ускорить расчет собственных векторов, предполагая, что знаю заранее, что меня интересуют, скажем, только первые 100 основных компонентов?
- Есть ли альтернативный метод уменьшения размерности, который подходит в моем случае (т.е. до применения t-sne), который будет быстрее, чем PCA? Я ищу что-то, что может быть легко реализовано на Java.
источник
mlib
источник