Introduction
Ce laboratoire vise à démontrer l'utilisation de l'Analyse des Composantes du Voisinage (NCA) dans l'apprentissage d'une métrique de distance qui maximise la précision de la classification des plus proches voisins. Il fournit une représentation visuelle de cette métrique par rapport à l'espace d'origine des points.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.
Générer des points de données
Nous allons commencer par générer un ensemble de données de 9 échantillons provenant de 3 classes, et tracer les points dans l'espace d'origine. Pour cet exemple, nous nous concentrons sur la classification du point no 3.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import NeighborhoodComponentsAnalysis
from matplotlib import cm
from scipy.special import logsumexp
X, y = make_classification(
n_samples=9,
n_features=2,
n_informative=2,
n_redundant=0,
n_classes=3,
n_clusters_per_class=1,
class_sep=1.0,
random_state=0,
)
plt.figure(1)
ax = plt.gca()
for i in range(X.shape[0]):
ax.text(X[i, 0], X[i, 1], str(i), va="center", ha="center")
ax.scatter(X[i, 0], X[i, 1], s=300, c=cm.Set1(y[[i]]), alpha=0.4)
ax.set_title("Points originaux")
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.axis("equal") ## afin que les limites soient affichées correctement sous forme de cercles
Visualiser les voisins
Nous allons maintenant visualiser les liens entre les points de données, l'épaisseur d'un lien entre le point no 3 et un autre point étant proportionnelle à leur distance.
def link_thickness_i(X, i):
diff_embedded = X[i] - X
dist_embedded = np.einsum("ij,ij->i", diff_embedded, diff_embedded)
dist_embedded[i] = np.inf
## compute exponentiated distances (use the log-sum-exp trick to
## avoid numerical instabilities
exp_dist_embedded = np.exp(-dist_embedded - logsumexp(-dist_embedded))
return exp_dist_embedded
def relate_point(X, i, ax):
pt_i = X[i]
for j, pt_j in enumerate(X):
thickness = link_thickness_i(X, i)
if i!= j:
line = ([pt_i[0], pt_j[0]], [pt_i[1], pt_j[1]])
ax.plot(*line, c=cm.Set1(y[j]), linewidth=5 * thickness[j])
i = 3
relate_point(X, i, ax)
plt.show()
Apprendre une projection
Nous allons maintenant utiliser l'Analyse des Composantes du Voisinage (NCA) pour apprendre une projection et tracer les points après la transformation. Nous prenons ensuite la projection et trouvons les plus proches voisins.
nca = NeighborhoodComponentsAnalysis(max_iter=30, random_state=0)
nca = nca.fit(X, y)
plt.figure(2)
ax2 = plt.gca()
X_embedded = nca.transform(X)
relate_point(X_embedded, i, ax2)
for i in range(len(X)):
ax2.text(X_embedded[i, 0], X_embedded[i, 1], str(i), va="center", ha="center")
ax2.scatter(X_embedded[i, 0], X_embedded[i, 1], s=300, c=cm.Set1(y[[i]]), alpha=0.4)
ax2.set_title("Projection NCA")
ax2.axes.get_xaxis().set_visible(False)
ax2.axes.get_yaxis().set_visible(False)
ax2.axis("equal")
plt.show()
Sommaire
Dans ce laboratoire, nous avons démontré comment utiliser l'Analyse des Composantes du Voisinage (NCA) pour apprendre une métrique de distance qui maximise la précision de la classification des plus proches voisins. Nous avons visualisé les liens entre les points de données et comparé l'espace d'origine des points avec l'espace transformé.