Atelier : distances sans boucle
Calculer des distances pairwise en numpy avec correction.
Énoncé
Calculez la matrice des distances L2 entre les lignes de X = [[1., 2.], [3., 4.], [5., 6.]] sans boucle Python, puis les distances de chaque ligne à [3., 4.].
Contraintes
Boucles interdites sauf vérification sur un couple. Affichez la matrice (3, 3) et le vecteur (3,).
Indices
Astuce : ||a-b||² = ||a||² + ||b||² - 2 a·b. Ou version lisible : (X[:, None, :] - X[None, :, :]) puis norme sur axis=2. La diagonale doit être 0.
[[0. 2.828 5.657] [2.828 0. 2.828] [5.657 2.828 0.]]
ref = np.array([3., 4.]) print(np.sqrt(((X - ref) ** 2).sum(axis=1))) # [2.828 0. 2.828]
Si une distance est négative sous la racine à `1e-12` près, écrasez avec `maximum(..., 0)` : c'est du bruit flottant, pas une erreur de formule. Ce geste servira tel quel dans kNN et k-means.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
import numpy as np
X = np.array([[1., 2.], [3., 4.], [5., 6.]])
n2 = (X ** 2).sum(axis=1)
D2 = n2[:, None] + n2[None, :] - 2 * X @ X.T
D = np.sqrt(np.maximum(D2, 0))
print(D.round(3))