Le plus simple est de ne travailler qu’avec des tableaux numpy :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> import numpy as np >>> data = [ ... [1, 8, 6, 7], ... [1.1, 8.3, 5.7, 7], ... [0.9, 8.2, 5.9, 7.2], ... [1.3, 7.8, 6.3, 6.9], ... ] >>> data = np.array(data) >>> data array([[1. , 8. , 6. , 7. ], [1.1, 8.3, 5.7, 7. ], [0.9, 8.2, 5.9, 7.2], [1.3, 7.8, 6.3, 6.9]]) >>> a = data[0] >>> a array([1., 8., 6., 7.]) |
(Même si c’est le cas, je ne sais toujours pas comment transformer mon dictionnaire data en ta matrice data !)
Il ressemble à quoi ton dictionnaire de départ ?
Quant à la fonction update_centers yes je bloque
Supposons que les centres sont dans la matrice centers
(cf. mon exemple plus haut). Chaque centre est identifié par son indice dans cette matrice. Il te faut donc, pour chaque vecteur, déterminer l’indice du centre le plus proche. Tu obtiens donc une liste de $N$ valeurs (pour chaque vecteur, un centre associé) :
1 2 3 4 | vectors_to_centers = [] for vector in data: distances = [dist(vector, c) for c in centers] vectors_to_centers.append(np.argmin(distances)) |
Ou, en plus court :
1 2 3 4 | vectors_to_centers = np.array([ np.argmin([dist(vector, c) for c in centers]) for vector in data ]) |
Regarde ce que tu obtiens avec les données artificielles ci-dessus pour comprendre ce qu’il se passe.
Comme vectors_to_centers
est un tableau numpy, tu peux facilement récupérer les indices des vecteurs associés à un centre particulier (np.where
) puis récupérer les vecteurs en question à partir de ces indices (https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html#index-arrays).