Conception et Pratique de l'algorithmique
UPMC - 4I505 CPA - C. Dürr

TME 4 - Problème k-means

Dans cette séance nous allons implémenter l'algorithme k-means++ pour le problème de k-means. Celui-ci est décrit dans les notes de cours.

L'entrée

L'entrée est un fichier texte contenant des points dans le plan. Chaque ligne contient le caractère v suivi d'un entier et de deux nombres réels de la forme
  v [identifiant] [latitude] [longitude]
où *identifiant* est un identifiant unique du point et *longitude, latitude* sont des nombres flottants qui représentant des degrés des coordonnées GPS. Concrètement chaque point représente un carrefour dans un réseau routier. Pour la distance entre deux points, nous utilisons la distance à vol d'oiseau. La distance entre deux points GPS peut être calculée par la formule de haversine.

Les fichiers

Tous les fichiers distribués se trouvent dans ce fichier ZIP et ils sont aussi dans `/Vrac/cpa2017/tme4/`.

Trois fichiers d'entrée sont mis à votre disposition, qui contiennent les coordonnées GPS des carrefours dans le réseau routiers de quatre îles.

saintlouis.txt
L'île saint louis - de l'ordre de 140 points
man.txt
L'île de man - de l'ordre de 5 000 points
malte.txt
L'île de malte - de l'ordre de 18 000 points
idf.txt
L'île de France - de l'ordre de 1 000 000 points
Déterminez à l'aide du plus gros des fichiers l'erreur que nous faisons en utilisant la distance de Haversine, plutôt que la distance euclidienne sur les points projetés dans le plan. On s'attend à ce que cette erreur soit négligeable.

Nous vous fournissons aussi du code pour visualiser votre solution.

visualize.py
Un script python qui lit sur l'entrée standard la sortie produite par votre programme et qui produit le contenu pour un fichier 'visualize.js'.
visualize.html
Une page web à ouvrir dans votre navigateur. Elle nécessite le fichier 'visualize.js'
Une exécution de votre programme `kmeansplusplus` suivra alors les étapes suivantes, pour k=10 par exemple.
  ./kmeansplusplus 10 man.txt | ./visualize.py > visualize.js
  # ouvrir ou rafraîchir visualize.html

Votre programme

Votre programme reçoit deux paramètres en ligne de commande, un entier k, qui est le nombre de centres recherchés, et le nom du fichier d'entrée. Il affichera alors en sortie une copie du fichier d'entrée et k lignes de la forme
  s [latitude] [longitude]
représentant les cordonnées GPS des centres calculés par votre programme, ainsi qu'une dernière ligne de la forme
  o [valeur_objectif]

Les étapes de programmation

  • Commencez par écrire un code simple qui lit l'entrée et choisit simplement les k premiers points de l'entrée comme centre
  • Écrivez la fonction de distance de haversine. Faites attention à la conversion entre degrés et radians. Testez en comparant son résultat avec cette page web.
  • Puis écrivez une fonction qui sélectionne k centres par l'algorithme k-means++
  • Et finalement appliquez la recherche locale de Llyod sur ces centres
  • Saisissez vos résultats dans cette feuille de calcul. Obtenez vous une solution avec une valeur objectif similaire, pire ou meilleure que la moyenne ?
  • Pour aller plus loin

    Implémentez la procédure d'initialisation de Ostrovsky, Rabani, Schulman et Swamy. Est-ce que les résutats obtenus sont similaires qu'avec k-means++ ?

    Pour aller encore plus loin

    Dans /Vrac/cpa2016/gutenberg vous trouverez une collection de quelques milliers de fichiers texte en français, récupérés de gutenberg.org. Ces fichiers ont une entête contenant titre et auteur. Vous pouvez utiliser votre programme pour les classifier. Choisissez une petite constante c, par exemple 2. Puis pour chaque document produisez un vecteur, qui compte la fréquence de c lettres adjacentes dans le document. Puis appliquez votre programme sur ces vecteurs pour classifier les documents en k groupes distincts. Avec un peu de chance si c est suffisamment grand et k bien choisit vous pourriez peut-être déterminer des groupes de textes similaires, par exemple écrits par un même auteur. Il peut être une bonne idée d'ignorer les ponctuations (considérer tout caractère inférieur à 'A' comme un espace ' ') et de convertir les lettres en minuscules.

    Une correction