J'essaie d'effectuer une PCA sur un jeu de données d'image avec 100 000 images chacune de taille 224x224x3.
J'espérais projeter les images dans un espace de dimension 1000 (ou quelque part autour de cela). P>
Je fais cela sur mon ordinateur portable (16 Go de RAM, I7, pas de GPU) et déjà défini < em> svd_solver = "randomisé" em>. p>
Cependant, le raccord prend pour toujours. Est-ce que l'ensemble de données et la dimension image est trop grande ou y a-t-il une astuce que je pourrais utiliser? P>
Merci! P>
EDIT: P>
Ceci est le code: p> x est une matrice de 100 000 x 150528 dont les lignes représentent une image aplatie. P> P>
3 Réponses :
Vous pouvez essayer de définir
from sklearn.decomposition import FastICA
Essayez d'expérimenter avec itérated_power code> Paramètre de PCA P>
Le itérated_power code> algorithme n'est pas idéal lorsque vous vous attendez à un grand nombre de composants principaux. La raison en est que le taux de convergence dépend de l'écart entre les valeurs singulières (qui spécifient la quantité de variance expliquée par chaque composante principale). Ainsi, si vous vous attendez à une grande quantité de composants principaux informatifs, la méthode d'alimentation itératée sera inefficace.
Vous devez vraiment reconsidérer votre choix de réduction de dimensionnalité si vous pensez avoir besoin de 1000 composants principaux. Si vous en avez beaucoup, vous n'avez plus d'interprétabilité pour que vous puissiez également utiliser d'autres algorithmes de réduction de dimensionnalité plus flexibles et plus flexibles (par exemple, des autocodeurs variationnels, T-SNE, Kernel-PCA). Un avantage clé de la PCA est l'interprétabilité si les composants principaux.
Si vous avez un flux vidéo du même endroit, vous devez être bien avec
Aussi, pour les images, la factorisation de matrice non négative (NMF) pourrait être mieux adaptée. Pour NMF, vous pouvez effectuer une optimisation de gradient stochastique, sous-échantillonnage à la fois des pixels et des images pour chaque étape de gradient. P>
Cependant, si vous insistez toujours sur l'exécution de la PCA, je pense que le solveur randomisé fourni par Facebook est le meilleur Shot tu as. Exécuter PIP INSTALL FBPCA CODE> et exécutez le code suivant P>
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
Veuillez fournir un code pour illustrer votre problème
Pourquoi souhaitez-vous le projeter à un espace de 1000 dimensions? Un nombre plus sensible de dimensions est ~ 5-100
L'espace latent ne doit pas nécessairement être 1000 dimensionnel, mais il ne peut pas être supérieur à environ 5000 ou 6000 à cause des contraintes de mémoire
Néanmoins, si vous recherchez un espace 1000 dimensionnel pour vous des images, vous ne devez probablement pas utiliser de PCA, mais une technique d'extraction de fonctionnalités plus compliquée ou de technique de compression de données. Quoi qu'il en soit, vous pouvez consulter FBPCA pour un solveur SVD randomisé rapide. Je ne pense pas qu'il y ait un algorithme plus rapide que celui des données denses.