Analyse des Composantes du Voisinage

Beginner

This tutorial is from open-source community. Access the source code

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é.