Bonjour tocki,

Envoyé par
tocki
je veux juste un petit coup de main pour bien démarrer
OK, s'il s'agit de ça on peut discuter des pistes !
Je t'aurais bien proposé de regarder du côté des fonction pour k-means, mais il s'agit visiblement d'un exo.
J'imagine que tu choisis les points de départ au hasard... Pour ça tu peux utiliser la fonction :
sample(x=1:n, size=2, replace = FALSE) # pour n points et 2 groupes
Après, c'est à toi de faire tes choix de programmation mais je pense qu'il te faudra créer :
- une fonction qui prennent comme argument les coordonnées des centres de classes (points dans un premier temps, barycentres ensuite), tes coordonnées de points et te retourne pour chaque point le numéro du centre pour lequel la distance est minimale. À toi de voir sous quelle forme tu souhaites passer les coordonnées de tes centres... le plus judicieux me semble une data.frame ou une matrice (plus facile de faire une fonction indépendante du nombre de centres choisis).
Voir les fonctions dist et celles de la famille de apply (pour optimiser les calculs dans ta fonction en évitant les boucles for). - une fonction qui te re-calcul les barycentres des groupes et retourne leurs coordonnées en fonction des coordonnées de points (invariables) et du résultat de la précédente fonction (groupe de chaque point).
- une fonction qui teste la "qualité" de la nouvelle partition*. Voir ma remarque si dessous, mais à mon avis, ce sera calculer la somme des distances intra-groupes et la comparer à l'ancienne.
Le tout dans une boucle avec condition d'arrêt (ou bien peut-être dans une fonction récursive**).

Envoyé par
tocki
et répéter l'itération jusqu'à ce la distance euclidienne entre les centres de gravité soit <t
Heu, là tu m'étonnes !
Ce ne serait pas plutôt jusqu'à ce que la variation de distance intra-groupes soit < t ?
Edit:
* Le terme est un peu impropre, il s'agit de tester l'amélioration. Mais je pense que pour aller au bout de la démarche, tu devras également réitérer l'opération complète plusieurs fois pour tenir compte de l'influence des points de départ.
** À vérifier mais ça me semble une approche plus élégante (une fonction qui s'appelle elle-même tant que le critère d'amélioration n'est pas atteint, et qui retourne soit son résultat, soit celui de la nouvelle instance d'elle-même => t'as directement le "bon" résultat en sortie de ta fonction sans utiliser de while ou que sais-je !).
Partager