web-dev-qa-db-fra.com

Combien de composants principaux à prendre?

Je sais que l'analyse en composantes principales réalise une SVD sur une matrice, puis génère une matrice de valeurs propres. Pour sélectionner les composantes principales, nous ne devons prendre que les premières valeurs propres. Maintenant, comment décidons-nous du nombre de valeurs propres que nous devrions prendre dans la matrice de valeurs propres?

29
London guy

Pour décider du nombre de valeurs propres/vecteurs propres à conserver, vous devez prendre en compte la raison pour laquelle vous pratiquez l'ACP. Le faites-vous pour réduire les besoins en stockage, pour réduire la dimensionnalité pour un algorithme de classification ou pour une autre raison? Si vous n’avez pas de contraintes strictes, je vous recommande de tracer la somme cumulée des valeurs propres (en supposant qu’elles soient dans l’ordre décroissant). Si vous divisez chaque valeur par la somme totale des valeurs propres avant le traçage, votre graphique indiquera la fraction de la variance totale conservée par rapport au nombre de valeurs propres. Le graphique fournira alors une bonne indication du moment où vous atteignez le point de rendements décroissants (c’est-à-dire que vous conservez peu de variance en conservant des valeurs propres supplémentaires).

32
bogatron

Il n'y a pas de réponse correcte, c'est quelque part entre 1 et n.

Pensez à un élément principal en tant que rue d’une ville que vous n’avez jamais visitée auparavant. Combien de rues devriez-vous emprunter pour connaître la ville?

Eh bien, vous devriez évidemment visiter la rue principale (la première composante), et peut-être aussi certaines des autres grandes rues. Avez-vous besoin de visiter chaque rue pour bien connaître la ville? Probablement pas.

Pour connaître parfaitement la ville, vous devriez visiter toutes les rues. Mais si vous pouviez visiter, disons 10 des 50 rues et comprendre à 95% la ville? Est-ce suffisant? 

Fondamentalement, vous devez sélectionner suffisamment de composants pour expliquer suffisamment la variance avec laquelle vous êtes à l'aise. 

17
Neil McGuigan

Comme d'autres l'ont dit, cela ne fait pas de mal de tracer la variance expliquée.

Si vous utilisez PCA comme étape de prétraitement pour une tâche d'apprentissage supervisé, vous devez valider la totalité du pipeline de traitement des données et traiter le nombre de dimensions PCA comme un hyperparamètre à sélectionner à l'aide d'une recherche par grille sur le score final supervisé ou RMSE pour la régression).

Si la recherche de grille croisée sur l'ensemble du jeu de données est trop coûteuse, essayez 2 sous-échantillons, par exemple. une avec 1% des données et la seconde avec 10% et voyez si vous obtenez la même valeur optimale pour les dimensions de la PCA.

8
ogrisel

Il y a un certain nombre d'heuristiques utilisées pour cela.

Par exemple. en prenant les k premiers vecteurs propres qui capturent au moins 85% de la variance totale .

Cependant, pour une haute dimensionnalité, ces heuristiques ne sont généralement pas très bonnes.

7
Anony-Mousse

Selon votre situation, il peut être intéressant de définir l'erreur relative maximale autorisée en projetant vos données sur des dimensions ndim

Je vais illustrer cela avec un petit exemple matlab. Ignorez le code si cela ne vous intéresse pas.

Je vais d'abord générer une matrice aléatoire d'échantillons n (lignes) et p comportant exactement 100 composantes principales non nulles.

n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
  data = data + Rand(n, 1)*Rand(1, p);
end

L'image ressemblera à:

 enter image description here

Pour cet exemple d'image, on peut calculer l'erreur relative commise en projetant vos données d'entrée sur des dimensions ndim comme suit:

[coeff,score] = pca(data,'Economy',true);

relativeError = zeros(p, 1);
for ndim=1:p
    reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';
    residuals = data - reconstructed;
    relativeError(ndim) = max(max(residuals./data));
end

Le tracé de l'erreur relative en fonction du nombre de dimensions (composantes principales) donne le graphique suivant:

 enter image description here

Sur la base de ce graphique, vous pouvez choisir le nombre de composants principaux à prendre en compte. Dans cette image théorique, 100 composants donnent une image exacte. Donc, prendre plus de 100 éléments est inutile. Si vous voulez par exemple une erreur maximale de 5%, vous devez utiliser environ 40 composants principaux.

Disclaimer: Les valeurs obtenues ne sont valables que pour mes données artificielles. Par conséquent, n'utilisez pas les valeurs proposées à l'aveuglette dans votre situation, mais effectuez la même analyse et faites un compromis entre l'erreur que vous faites et le nombre de composants dont vous avez besoin.

Référence du code

4
m7913d

Je recommande fortement le document suivant de Gavish et Donoho: Le seuil strict optimal pour les valeurs singulières est 4/sqrt (3)

J'ai posté un plus long résumé de ceci sur CrossValidated (stats.stackexchange.com) . En bref, ils obtiennent une procédure optimale dans la limite de très grandes matrices. La procédure est très simple, ne nécessite aucun paramètre réglé manuellement et semble fonctionner très bien dans la pratique.

Ils ont un supplément de code Nice ici: https://purl.stanford.edu/vg705qn9070

1
Alex Williams