Question

J'ai mis en œuvre l'algorithme PCA et je compris très bien mais j'ai quelques questions. Mon code est ci-dessous et il est la mise en œuvre très simple.

import numpy as np

x = np.loadtxt('CCPP', delimiter=',')
row, column = x.shape

# Mean normalization
for i in range(column):
    x[:,i] = (x[:,i] - x[:,i].mean()) / (x[:,i].max() - x[:,i].min())

sigma = x.transpose().dot(x) / row
u, s, v = np.linalg.svd(sigma, 0)
z = x.dot(u[:,:3]) ## new features

new_x = z.dot(u[:,:3].transpose()) ##reconstruction

Première question

Comme vous pouvez le voir ci-dessus ma variable sigma est

x.transpose (). Point (x) / row

Il est de me donner une matrice nxn (n est le nombre de fonctions). Mais la formule de sigma est $$ \ Sigma = \ frac {1} {n} \ sum_ {i = 1} ^ n x ^ {(i)} {x ^ {(i)}} ^ T $$

Pourquoi il est un symbole de sommation dans la formule? Je veux dire, si j'utilise cette formulation sigma alors sigma va être un nombre, pas une matrice. Je dois obtenir la matrice nxn, non? Donc, ma mise en œuvre sigma correcte? ou suis-je manque quelque chose au sujet de la formule?

Deuxième question

Quand nous reconstruisons X (en bas dans le code), devrait x_nouveaux égal à mon premier X? Je veux dire, je réduit la dimension de l'ensemble de données, alors je reconstruit, ensemble de données d'origine et jeu de données reconstruit doivent être les mêmes, non? Ceci est ma deuxième question.

Troisième question

Celui-ci est facile. Dois-je utiliser la compression des données pour chacun de mes ensemble de données qui a 1000, 100000 ou plus de fonctionnalités? Je veux dire, je peux toujours utiliser? Est-ce un bon choix pour l'utiliser à chaque fois?

Était-ce utile?

La solution

En ce qui concerne Première question .

Dans la formule ci-dessus, si je ne me trompe pas, x est une matrice d'éléments. Alors, que la formule veut de vous, est de résumer tous les produits de points de chaque ligne avec sa transposition. Cela vous donnera scalaire.

x = np.array([1, 2, 3, 4])
res = x.dot(x.transpose())
# res = 30

Donc, mon Sugestion serait de changer cette ligne de code à:

for i in range(row):
    sigma += x[i].transpose().dot(x[i])
sigma = sigma/row

Deuxième question

Parce que vous avez réduit la dimensionnalité, la matrice x_new ne sera pas la même.

Troisième question

Quand utiliser l'APC est une chose du problème de domaine. Le point de réduction de dimensionnalité est, pour obtenir de nouveaux ensembles de données, qui ne sera pas aussi difficile à traiter, mais il va perdre quelques informations. Donc, si vous êtes votre « résultat » / « temps de processus » est bon, je ne pense pas que vous devriez l'utiliser.

Autres conseils

Première question: calculer $ \ Sigma $

En fait, vous effectuez le même calcul, mais en utilisant une opération de matrice au lieu d'une opération scalaire. Vous pourriez être induits en erreur par votre notation de la matrice de fonction $ X $ que vous écrivez $ x $ car en fait $$ X = (x_j ^ {(i)}) _ {i, j} = \ Big (x ^ {(1)} ... x ^ {(i)} ... x ^ {(n)} \ Big) ^ T $$ qui est-à-dire, $ i $ -ième rangée de la matrice $ X $ contient $ x ^ {(i)} $ l $ i $ -ème échantillon.

Alors, quand vous voulez calculer la matrice de covariance empirique $ \ Sigma $ (ce qui est en effet un n \ n fois $ $ matrice), vous avez: $$ \ Sigma = \ frac {1} {n} \ sum_ {i = 1} ^ nx ^ {(i)} {x ^ {(i)}} ^ T = \ frac {1} {n} X ^ TX $$ vous pouvez vérifier que c'est exactement le même calcul.

Dans votre code, vous calcule en fait directement $ \ Sigma $ en utilisant l'opération de matrice (ie $ \ Sigma = \ frac {1} {n} X ^ TX $) et cela ne vous donne un n $ \ times n $ matrice. Ainsi, à la fois votre mise en œuvre et la formule est correcte.

Deuxième question: la reconstruction de $ X $

Votre nouvelle matrice de fonction $ Z $ est un $ n \ 3 fois matrice $ en fonction de votre code. En fait, votre code ne montre pas la taille originale de l'espace de représentation, nous verrons les deux cas ici:

  1. $ X $ est une matrice n \ times $ 3 $, alors vous ne touchez à aucun type de réduction de dimension et vous devriez avoir $ X_ {new} = X $ (au moins en théorie, en pratique, vous pourriez avoir une très petite erreur d'approximation numérique, mais il sera essentiellement le même)
  2. $ X $ est une n \ fois $ d $ matrice avec $ d> 3 $, alors vous faites effectuer une réduction de dimension et dans ce cas vous débarrasser de certaines informations contenues dans les données d'origine et dans ce cas $ X_ {new} \ neq $ X

Dans votre cas, je suppose que vous avez $ d> 3 $ et que vous êtes dans la deuxième situation.

Troisième question: quand appliquer PCA

Eh bien cela dépend en fait ...

Tout d'abord, l'APC effectue une SVD qui peut devenir très cher si vous avez beaucoup de fonctionnalités. En fait, il y a plusieurs façons de calculer PCA, votre chemin est le plus proche de la théorie mathématique, mais dans la pratique le calcul d'un SVD directement sur $ X $ évite le calcul de $ X ^ T X $, ce qui est coûteux et permet de récupérer le même espace. Mais en tout cas, dans une situation, il peut être coûteux et prend du temps et donc pas pratique.

PCA trie le nouvel espace de caractéristique en fonction de la valeur des valeurs propres, à savoir de la variance des nouvelles directions, en supprimant la dernière direction pourrait, dans certains cas, enlever un peu de bruit qui peut aider. Cependant, en même temps, il peut jeter des informations précieuses discrimative, ce pourquoi d'autres méthodes telles que LDA peut être intéressant.

Donc, pour résumer, la réponse à la question est non, ce n'est pas un bon choix pour l'utiliser à chaque fois, cela dépend de votre problème.

Licencié sous: CC-BY-SA avec attribution
scroll top