PCA занадто повільний, коли обидва n, p великі: Альтернативи?


9

Налаштування проблеми

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

Як я бачу, мої варіанти - або "оптимізувати" PCA, або вибрати інший метод зменшення розмірності, який по суті є швидшим.

Мої запитання

  1. Чи є надія, що PCA можна використовувати в режимі "офлайн"? тобто, використовуючи великий набір зображень даних, виконайте на них PCA, а потім використовуйте обчислені для них основні компоненти, щоб зменшити розмірність інших (нових!) точок даних?
  2. Чи можу я пришвидшити розрахунок власних векторів, якщо припустити, що я знаю заздалегідь, що мене цікавлять лише, скажімо, основні 100 основних компонентів?
  3. Чи є альтернативний метод зменшення розмірності, відповідний в моєму випадку (тобто перед застосуванням t-sne), який буде швидшим, ніж PCA? Я шукаю те, що можна легко реалізувати на Java.

Відповіді:


8

Питання 1: Скажімо, ви спостерігали матрицю даних . Звідси можна обчислити eigendecomposition . Питання зараз: якщо ми отримаємо нові дані, що надходять від однієї сукупності, можливо, зібрані в матрицю , чи буде близьким до ідеального ортогонального обертання ? Таке питання вирішується теоремою Девіса-Кахана та загальною теорією збурень матриці (якщо ви можете отримати копію, підручник Стюарта та Суна 1990 року є стандартним посиланням).ХRн×pXTX=QΛQTZRm×pZQZ

Питання 2: Ви, безумовно, можете пришвидшити ситуацію, якщо знаєте, що потрібні лише верхні власні вектори. У RI використовувати для цього; Я впевнений, що існує еквівалент Java, оскільки вони все-таки обгортки Fortran.кrARPACK

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


3

Код, який ви використовуєте, інвертуватиме всю матрицю. Це, мабуть, вже O (p ^ 3). Ви можете наблизити результат в O (p ^ 2), але це все одно буде повільним (але, ймовірно, в 100 разів швидшим). По суті, візьміть довільний вектор і зробіть ітерації потужності. З великою часткою ймовірності ви отримаєте хороший наближення першого власного вектора. Потім вийміть цей фактор з матриці, повторіть, щоб отримати другий. І т.д.

Але чи спробували ви, чи швидка реалізація Barns Hut tSNE в ELKI, можливо, просто працюватиме над вашими даними з індексом, таким як дерево обкладинки? У мене це було добре, коли інші провалилися.


3
Що означає "батог". стояти за?
Кодіолог

З високою ймовірністю. Дивіться статистичну літературу.
Мав QUIT - Anonymous-Mousse

2

Якщо ваша мета полягає в тому, щоб просто і прямо вплинути на зменшення розмірів, ви можете спробувати техніку змінних найменших квадратів (ALS). Наприклад, Apache Spark mlibмає реалізацію ALS, і я вважаю, що пропонує Java-api. Це має дати вамн×К матриця та a К×pматриця. TheК×p матриця буде містити видимі рядкові вектори.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.