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