L2 – forme vectorielle

Calcul de la matrice des distances L2 sous forme vectorielle pour une solution utilisant le voisinage d’ordre k (K-nearest neighbor). Temps de calcul divisé par 100 par rapport à l’utilisation de boucles!

def compute_distances_no_loops(self, X):
    """
    Compute the distance between each test point in X and each training point
    in self.X_train using no explicit loops.
    """
    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train))

    # Déploiement du carré dans L2 et écriture sous forme matricielle
    # ms somme des carrés
    # mp produit croisé

    x_2 = np.sum(np.square(X), axis = 1)
    mx_2 = np.array([x_2,]*num_train)
    xt_2 = np.sum(np.square(self.X_train), axis = 1)
    mxt_2 = np.array([xt_2,]*num_test)
    
    ms = mx_2.T + mxt_2

    mp = np.matmul(X,np.transpose(self.X_train))

    dists = np.sqrt(ms - 2*mp)

    return dists