Вы должны действительно пересмотреть свой выбор уменьшения размерности, если считаете, что вам нужно 1000 основных компонентов. Если у вас их так много, то у вас больше нет возможности интерпретации, поэтому вы также можете использовать другие и более гибкие алгоритмы уменьшения размерности (например, вариационные autencoders, t-sne, kernel-PCA). Ключевым преимуществом PCA является интерпретируемость основных компонентов.
Если у вас есть видеопоток того же места, то у вас должно быть в порядке <10 компонентов (хотя поиск основных компонентов может быть лучше). Более того, если ваш набор данных изображений не состоит из похожих изображений, то PCA, вероятно, не является правильным выбором. </p>
Кроме того, для изображений может лучше подойти факторизация неотрицательной матрицы (NMF). Для NMF вы можете выполнить стохастическую оптимизацию градиента, сэмплируя как пиксели, так и изображения для каждого шага градиента.
Однако, если вы все еще настаиваете на выполнении PCA, то я думаю, что рандомизированный решатель, предоставленный Facebook, является лучшим вариантом, который у вас есть. Запустите pip install fbpca
и введите следующий код
from fbpca import pca
# load data into X
U, s, Vh = pca(X, 1000)
Невозможно получить быстрее, чем это без использования какой-либо структуры матрицы, например, разреженность или состав блоков (что вряд ли будет в вашем наборе данных).
Кроме того, если вам нужна помощь, чтобы выбрать правильное количество основных компонентов, я рекомендую использовать этот код
import fbpca
from bisect import bisect_left
def compute_explained_variance(singular_values):
return np.cumsum(singular_values**2)/np.sum(singular_values**2)
def ideal_number_components(X, wanted_explained_variance):
singular_values = fbpca.svd(X, compute_uv=False) # This line is a bottleneck.
explained_variance = compute_explained_variance(singular_values)
return bisect_left(explained_variance, wanted_explained_variance)
def auto_pca(X, wanted_explained_variance):
num_components = ideal_number_components(X, explained_variance)
return fbpca.pca(X, num_components) # This line is a bottleneck if the number of components is high
Конечно, приведенный выше код не поддерживает перекрестную проверку, которую вы действительно должны использовать, чтобы выбрать правильное количество компонентов.