PCA слишком медленный, когда оба n, p большие: альтернативы?


9

Настройка проблемы

У меня есть данные (изображения) высокой размерности (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 минут, что намного дольше, чем я могу себе позволить на этом этапе).

О(N3)

На мой взгляд, я могу либо «оптимизировать» PCA, либо выбрать другой метод уменьшения размерности, который по своей природе быстрее.

Мои вопросы

  1. Есть ли надежда, что PCA можно будет использовать «в автономном режиме»? то есть, используя большой набор данных изображений, выполните PCA для них, а затем используйте основные компоненты, рассчитанные для них, чтобы уменьшить размерность других (новых!) точек данных?
  2. Могу ли я ускорить расчет собственных векторов, предполагая, что знаю заранее, что меня интересуют, скажем, только первые 100 основных компонентов?
  3. Есть ли альтернативный метод уменьшения размерности, который подходит в моем случае (т.е. до применения t-sne), который будет быстрее, чем PCA? Я ищу что-то, что может быть легко реализовано на Java.

Ответы:


8

ИксрN×пИксTИксзнак равноQΛQTZрм×пZQZи матрица теории возмущений в целом (если вы можете получить копию, учебник Стюарта и Sun 1990 года является стандартной ссылкой).

КrARPACK

Вопрос 3: Я ничего не знаю о реализации Java, но этот поток обсуждает ускорение PCA, как и этот поток CV. Существует множество исследований такого рода вещей, и существует множество методов, использующих такие вещи, как приближения низкого ранга или рандомизация.


3

Код, который вы используете, будет инвертировать всю матрицу. Это, вероятно, уже O (p ^ 3). Вы можете аппроксимировать результат в O (p ^ 2), но он все равно будет медленным (но, вероятно, в 100 раз быстрее). По сути, возьмите произвольный вектор и сделайте степенные итерации. С большой вероятностью вы получите хорошее приближение первого собственного вектора. Затем уберите этот фактор из матрицы, повторите, чтобы получить второе. И т.п.

Но пытались ли вы, чтобы быстрые реализации Barnes Hut tSNE в ELKI, возможно, просто работали с вашими данными с таким индексом, как дерево обложек? Эта реализация хорошо работала, когда другие терпели неудачу.


3
Что значит "whp." стоять за?
Кодиолог

С большой вероятностью. Смотрите статистику литературы.
Выйти - Anony-Mousse

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.