> Modules non standards > Scikit-Learn > Principal Component Analysis - PCA
Principal Component Analysis - PCA
Calcul de la PCA (en utilisant la singular value decomposition) :
from sklearn import datasets
from sklearn import decomposition
iris = datasets.load_iris()
pca = decomposition.PCA()
pca.fit(iris.data)
Attention, par défaut, cette fonction centre les variables mais ne les réduit pas ! Si les unités de chaque variable sont différentes, il faut réduire les données :
X = (iris.data - iris.data.mean(axis = 0)) / iris.data.std(axis = 0)
Quelques paramètres pris en entrée :
- n_components : le nombre d'axes à conserver (par défaut, tous). On peut aussi donner le pourcentage (entre 0 et 1) de la variance à expliquer, on aura le nombre mimimum d'axes à conserver.
- random_state : le fixer si on veut des résultats reproductibles.
Champs produits dans l'objet pca (de type sklearn.decomposition.pca.PCA), à accéder par
pca.explained_variance_ratio_ par exemple :
- n_components_ : le nombre d'axes conservés.
- explained_variance_ : les variances selon chaque axe principal, triées par ordre décroissant.
- explained_variance_ratio_ : les ratios de la variance expliquée sur la variance totale pour chaque axe principal, ceux-ci étant triés par ordre de valeur propre décroissante (si tous les axes principaux gardés, la somme vaut 1)
- singular_values_ : les valeurs propres, par ordre décroissant.
- components_ : une matrice nombre d'axes principaux x nombre de features, donc chaque ligne sont les coefficients de la combinaison linéaire de l'axe correspondant (les vecteurs lignes sont les vecteurs propres, orthogonaux entre eux et tous de norme 1).
- pca.transform(iris.data) : les coordonnées des points transformés sur les axes principaux (un point par ligne). C'est en fait numpy.dot(iris.data, pca.components_.T).
- pca.inverse_transform(X) : transformation inverse, des axes de la PCA vers les axes d'origine. Si on a conservé tous les axes, pca.inverse_transform(pca.transform(iris.data)) redonne la matrice d'origine.
- pc1 = X @ pca.components[0,:]; pc2 = X @ pca.components[1,:]; pyplot.scatter(pc1, pc2) : projection sur les 2 premières dimensions.
Cercle des corrélations :
an = numpy.linspace(0, 2 * numpy.pi, 100)
pyplot.plot(numpy.cos(an), numpy.sin(an))
for i in range(X.shape[1]):
x = numpy.corrcoef(pc1, X[:,i])[0, 1]
y = numpy.corrcoef(pc2, X[:,i])[0, 1]
pyplot.annotate('', xy = (x, y), xytext = (0,0), arrowprops = {'arrowstyle': '->'})
pyplot.annotate(featureNames[i], xy = (x + 0.02, y + 0.02))
pyplot.axis('equal')
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert