diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..05189ad57601a6ccd7781a3f0ccd282b1d6e7499
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+SRC = $(wildcard *.md)
+PDF = $(patsubst %.md,%.pdf,${SRC})
+
+all: ${PDF}
+
+read: ${PDF}
+	firefox $^
+
+%.pdf: %.md Makefile
+	pandoc --pdf-engine=xelatex -o $@ $<
+
+clean:
+	rm -rf ${PDF}
+
+.PHONY: clean read
diff --git a/kmeans.md b/kmeans.md
new file mode 100644
index 0000000000000000000000000000000000000000..9217870559a4109195c1011a9da11e40cdf8f056
--- /dev/null
+++ b/kmeans.md
@@ -0,0 +1,153 @@
+---
+title: K-Means
+author:
+- GENGA Dario
+- JAQUET Steven
+- MAYA Inès
+- ROSSMANN Théo
+- STEFANOVIC Boris
+date: 2022-05-10
+geometry: "margin=40mm"
+mainfont: DejaVu Sans
+header-includes:
+- \usepackage{float}
+- \let\origfigure\figure
+- \let\endorigfigure\endfigure
+- \renewenvironment{figure}[1][2] {\expandafter\origfigure\expandafter[H]} {\endorigfigure}
+---
+
+# Introduction: partitionnement de données
+
+De façon générale, le partitionnement de données consiste à grouper des données
+en clusters de façon à ce que les éléments d'un même groupe soient proches les
+uns des autres ou d'un élément virtuel représentant l'élément "moyen" de
+la partition.
+
+# Méthode des k-moyennes (k-means)
+
+La méthode des k-moyennes est un algortihme permettant de partitionner
+un ensemble de données par rapport à une métrique prédéfinie.
+
+## Données
+
+Les éléments de l'univers doivent être représentables sous forme
+de vecteurs de valeurs
+naturelles (éléments de $\mathbb{N}^n$)
+ou réelles (éléments de $\mathbb{R}^n$) .
+
+## Fonctions à faire
+- definir centroide aleatoirement (3)
+- calcul dst euclidienne centre - pt
+- calcul de la moyenne
+- lire le fichier
+- place les closteur (ou et nombre)
+
+## Fonction distance
+
+Afin de quantifier la proximité de deux éléments entre eux, nous avons
+besoin de définir une fonction distance, qui sera notre métrique.
+
+Cette fonction distance peut être aussi simple qu'une distance
+de Manhattan ou une distance euclidienne, par exemple.
+
+Cette fonction prend en argument deux vecteurs éléments de notre univers.
+
+$$d(x,y)$$
+
+Une grande valeur de retour indiquera que $x$ et $y$ sont éloignés.
+Inversément, une petite valeur de retour indiquera qu'ils sont proches.
+
+## Algorithme
+
+### distance euclidienne
+- calculer la distance entre un point a l'aide de la dst euclidienne et les centroides : sqrt((x2-x1)^2 + (y2-y1)^2) = sqrt((x-y)^2)
+- comparer les dst qui séparent le point aux centroides
+- assigner le point au centroide le plus proche
+- faire ca pour tous les points
+
+### distance de Manhattan
+- calculer la distance entre un point a l'aide de la dst euclidienne et les centroides : |(x2 - x1)| + |(y2-y1)|
+- comparer les dst qui séparent le point aux centroides
+- assigner le point au centroide le plus proche
+- faire ca pour tous les points
+
+# Implémentation
+
+## Type de données
+
+Cet algorithme peut s'appliquer facilement à tous types de données
+pouvant être représentées sous forme de vecteurs de valeurs.
+Cependant, nous avons décidé de limiter nos tests aux vecteurs à valeurs
+naturelles, en 2 dimensions, pour en simplifier la visualisation
+et la vérification de notre algorithme.
+
+$$v \in \mathbb{N}^2$$
+
+### structure de donnée
+*points*
+float x - y
+label
+
+*cluster*
+tab[nbr point]
+
+**BONUS 1** : étendre l'implémentation pour pouvoir utiliser des vecteurs
+à $n$ dimensions avec $n$ passé en paramètre au début de la procédure.
+
+**BONUS 2** : implémentation de l'algorithme PCA pour la visualisation
+de vecteurs à plus de 2 dimensions.
+
+## Algorithme
+
+**A FAIRE**
+
+### centroides
+- placer des centroides aléatoirement
+- définir quels points appartient a quel centroide
+- faire la moyenne de points qui sont egroupés à ce centroide
+- changer les cordonnées des centroides
+- répeter les actions jusqu'à que les cordonnées du centroides ne change pas
+
+## Interface utilisateur
+
+Le programme fonctionnera entièrement en ligne de commande, avec possibilité
+de spécifier un fichier d'entrée. A cette fin nous utiliserons des appels à
+fscanf(...) et la lecture des arguments en ligne de commande.
+Par défaut, le programme lira les données dans la console / sur
+l'entrée standard (permet les "pipe").
+
+# Vérification
+
+## Validation des résultats
+
+### Tester le bon choix des centres originaux
+
+Pour un univers de densité relativement homogène, il ne devrait pas
+y avoir de grand déséquilibre dans le nombre d'éléments par partition.
+
+### Tester le partitionnement
+
+Pour évaluer la justesse relative d'un résultat, pour un ensemble
+de centres donné, il suffit de mesurer la distance de chaque point
+à tous les centres.
+De ces distances-là, si la plus petite n'est pas celle au centre du
+groupe dont l'élément fait partie, il y a erreur.
+
+## Validation de l'algorithme
+
+Nous allons dans un premier temps utiliser des données générées
+artificiellement et pré-labélisées.
+Ainsi, si on se retrouve avec une correspondance exacte entre les labels
+et les groupes, le test sera considéré comme validé.
+
+Nous n'allons pas faire appel au pseudo-aléatoire dans un premier temps.
+
+# Analyse
+
+## De quoi dépend la qualité des résultats ?
+
+Par qualité, nous entendons une bonne minimisation des distances
+mentionnées plus haut.
+
+- bon choix de centres initiaux
+- nombre d'itérations suffisant
diff --git a/kmeans.pdf b/kmeans.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3933476d8f7ca7b402df09fd50b29854a0412e58
Binary files /dev/null and b/kmeans.pdf differ