====== Sujets de projet 2016 automne ====== ---- ===== Introduction ===== Le but de ces projets est de vous initier à la programmation mathématique. Chaque sujet contient un exemple de résolution mathématique. Cela signifie que vous devez programmer des solutions à ces problèmes et (sauf mention contraire) vous ne devez pas utiliser de librairie qui implémente les solutions standards. Tous les projets demandent de faire un programe avec un minimum de caractéristiques pour avoir la moyenne. Chacun propose une série d'améliorations possibles qui permettront d'augmenter la note. Il faut utiliser l'un des 3 langages principalement enseignés en licence : C, C++ ou Java. Ces programmes doivent pouvoir compiler et être éxécutés sur les ordinateurs de l'université, et le rendu devra contenir toutes les librairies necessaires. Ils devront contenir un moyen simple de compiler les programmes ainsi qu'une petite documentation. ===== 1. Logiciel de dessin vectoriel ===== ^ Techniques | Lecture XML , Courbe de Bézier, dessin. | ^ Responsable du sujet || | | Fabien Rico | Vous devez créer un logiciel capable de lire un fichier [[https://en.wikipedia.org/wiki/Scalable_Vector_Graphics|SVG]]. C'est un langage de description de dessin vectoriel issu du web. Il se présente sous la forme d'un fichier [[https://fr.wikipedia.org/wiki/Extensible_Markup_Language|XML]] que vous devrez lire en utilisant une librairie existante du langage utilisé. Ce fichier contient des descriptions d'objets géométriques (rectangles, cercles ...) mais aussi des chemins (*path*) qui permettent de définir des figures complexes nottament grâce à des [[https://fr.wikipedia.org/wiki/Courbe_de_B%C3%A9zier|courbes de Bézier]] cubiques et des arcs elliptique. Votre logiciel ne doit pas forcement être capable d'afficher tous les fichiers SVG existants, mais il ne doit pas faire d'erreur lorsqu'il rencontre une commande non gérée. De plus, il doit implémenter l'ensemble des possibilités des chemins. ==Améliorations== Pour améliorer le rendu vous pouvez de plus : * améliorer l'interface graphique (gestion des fichiers, animation, zoom ...); * gérer l'export d'images en différents format; * améliorer le support du language SVG (remplissage, lien, ...). ===== 2. Classification par arbre de décision et forêt aléatoire ===== ^Techniques | Classification, statistiques | ^Responsable du sujet || | | Fabien Rico | ^Informations à voir || | [[http://eric.univ-lyon2.fr/%7Ericco/cours/supports_data_mining.html | Ensembles de cours datamining (cf *Arbre de décision* et *Random Forest*)]] || La classification automatique est un domaine où on cherche à apprendre à reconnaitre la classe d'individus à partir d'exemples. Une technique parmi les plus efficaces est basée sur la construction d'un grand nombre d'arbres de décision (ce qu'on appelle forêt aléatoire). En effet, l'expérience montre que si on construire suffisamment de classifieurs différents entre eux mais efficaces, le fait de décider en fonction de la majorité des classifieurs apporte un grand gain. Le but de votre projet est d'implémenter un algorithme classique de construction d'une forêt. Pour cela il faut : - implémenter la construction d'un arbre de décision à partir d'un jeu de données d'exemples; - implémenter un système permettant de générer un grand nombre d'arbres de décision; - mettre en place un système de test permettant de mesurer la qualité de vos algorithmes. Votre logiciel devra être capable à partir d'un fichier d'exemple dans un format simple (CSV) de construire un modèle. Puis à partir d'un modèle et d'un fichier de test dans le même format de trouver les classes des objets. == Améliorations== Les améliorations possibles de votre travail pouront porter sur les différentes optimisations ou adaptations de l'algorithme à des cas spécifiques, sur l'amélioration du temps temps de calcul et du coût mémoire de votre programme. Vous pourrez aussi ajouter des prétraitements pour résoudre les cas ou les données sont lacunaires ou ajouter une interface graphique au programme. ===== 3. Multi dimensionnal scalling ===== ^Techniques | calcul de valeur propres, visualisation de données | ^ Responsable du sujet || | | Fabien Rico | ^Informations à voir || | [[http://wikistat.fr/pdf/st-m-explo-mds.pdf|Alain Baccini et Philippe Besse, Exploration Statistique, chapitre 7]]|| Le [[https://en.wikipedia.org/wiki/Multidimensional_scaling|multi-dimensionnal scalling]] (ou positionnement multi-dimensionnel MDS) est une technique qu'on utilise souvent pour visualiser des données. Cela permet de calculer des coordonnées de points dont on ne connaît que les distances 2 à deux. On peut ainsi retrouver les coordonnées de points existants, mais aussi créer des cartes utilisant d'autres informations que la distance euclidienne (à vol d'oiseau). Par exemple, repositionner les villes d'un pays en fonction du temps nécessaire pour les joindre en transport en commun, positionner les députés en fonction de leurs votes ... Votre programme devra implémenter la construction MDS de donnée utilisant l'algorithme classique qui se résume à calculer des valeurs propres d'une matrice obtenue à partir de la matrice de distances. Il devra a partir d'un fichier contenant la liste des points et leur distance, fournir un fichier contenant les coordonnées calculées ce ces points. ==Améliorations== Pour améliorer le programme, vous pourrez faire: * une interface graphique pour manipuler les fichiers et visualiser le résultat; * implémenter d'autres méthodes de calcul plus robustes; * améliorer le temps de calcul et l'utilisation mémoire de votre programme ===== 4. Compression d'image par PCA ===== ^ Techniques | calcul de valeur propres, compression| ^ Responsable du sujet || | | Julia Sanchez | ^ Information à voir || | [[projet:compressionpca|Description détaillée]] || On cherche ici à implémenter un algorithme de compression d'image avec perte (comme jpeg). L'image que l'on utilise (ou une partie de celle-ci) peut être vue comme une matrice. On peut utiliser sur cette matrice des techniques de réduction de dimension, c'est à dire obtenir une matrice de dimension plus petite qui contient l'essentielle de l'information de départ. C'est le rôle de l'analyse en composante principale (PCA). A partir de cette matrice plus petite (compréssée), on peut reconstruire l'image de départ avec quelques déformations dépendant du taux de compression utilisé. Votre programme devra être capacle de lire une image sous un format simple (sans perte), et produire un fichier compressé. Il devra bien sur permettre d'appliquer le traitement inverse. ==Améliorations== Pour améliorer ce dernier vous pourrez : - ajouter une interface graphique; - mettre en place un système de comparaison avec la représentation jpeg; - améliorer le temps de calcule et le cout mémoire de votre programme. ===== 5. Algorithme de cryptographie à clef publique RSA ===== ^ Techniques | calcul sur des entiers de taille quelconque, authentification, signature | ^ Responsable du sujet || | | Fabien Rico | Les algorithmes de chiffrement asymétrique sont devenus très importants dans le domaine informatique. [[https://fr.wikipedia.org/wiki/Chiffrement_RSA|RSA]] est l'un des plus connus et se base sur l'utilisation de grand nombres premiers. L’intérêt de ces algorithmes est qu'ils permettent un échange d'informations chiffrées entre des entités qui ne partagent aucun secret au départ. En effet, les algorithmes symétriques sont bien plus robustes (pour une même taille de clef), mais il nécessite avant de commencer d'échanger un secret entre les acteurs. Pour un serveur public dont le nombre de clients est très important, il n'est pas possible de mettre en place un canal pour échanger ce secret autrement qu'en utilisant le réseau internet. On utilise donc les algorithmes a clef publique pour sécuriser les premiers échanges et mettre en place une session sécurisée. Vous devez implémenter l'algorithme RSA, c'est à dire : - générer la clef; - chiffrer avec la clef publique et déchiffrer avec la clef secrète; - chiffrer avec la clef secrète et déchiffrer avec la clef publique (pour signer). ==Améliorations== Comme amélioration vous pourrez : * implémenter d'autres algorithmes de chiffrement; * créer un petit logiciel de connexion à distance sécurisé. ===== 6. Algorithme du recuit simulé ===== ^ Techniques | coloration de graphes, métaheuristique | ^ Responsable du sujet ^^ | | Aurélie Kong Win Chang | ^ Informations supplémentaires || | [[http://perso.univ-lyon1.fr/fabien.rico/site/_media/projet:expe.pdf|Quelques mots sur les protocoles expérimentaux]] || Le projet consistera en l'implémentation d'une structure permettant de représenter un graphe et sa coloration, un algorithme simple permettant de trouver une coloration quelconque valide, et l'algorithme de recuit simulé pour trouver une approximation de la solution. Votre programme devra être capable de trouver une approximation acceptable de la solution du problème. == Améliorations == Il y a plusieurs moyens d'améliorer ce projet : * implémenter une autre méthode pour trouver la solution optimale ou une approximation et comparer les temps de calcul et la qualité de la solution; * ajouter une interface graphique permettant de visualiser les évolution de l'algorithme et son résulat. ===== 7. Cueillette exploratoire ===== ^ Techniques | Informatique bio-inspiré | ^ Responsable du sujet || | | Aurélie Kong Win Chang | ^ Information à voir || | [[projet:cueillette|Une description détaillée]] || | [[http://zool33.uni-graz.at/artlife/sites/default/files/IEEE_Mechatronic_Automation_13_-_Levy_Flight.pdf| Un article sur le sujet]] || | [[https://docs.oracle.com/javase/7/docs/api/java/util/Random.html|Tirage suivant une distribution gaussienne en java]] || | [[http://perso.univ-lyon1.fr/fabien.rico/site/_media/projet:expe.pdf|Quelques mots sur les protocoles expérimentaux]] || ^ Remarque | Sujet issu du cours de M2 : informatique bio inspirée | L'informatique bio-inspirée consiste à se baser sur des observations tirées de la nature pour, entre autres, créer de nouveaux algorithmes. Ainsi une stratégie d'exploration observée chez de nombreux animaux (albatros, humains chasseurs-cueilleurs...) a-t-elle été reprise pour des robots sous-marins. Ce projet propose d'implémenter différentes stratégies de recherche de ressources et de les comparer pour différentes configurations : - implémenter un petit système multi-agent très simple (un terrain, des patches d'intérêt, des agents qui se déplacent) fonctionnant de manière séquentielle; - implémenter pour ces agents une stratégie d'exploration aléatoire et une exploration suivant le vol de Lévy (en cherchant, dans ce dernier cas, les valeurs des paramètres pour lesquelles l'exploration est la plus efficace) ; le but étant de ramasser au plus vite tous les patches de nourriture; - comparer les résultats pour différentes configurations données (fréquence et tailles des patches, nombre d'agents). == Améliorations == Pour améliorer ce projet : * il est possible de trouver les valeurs des paramètres de manière totalement expérimentales, en tâtonnant, mais d'autres méthodes sont utilisables * proposer d'autres stratégies d'exploration et les comparer à celles déjà implémentées =====8. Reconnaissance de la nature gramaticale===== ^ Technique | Part Of Speech, maximisation d'entropie| ^ Responsable du sujet || | | Fabien Rico | ^ Info à voir || | {{:projet:ratnaparkhi-maxent_model_for_nlp-fulltext.pdf|Un article expliquant la méthode}} || | [[projet:pos|Un exemple de déroulement de l'algorithme présenté dans l'article]] || Reconnaitre la nature gramaticale d'un mot, ou Part Of Speech (POS), est un point de départ dans beaucoup de tâches de traitement du langage naturel. Il s'agit de reconnaitre automatiquement la nature d'un mot dans une phrase. Par exemple : * Dans "des avions ont décollé ce matin", "avions" est un nom * Dans "Nous avions déjeuné", "avions est un verbe Le but de l'algorithme est d'être capable d'affecter un label (la nature) à chaque mot d'une phrase en considérant le contexte (c'est à dire la phrase). Une des technique utilisée pour faire cela est basé sur de l'apprentissage automatique. Elle apprend à partir d'exemples un modèle statistique qui est capable de donner une probabilité d'affecter un label en fonction du contexte. Pour mettre au point ce modèle, on utilise un série d'exemples et un algorithme de maximisation d'entropie. Votre projet doit être capable de créer ce modèle à partir d'exemples de la litérature et de les tester pour mesurer leurs performances. ==Améliorations== Pour améliorer le travail vous pouvez aussi : * travailler les prétraitements permettant d'augmenter la performance (traitement des mots inconnus, correction de l'orthographe, ...) * ajouter des post traitements comme retrouver la forme canonique des mots (verbe à l'infinitif, nom au singulier, ...) * ... =====9. Word embedding (plongement lexical)===== ^ Technique | analyse de text, manipulation de grandes matrices | ^ Responsable du sujet || | | Fabien Rico | ^ Info à voir || | [[http://nlp.stanford.edu/projects/glove/|Global Vectors for Word Representation]] || | {{ :projet:glove.pdf |Article expliquant l'algorithme}} || Le //word embedding// est une méthode à la base de nombreux travaux d'analyse du langage naturel. Il consiste à vouloir transformer les mots de la langue en un ensemble de vecteur mathématiques. Le but est de le faire en conservant une certaine notion du sens des mot. Le moyen de faire cela est de travailler à partir d'une matrice de co-occurences des mots dans les phrases trouvées dans un grand corpus de texte (par exemple wikipedia). Cette matrice contient une partie du sens des mots car le sens dépend du contexte. Mais cette matrice est trop grande pour être utilisée. Il faut alors appliquer une technique de réduction de dimension de la matrice pour obtenir les vecteurs souhaités. C'est un projet plutôt exploratoire, vous allez devoir faire cette opération : lecture des textes; création de la matrice; réduction de la dimension... Ce projet n'étant pas assez maitrisé, il n'y a pas de minimum proposé. On notera en fonction de l'état d'avancement final. =====10. Détection d’anomalies non supervisé===== ^Techniques | apprentissage non supervisé, apprentissage statistique | ^Responsable du sujet || | | Seif Benkabou | ^ Informations à voir || | [[http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf|Un article sur la détection d'anomalies]] || La détection d’anomalies vise à identifier, dans un ensemble de données, celles qui diffèrent significativement des autres, qui ne se conforment pas à un comportement attendu, et qui indiquent un processus de génération différent. Plusieurs domaines d’application font appel à la détection d’anomalies comme la détection de fraude (ex : paiement en ligne), la détection d’intrusion (tentatives de piratage, connexions frauduleuses), la vidéosurveillance ou encore la bio-informatique. Plusieurs techniques ont été proposées pour détecter efficacement les anomalies dans un mode non supervisé (contrairement à la classification où on ne dispose d’aucune information concernant la normalité des données). Une technique parmi les plus efficaces, consiste à construire un grand nombre d’arbres de partition (un partitionnement récursif des données) et de détecter comme anormales les données ayant des chemins relativement courts par rapport aux racines dans la majorité des arbres. Le but de votre projet est d’implémenter l’algorithme Isolation Forest. Votre logiciel devra être capable, à partir d’un fichier de données quelquonques, de détecter les les données anormales. Pour cela il faut : - Implémenter l’algorithme de partitionnement - Implémenter un système permettant de générer plusieurs arbres de partitionnement à partir d’un jeu de données non étiqueté - Implémenter le détecteur d’anomalies basé sur l’ensemble des arbres générés. ==Améliorations == * Traitement des données séquentielles * Comparaison avec d'autres algorithmes ( vous n'aurez pas à les implémenter, juste les utiliser pour la comparaison) * Améliorer le temps de calcul et l'utilisation de mémoire * Interface graphique =====11. Amélioration de contraste d'images ===== ^ Techniques | Manipulation d'images (matrices), interface graphique | ^ Responsable du sujet || | | Matthieu Moy | ^ Informations à voir || | [[https://matthieu-moy.fr/cours/lifprojet/contraste.html|Sujet et consignes détaillés]] || La photo numérique ouvre beaucoup de possibilités en terme de post-traitement d'image. Nous nous intéresserons ici à la gestion du contraste, avec plusieurs familles de traitements : * La base : ajustement du contraste global. Il s'agit simplement d'appliquer une fonction affine à chaque pixel. * Gestion des ombres et lumières : rehausser les parties sombres de l'image, assombrir les parties surexposées. * Gestion du contraste local : faire ressortir les détails (les contours par exemple) sans modifier le contraste global Le sujet est très libre, et pourra explorer plusieurs (mais pas forcément toutes) des pistes suivantes : * Prototypage d'une solution en utilisant Python et les bibliothèques skimage, NumPy et SciPy. * Développement des algorithmes en C++ (ou éventuellement C). * Optimisations de performances (éviter de refaire plusieurs fois le même calcul, optimiser l'ordre de parcours des matrices pour limiter les défauts de cache), parallélisation. * Interface graphique pour rendre le résultat agréable à utiliser par un utilisateur non-informaticien. =====12. Contribution à un logiciel libre ===== ^ Techniques | Génie logiciel, gestion de version | ^ Responsable du sujet || | | Matthieu Moy | ^ Informations à voir || | [[https://matthieu-moy.fr/cours/lifprojet/libre.html|Sujet et consignes détaillés]] || Le but du projet est de participer à un projet « de la vraie vie » (un logiciel activement développé, ayant déjà un bon nombre d'utilisateurs, ...). Un bon moyen d'atteindre cet objectif est de contribuer à un logiciel libre. Contribuer à un logiciel libre est en particulier un bon moyen d'aborder sur des cas réels les questions comme : * La revue de code par des tiers, * L'utilisation poussée d'un gestionnaire de versions, * L'application stricte de styles de codage, * Les tests automatisés, * L'utilisation des mailing-lists comme outil de communication et d'entre-aide. Un effet de bord intéressant est qu'avoir du code à soi dans un projet libre permet de briller en société ;-). Voir le sujet détaillé pour plus d'informations.