Icone color1 07

Metodi Lineari per la Riduzione della Dimensionalità: Analisi delle Componenti Principali

Autore: Matteo Alberti

 

 

Fra le metodologie per la riduzione lineare della dimensionalità le PCA o Componenti Principali sono certamente fra gli strumenti principe dello Statistical Machine Learning.

Sebbene vi si concentri molto spesso su strumenti in grado di catturare la componente non lineare l’analisi delle componenti principali risulta esser la base di partenza per molte analisi (e come strumento di preprocessing) e la loro conoscenza diventa improrogabile nel caso in cui le condizioni sulla linearità risultano soddisfatte.

In questo tutorial andremo ad introdurre a livello matematico la formazione delle componenti principali in maniera chiara e coincisa, la loro implentazione in python ma soprattutto la loro interpretazione

 

“L’idea alla base è quella di trovar un sistema di riferimento tale che la varianza delle variabili rappresentate ne risulti massimizzata”

 

Ciò avviene dividendo la varianza totale in un numero uguale di variabili di partenza dove però sarà possibile ridurre il numero in base al contributo che ciascuna PC fornisce nella costruzione della nostra varianza totale.

Vogliamo ricordare che l’applicazione della Principal Component Analysis risulta utile quando le variabili di partenza non risultano esser indipendenti

Vediamo di introdurle con il corretto formalismo matematico:

 

Dato un insieme di p variabili quantitative  X1,X2, . . . , Xp (variabili centrate o standardizzate) vogliamo determinare un nuovo insieme di k variabili t.c  k≤p indicate con Ys (s=1,2,…k)  che godano delle seguenti proprietà:

 

Per costruzione le nostre PC sono incorrelate, a media nulla e che riproducano (in ordine crescente la maggior quota di varianza possibile.

Ne risulta che la combinazione lineare sarà:

Dobbiamo quindi trovare dei coefficienti v t.c soddisfino le nostre proprietà. Si tratta di un problema di massimo vincolato dove il primo vincolo è detto di Normalizzazione:

Il nostro sistema diventa cosi:

Dove la prima equazione risulta esser la nostra funzione obiettivo mentre la seconda il nostro primo vincolo.

E si risolve tramite il Metodo dei moltiplicatori di Lagrange:

Calcolo del gradiente di Le del suo annullamento ottenendone:

Ne risulta un sistema lineare omogeneo.

ammette infinite soluzioni (che rispettano il vincolo) abbassando il rango della matrice dei coefficienti del sistema:

che corrispondono a λs dette Autovalori di ∑.

Analogamente per la costruzione della seconda PCA (e cosi per tutte le altre) subentra al nostro sistema il Vincolo di Ortogonalità, dato dalla nostra richiesta che le PC siano incorrelate, esprimibile nel seguente modo:

Quindi impostando la lagrangiana in p+2 variabili otteniamo:

Da cui otteniamo il secondo autovalore Y2  dove ricordiamo vale la seguente proprietà:

Proprietà delle PC:

 

Ogni autovalore di ∑ ha un ruolo nella varianza della rispettiva PC

semidefinite positiva

Varianza Totale

Varianza Generalizzata

 

CRITERI DI SCELTA:

Per la scelta del numero k (con k<p) di PC da mantenere in analisi non esiste un criterio universalmente accettato e valido. Risulta di buona prassi dunque utilizzarli congiuntamente e tener sempre in riferimento le necessità dell’analisi.

Vogliamo esporre i principali:

(1)

                                                                                   

Misura assoluta                Normalizzazione varianza spiegata                  % cumulata

 

(2)

Screen-Plot

Vengono selezionate la prime k PC in base  alla riduzione della pendenza (anche detto criterio del gomito). In questo caso specifico le PC da mantenere in analisi sarebbero le prime due.

 

(3)

Criterio di Kaiser

Anche noto come il criterio dell’autovalore maggiore di 1 (valido unicamente per variabili standardizzate)

 

 

Andiamo a questo punto ad implementare le nostre PCA:

Importiamo i pacchetti necessari da scikit-learn

 

import numpy as np

from sklearn.decomposition import PCA

La classe presenta i seguenti attributi:

Sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

Andiamo a testarlo su nuovi dati reali, prediamo per esempio sui dati Wine importabili attraverso il comandoAndiamo a commentare i parametri principali:
• n_components= numero di component da tenere in analisi. Consigliamo in una fase di scelta di non settare questo valore e di valutare in base ai criteri sopra esposti
• svd_solver= ci mette a disposizione alcune fra le principali alternative (arpack, randomized..) vogliamo ricordare che PCA non supporta sparse data (per il quale occorrerà caricare TruncatedSVD)

from sklearn import datasets

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from sklearn import decomposition

A questo punto andiamo ad implementare PCA ed a farne un plot

np.random.seed(123)
wine = datasets.load_wine()

X = wine.data

y = wine.target



fig = plt.figure(1, figsize=(5, 4))

plt.clf()

ax = Axes3D(fig, rect=[1, 0, 1, 0.9], elev=30, azim=222)



plt.cla()

pca = decomposition.PCA(n_components=None)

pca.fit(X)

X = pca.transform(X)





for name, label in [('Setosa', 0), ('Versicolour', 1), ('Virginica', 2)]:

ax.text3D(X[y == label, 0].mean(),

X[y == label, 1].mean() + 1.5,

X[y == label, 2].mean(), name,

bbox=dict(alpha=.5, edgecolor='b', facecolor='w'))

# Reorder the labels to have colors matching the cluster results

y = np.choose(y, [1, 2, 0]).astype(np.float)

ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.spectral,

edgecolor='r')



ax.w_xaxis.set_ticklabels([])

ax.w_yaxis.set_ticklabels([])

ax.w_zaxis.set_ticklabels([])



plt.show()

Questo sarà il grafico che andremo ad ottenere:

1 commento

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *