J'essaie de réduire la dimensionnalité et le bruit d'un ensemble de données en effectuant l'ACP sur l'ensemble de données et en jetant les derniers PC. Après cela, je veux utiliser certains algorithmes d'apprentissage automatique sur les PC restants, et donc je veux normaliser les données en égalisant la variance des PC pour améliorer le fonctionnement des algorithmes.
Une façon simple consiste à normaliser simplement la variance par rapport aux valeurs unitaires. Cependant, le premier PC contient plus de variance par rapport à l'ensemble de données d'origine que les suivants, et je veux toujours lui donner plus de "poids". Je me demandais donc: existe-t-il un moyen simple de simplement diviser sa variance et de la partager avec les PC avec moins de variances?
Une autre façon consiste à mapper les PC à l'espace de fonctionnalité d'origine, mais dans ce cas, la dimensionnalité augmenterait également à la valeur d'origine.
Je suppose qu'il vaut mieux garder les colonnes résultantes orthogonales, mais ce n'est pas nécessaire pour le moment.
la source
Réponses:
Il n'est pas tout à fait clair pour moi que ce que vous demandez est ce dont vous avez vraiment besoin: une étape de prétraitement courante dans l'apprentissage automatique est la réduction de dimensionnalité + le blanchiment, ce qui signifie faire de l'ACP et standardiser les composants, rien d'autre. Mais je vais néanmoins me concentrer sur votre question telle qu'elle est formulée, car elle est plus intéressante.
Soit la matrice de données n × d centrée avec des points de données en lignes et des variables en colonnes. PCA équivaut à une décomposition en valeurs singulières X = U S V ⊤ ≈ U k S k V ⊤ k , où pour effectuer la réduction de dimensionnalité, nous ne gardons que k composantes. Une «rotation factorielle» orthogonale de ces composantes implique de choisir une matrice orthogonale k × k R et de la brancher dans la décomposition: X ≈ U k S k VX n × d
Nous sommes maintenant prêts à formuler le problème en termes mathématiques: compte tenu des chargements non rotatifs , trouver la matrice de rotationRtelle que les chargements tournés,LR, ont une somme égale de carrés dans chaque colonne.L = VkSk/ n - 1-----√ R L R
Résolvons-le. Les sommes des colonnes des carrés après rotation sont égales aux éléments diagonaux de Cela a du sens: la rotation redistribue simplement les variances des composantes, qui sont à l'origine données pars 2 i /(n-1), entre elles, selon cette formule. Nous devons les redistribuer de sorte qu'ils deviennent tous égaux à leur valeur moyenneμ.
Je ne pense pas qu'il existe une solution de forme fermée à cela, et en fait, il existe de nombreuses solutions différentes. Mais une solution peut être facilement construite de manière séquentielle:
Exemple
Terminé.
J'ai écrit le script Matlab qui implémente cet algorithme (voir ci-dessous). Pour cette matrice d'entrée, la séquence des angles de rotation est:
Variations des composants après chaque étape (en lignes):
La matrice de rotation finale (produit de trois matrices de rotation 2D):
Voici le code:
Voici le code en Python fourni par @feilong:
la source
mu
.mais n'a pas démontré d'où vient cette équation; pensant probablement que c'est évident sans explication. Évident ou non, je crois que cela vaut la peine d'être élucidé - d'une certaine manière. Ma réponse présente une façon.
la source
Si j'interprète les choses correctement, vous voulez dire que la première composante principale (valeur propre) explique la majeure partie de la variance dans les données. Cela peut se produire lorsque votre méthode de compression est linéaire. Cependant, il peut y avoir des dépendances non linéaires dans votre espace d'entités.
Voici un exemple de scikit où ils effectuent une recherche dans la grille pour trouver le nombre optimal de composants principaux à conserver (hyper-paramètre) à l'aide de PCA. Enfin, ils appliquent une régression logistique sur l'espace dimensionnel inférieur: http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py
Protip: Les encodeurs automatiques n'ont pas de solution de formulaire fermé (afaik), donc si votre contexte est en train de diffuser des données, cela signifie que vous pouvez mettre à jour en continu votre encodeur automatique (représentation compressée) et ainsi compenser des choses telles que la dérive du concept. Avec pca, vous devez réentraîner le mode batch de temps en temps à mesure que de nouvelles données entrent.
Quant à donner à certaines fonctionnalités plus de "poids", voir la régularisation (je commencerais par les normes https://en.wikipedia.org/wiki/Norm_(mathematics) ). Vous pourriez également être surpris de voir à quel point la régression logistique est similaire à celle du perceptron.
la source