Prépa

TIPE 3/2 (2021) — Évacuation d'urgence d'une salle par une foule de piétons

Dans le cadre de ce projet, j'ai étudié et modélisé informatiquement la dynamique collective et les mouvements de foule lors de l'évacuation d'une pièce avec rétrécissement. J'ai confronté deux approches de modélisation : une méthode discrète reposant sur les automates cellulaires et une méthode continue simulant un réseau d'interactions physiques et de forces sociales. Cette étude comparative m'a permis d'analyser l'influence de la densité, du comportement d'imitation et des goulots d'étranglement sur le temps d'évacuation.

Langage de programmation : Python

Note finale : 13.6/20

TIPE 5/2 (2022) — Optimisation de trajectoires dans un environnement simple

J'ai exploré la recherche de plus court chemin (pathfinding) à travers l'étude comparative de représentations polygonales (triangulation de Delaunay) et matricielles (quadrillage de l'espace). J'ai implémenté et évalué plusieurs algorithmes fondamentaux (Dijkstra, Greedy Best-First Search, A* et Weighted A*) face à des contraintes de visibilité, de topologie et de coûts de franchissement hétérogènes, avec une application concrète dans la ville de Paris.

Ce projet est accompagné d'un document annexe sur les théorèmes et preuves mathématiques en lien avec ce sujet, ainsi qu'une annexe contenant les codes source.

Tout ce travail a été publié sur le site progresser-en-maths dans l'objectif de partager mon travail et d'aider d'autres étudiants dans leurs projets.

Langage de programmation : Python

Note finale : 17.6/20

Exercices corrigés d'oraux (CCP et Mines-Télécom)

Note : 15/20 et 13.01/20

Également publiés sur progresser-en-maths.

ENSIIE

1ère année

Statistiques

Professeur : Nicolas Brunel

Notions abordées au cours de l'UE :

  • Modélisation statistique, vraisemblance et information de Fisher
  • Estimation ponctuelle et intervalles de confiance (exacts et asymptotiques, consistance, efficacité, calcul de risque)
  • Théorie des tests d'hypothèses (approche de Neyman-Pearson) et tests d'adéquation

Langage de programmation : R

TPs réalisés avec Mathis Guillory.
Note finale : 19/20.

Finance

Professeur : Philippe Castelnau

Notions abordées au cours de l'UE :

  • Typologie et gestion des risques (crédit, marché, liquidité, opérationnel)
  • Comptabilité financière, analyse d'investissement et valorisation d'entreprise

Note finale : 18/20.

Projet mathématique et recherche

Professeur : Cyril Benezet

Dans le cadre de ce projet en équipe, l'objectif était de modéliser mathématiquement un jeu de hasard entre "monstres" et "élèves" sur un plateau de 10 cases.

Nous avons alors étudié et modélisé divers processus stochastiques en combinant chaînes de Markov discrètes et méthodes d'estimation par Monte Carlo. Nous avons notamment implémenté des simulations de marches aléatoires (des joueurs et du monstre sur les 10 cases) et résolu de manière à la fois analytique et numérique le problème de la ruine du joueur via l'analyse de temps d'arrêt. Enfin, nous avons développé la simulation de ce jeu sur un graphe (déplacement d'étudiants et d'un monstre), en confrontant systématiquement nos estimations empiriques (avec intervalles de confiance à 95%) aux résultats théoriques exacts.

Langage de programmation : Python

Projet réalisé avec Alice Christolomme, Adam El Gerssifi et Benoît Martinez.
Note finale : 19/20.

Topologie (dans le cadre de la licence 3 de mathématiques)

Professeur : Gilles Lacombe

Notions abordées au cours de l'UE :

  • Espaces métriques et espaces topologiques (ouverts, fermés, voisinages, bases, continuité)
  • Compacité (théorème de Borel-Lebesgue, valeurs d'adhérence) et connexité (par arcs)
  • Espaces complets, suites de Cauchy, théorème de Baire et théorème du point fixe

Note finale : 15.5/20.

Programmation en C

Professeur : Guillaume Burel

L'objectif de ce projet était de concevoir et d'implémenter un interpréteur pour un langage graphique textuel sur mesure afin de générer des images au format matriciel PPM. Pour traduire ce flux d'instructions, il fallait développer une machine à états gérant les déplacements d'un curseur, le mélange de doses de couleurs et d'opacités à l'aide de listes chaînées, ainsi qu'une pile de calques superposés.

Malgré un léger souci de couleur que je n'ai pas réussi à résoudre, j'ai obtenu un rendu final quasiment parfait et surtout, parfaitement fonctionnel.

Langage de programmation : C

Note finale : 17/20.

Programmation fonctionnelle

Professeur : Julien Forest

Sous un scénario sympathique, l'objectif de ce projet était d'implémenter un interpréteur capable de décoder des messages « extraterrestres » transmis sous forme d'instructions séquentielles élémentaires, par exemple :
W(T);R;W(e);R;W(r);R;W(r);R;W(i);R;W(e);R;W(n);R;W(s);R;W( );R;W(b);R;W(o);R;W(n);R;W(j);R;W(o);R;W(u);R;W(r);R;W(.)

Pour simuler l'exécution sur un ruban infini bidirectionnel, j'ai implémenté une structure de données en zipper (séparation en deux listes de part et d'autre de la tête de lecture). La dernière partie du projet, sous forme de problème ouvert, consistait à inverser le processus : synthétiser automatiquement le programme le plus court possible pour un texte donné. Cette problématique de factorisation de sous-séquences, que j'ai trouvé particulièrement difficile, m'a demandé un important travail de réflexion et d'analyse sur la complexité algorithmique de ma solution.

Langage de programmation : OCaml

Note finale : 19.5/20.

Enjeux environnementaux et développement durable

Professeur : Anne-Laure Ligozat

Dans le cadre de ce travail d'équipe, nous avons analysé le rôle et la responsabilité de l'ingénieur du numérique face à l'urgence climatique en nous appuyant sur les scénarios RTE 2050. L'étude explore les leviers de sobriété énergétique, les impacts environnementaux liés au cycle de vie des équipements et aux centres de données, ainsi que la nécessaire évolution des pratiques industrielles.

Travail réalisé avec Léos Coutrot, Adam El Gerssifi, Hugo Genest, Evan Girard, Marius Malot, Ulysse Radisson et Baptiste Trillo.
Note finale : 18/20.

2ème année

Analyse de données (ANDO)

Professeur : Christophe Ambroise

Le premier projet était consacré à l'algorithme EM (Expectation-Maximization), une méthode itérative qui permet d'estimer les paramètres d'un modèle statistique lorsque certaines variables sont latentes. Je l'ai étudié puis implémenté dans le cas d'un mélange de deux lois gaussiennes (l'exemple classique) : l'étape E estime les probabilités d'appartenance de chaque observation à chaque gaussienne, tandis que l'étape M met à jour les proportions, les moyennes et les variances. L'algorithme a ensuite été testé sur des données simulées afin de retrouver les paramètres des deux gaussiennes.

Le second projet portait sur les nuées dynamiques, une généralisation de l'algorithme des k-means dans laquelle les classes sont représentées par des droites plutôt que par des centroïdes. J'ai appliqué l'algorithme aux données iris et comparée à k-means et aux mélanges gaussiens (comme l'algorithme EM). Puis j'ai étudié cet algorithme dans le cas d'un mélange de plusieurs droites, pour percevoir une véritable amélioration des nuées dynamiques par rapport aux autres algorithmes de clustering.

Langage de programmation : R

TD

Projet final

Note finale : 17.2/20.

Méthode de régression régularisée (MERR)

Professeur : Mathilde Mougeot

Dans ce projet, nous avons cherché à prédire la réussite scolaire d'étudiants à partir d'un jeu de données comportant de nombreuses variables, en utilisant une régression logistique. Nous avons découvert et comparé plusieurs méthodes classiques de sélection de variables, notamment les procédures forward, backward et stepwise, avant d'étudier les pénalisations Ridge et Lasso ainsi que leur combinaison dans l'Elastic Net (un mix des deux régularisations). Le travail mettait ainsi en évidence la comparaison entre les différentes approches, avec une évaluation finale par matrice de confusion.

Langage de programmation : R

Travaux pratiques
Projet final

Projet réalisé avec Léos Coutrot.
Note finale : 17/20.

Méthodes de simulation (METS)

Professeur : Abass Sagna

Travaux pratiques

Examen final
  • TP noté
  • Travail réalisé avec Manon Chartrin.
    Note reçue : 18.5/20.

Impact environnemental du numérique (IENU)

Professeur : Anne-Laure Ligozat

Travail réalisé avec Alice Christolomme.
Note reçue : 12/20.

Compléments et outils de recherche opérationnelle (CORO)

Professeurs : Éric Soutil & Alain Faye

Le mini-projet consistait à résoudre un jeu de circuits sur plusieurs grilles, en respectant le nombre de cases traversées par chaque ligne et chaque colonne. Nous avons modélisé les six configurations possibles d'une case par un programme linéaire en nombres entiers, avec des contraintes d'unicité, de voisinage et de continuité, puis utilisé un solveur pour trouver une solution réalisable. Comme certaines solutions contenaient plusieurs circuits distincts, nous avons ajouté une procédure détectant le plus petit sous-circuit et une contrainte l'interdisant, jusqu'à obtenir un circuit unique.

Le projet principal portait sur la gestion des commandes dans un centre de distribution : il fallait affecter les commandes aux travailleurs, tenir compte de leur capacité et sélectionner les étagères nécessaires, tout en traitant un maximum de commandes secondaires. Nous avons formulé ce problème en programmation linéaire en nombres entiers avec une fonction objectif lexicographique, puis étudié une décomposition de Dantzig-Wolfe séparant l'affectation des commandes et la gestion des étagères. Les résultats obtenus sur différentes instances étaient proches des valeurs attendues, avec des temps de calcul qui augmentaient naturellement avec la taille du problème.

Langage de programmation : Julia

Travail réalisé avec Mathéo Biard.
Note reçue : 16/20.

Apprentissage automatique (MOST)

Professeurs : Blaise Hanczar & Jean-Christophe Janodet

Dans ce projet, nous avons étudié la prédiction des passagers du Spaceship Titanic (jeu de données plutôt connu) qui ont été transportés vers une autre dimension. Après une exploration des données, nous avons transformé les identifiants, les informations de cabine et les dépenses, traité les valeurs manquantes et encodé les variables catégorielles. Nous avons ensuite comparé plusieurs modèles de classification, de la régression logistique et de l'Elastic Net aux SVM, arbres de décision et aux modèles de boosting (comme AdaBoost), en optimisant leurs hyperparamètres par validation croisée.

Nous pouvions comparer nos résultats grâce à un concours sur Kaggle. Nos meilleures performances, proches de 80 % de précision, ont été obtenues avec le SVM à noyau gaussien et AdaBoost.

Langage de programmation : Python

Projet réalisé avec Maël Daunas, Mohamed Koudiraty et Théo Taillefumier.
Note reçue : 15.5/20.

Projet Recherche (PRRE)

Professeur : Massinissa Merabet

J'ai particulièrement aimé ce projet, qui portait sur l'optimisation du dernier kilomètre de livraison d'Amazon à partir de données réelles. Les données étaient extrêmement volumineuses, donc nous avons réduit le travail sur un tout petit sous-ensemble. Puis, pour rendre le problème traitable, nous avons commencé par structurer les routes et regrouper les arrêts en clusters, en combinant les informations géographiques et les temps de trajet. Nous avons ensuite recherché un chemin quasi-optimal entre ces groupes, en nous appuyant sur des heuristiques du problème du voyageur de commerce, puis déterminé les points d'entrée et de sortie de chaque cluster avant d'optimiser chaque sous-route avec un problème de voyageur de commerce avec fenêtres de temps.

Nous avons conçu en Python plusieurs classes, notamment Route, Stop, Package et Cluster, afin d'organiser les données et les informations calculées au fil du traitement. C'était la première fois que je faisais de la programmation objet sur Python. Nous avons enfin implémenté le modèle de programmation linéaire en nombres entiers avec PuLP et CPLEX, puis visualisé les itinéraires et les graphes avec NetworkX (ce qui rendait le projet très sympathique). Les résultats obtenus suggéraient un gain moyen d'environ dix minutes sur les tournées étudiées, ce qui rendait l'ensemble particulièrement satisfaisant.

Langage de programmation : Python

Travail réalisé avec Manon Chartrin et Adèle Berger.
Note reçue : 17/20.

Master 2 MVA

Apprentissage profond et traitement du signal, introduction et applications industrielles

Professeur : Thomas Courtat

L'objectif de ce projet était de retrouver un signal de voix propre à partir d'un enregistrement bruité. Nous avons préparé des extraits de voix avec et sans bruit, puis entraîné et comparé plusieurs architectures de réseaux de neurones dédiées au débruitage audio, notamment Wave-U-Net, TasNet et Conv-TasNet. Les modèles ont été évalués avec des métriques perceptuelles que je ne connaissais pas bien au départ, comme PESQ et STOI. Conv-TasNet a obtenu les meilleurs résultats de notre étude, avec un score moyen de 2.892 en PESQ et de 0.931 en STOI.

Langage de programmation : Python

TP

Projet

Projet et TPs réalisés avec Chloé Habasque.
Note reçue : 16/20.

Computational Statistics

Professeur : Stéphanie Allassonière

TP

Cette UE a été l'occasion d'approfondir mes connaissances en statistiques et en modélisation. C'était en quelque sorte la suite logique des cours de statistiques et de méthodes de simulation que j'ai suivis durant mon cursus en école d'ingénieur.
Je ne suis finalement pas allé au bout de cette UE. Elle me prenait trop de temps.

Note :

Convex optimization and applications in machine learning

Professeur : Alexandre d'Aspremont

DM

Note reçue : 13.34/20.

Probabilistic Graphical Models and Deep Generative Models

Professeurs : Pierre Latouche & Pierre-Alexandre Mattei

Dans ce projet, nous avons étudié le lien très étroit entre l'ACP et l'algorithme des k-means à partir de plusieurs articles de recherche. Nous avons notamment découvert et travaillé la preuve que l'ACP peut être interprétée comme une relaxation continue du problème de clustering de k-means. Puis, comme l'initialisation joue un rôle crucial dans la performance du clustering, nous avons étudié une initialisation guidée par l'ACP pour limiter le risque de converger vers un mauvais minimum local. L'approche fondée sur un mélange gaussien s'est montrée particulièrement efficace pour initialiser le clustering.

Langage de programmation : Python

Projet

Projet réalisé avec Chloé Habasque et Maëlle Fontaine.
Note reçue : 15/20.

Apprentissage pour les séries temporelles

Professeur : Laurent Oudre

Ce projet a consisté à explorer les méthodes d'apprentissage pour le traitement des séries temporelles. Nous avons étudié et implémenté une méthode de clustering de séries temporelles inspirée de l'article Time warp invariant dictionary learning for time series clustering. L'idée est d'apprendre un dictionnaire propre à chaque cluster tout en autorisant les atomes à subir des déformations temporelles. Nous avons ainsi mis en œuvre une version adaptée de l'OMP, appelée TWI-OMP, qui sélectionne les motifs les plus pertinents après alignement temporel, puis effectue une mise à jour des dictionnaires à chaque étape par un algorithme de descente de gradient.
L'objectif initial se concentrait sur les données d'audio de musiques sur Deezer, mais par soucis de simplicité, la méthode a été testée sur les jeux de données ECG200 et Trace. Nous avons obtenu des résultats encourageants pour retrouver les structures des séries, même si l'apprentissage des dictionnaires restait clairement difficile sur certaines données.

Langage de programmation : Python

DM

Projet

Projet et DMs réalisés avec Chloé Habasque.
Note reçue : 14.9/20.

Advanced Deep Learning

Professeur : Guillaume Charpiat

Cette UE a été particulièrement importante dans mon parcours, car elle m'a permis d'en apprendre bien davantage sur le deep learning en pratique, au-delà de l'utilisation automatique de modèles existants. Nous avons commencé par revoir l'entraînement de réseaux avec PyTorch, le choix des hyperparamètres et les bonnes pratiques expérimentales, puis étudié l'interprétabilité avec des méthodes de visualisation comme Grad-CAM. Les TPs suivants nous ont fait découvrir les architectures pour graphes (GNN), le transfert d'apprentissage (Transfer Learning et fine-tuning), les problèmes de biais, ainsi que l'intégration de connaissances physiques dans l'apprentissage de systèmes dynamiques. Enfin, nous avons abordé la recherche automatique d'architectures et les modèles génératifs, des VAE et GAN jusqu'aux modèles de diffusion.

Les TPs étaient très progressifs et concrets. J'ai particulièrement apprécié les TPs 2 et 5.Le deuxième portait sur l'interprétabilité et m'a particulièrement intéressé, notamment grâce à l'analyse visuelle avec Grad-CAM. Le cinquième TP, sur l'oscillateur de Duffing, m'a permis de mieux comprendre comment intégrer des connaissances physiques dans l'apprentissage d'un système dynamique, ce qui m'a beaucoup plu.

Langage de programmation : Python

TP

Note : 15.5/20

Génération de données en IA par transport et débruitage

Professeur : Stéphane Mallat

Dans le cadre d'un challenge proposé par Egis, nous devions prédire le taux d'infractions de stationnement des voitures dans Paris, à partir de données géographiques, temporelles et météorologiques. Le jeu de données était particulièrement volumineux, avec plusieurs millions d'observations, et présentait une structure spatiale très marquée (des rues beaucoup plus sujettes aux infractions que d'autres). Nous avons donc commencé par analyser les corrélations, les valeurs manquantes et la répartition géographique de la cible, avant de construire des variables temporelles et de développer des heuristiques de clustering pour distinguer les zones de la ville et les segments de rues associés aux taux d'infraction les plus élevés.

Nous avons ensuite comparé plusieurs modèles de régression et d'ensemble, notamment des arbres et XGBoost, en optimisant leurs hyperparamètres. XGBoost a donné les meilleurs résultats individuels, tandis qu'une moyenne de modèles permettait d'obtenir une prédiction plus robuste. Le modèle final atteignait un score de Spearman d'environ 0.49 sur notre évaluation, et les résultats sur le jeu privé sur Kaggle confirmaient l'absence de sur-apprentissage important.

Langage de programmation : Python

Projet

Note : 16/20

Graphs in Machine Learning

Professeur : Daniele Calandriello, Michel Valko & Achraf Azize

Cette UE ne comportait pas de projet au sens classique, mais trois TPs très denses et notés qui permettaient de mettre en pratique les principales idées de l'apprentissage sur graphes. Nous avons étudié la manière de représenter et d'exploiter les relations entre les données, puis comparé différentes approches pour propager l'information et apprendre des représentations utiles sur des structures non euclidiennes. Le TP2 m'a particulièrement plu : il traitait de reconnaissance visuelle de personnes en se basant sur une architecture de graphes. Assez sympathique !

Langage de programmation : Python

TP

Note : 14/20

Nuages de Points et Modélisation 3D

Professeurs : François Goulette, Jean-Emmanuel Deschaud & Tamy Boubekeur

Dans ce projet, nous avons étudié le recalage de nuages de points 3D, c'est-à-dire la recherche d'une rotation et d'une translation permettant d'aligner un nuage source avec un nuage cible. Nous nous sommes intéressés à PointNetLK Revisited, une méthode qui combine un descripteur appris par PointNet avec une optimisation itérative inspirée de Lucas-Kanade. L'amélioration principale repose sur le calcul analytique de la matrice jacobienne, qui remplace l'approximation par différences finies et doit rendre l'algorithme (en théorie) plus stable et plus rapide.

Nous avons implémenté et testé cette approche sur ModelNet40 et sur des scènes réelles de 3DMatch. Le recalage fonctionnait correctement sur plusieurs scènes après quelques itérations, mais restait très sensible à l'écart initial entre les nuages, en particulier pour les grandes rotations. Ce projet m'a surtout permis de relier des notions de deep learning, de géométrie 3D, de calcul différentiel et d'optimisation numérique, malgré des contraintes de mémoire parfois importantes (surtout avec un GPU limité).

Langage de programmation : Python

TP

Projet

Note : 14.9/20

Problèmes Inverses

Professeur : Josselin Garnier

Le projet portait sur l'imagerie mathématique d'un réflecteur (comme un avion qui émet des ondes sonores par exemple) à partir de signaux de bruit ambiant. Nous avons étudié les mathématiques théoriques derrière tout ça afin de retrouver la position du réflecteur à partir des temps de propagation et des corrélations entre les signaux reçus. Les visualisations produites permettaient ensuite d'observer (ou en tout cas d'estimer) la localisation du réflecteur.

Dans une seconde partie, nous avons étudié les corrélations croisées des signaux et construit une image CC-KM. C'était un projet assez théorique, qui m'a surtout permis de travailler sur des intégrales, des transformées de Fourier et des méthodes numériques liées aux problèmes inverses.

Langage de programmation : Python

Projet

Note : 19/20

Stage

Stage de 1ère année (1A)

Durant ce stage de huit semaines chez Easy Studies, j'ai participé à la refonte complète de l'application mobile de l'association. Nous avons repris l'application depuis zéro avec Flutter, puis j'ai principalement travaillé sur la gestion des élèves, des devoirs, des notes et des bilans, avant d'intégrer les API de la base de données existante.

Langage de programmation : Dart (via Flutter)

Note : 16.5/20

Stage de 2ème année (2A)

Durant ce stage de dix semaines chez RENOV'AIDES, j'ai amélioré l'application web RAFO, utilisée quotidiennement par l'entreprise. J'ai ajouté de nouveaux filtres et de nouvelles données, notamment la gestion des artisans, tout en retravaillant plusieurs pages et éléments d'interface. Ce stage m'a surtout permis de découvrir la programmation web avec Bubble.io et de mieux comprendre les workflows, les recherches et la logique métier d'une application déjà en production.

Technologie : Bubble.io (programmation web)

Note : 17/20

Stage de 3ème année (3A)

Durant ce stage de recherche de six mois au Cerema, j'ai travaillé dans le cadre du projet ApPLAuDI sur l'automatisation de l'inspection des ouvrages d'art. L'objectif était d'exploiter des photographies pour reconnaître la typologie d'un ouvrage et, à terme, générer automatiquement une description textuelle structurée. J'ai commencé par étudier les modèles vision-langage et mettre en qualité la base de données nationale PNP, avant de construire une chaîne complète de traitement des images et des données.

J'ai ensuite entraîné et comparé plusieurs modèles de deep learning, notamment des ResNet en configuration single-view et multi-view, puis réalisé une première expérience avec CLIP en zero-shot learning. Les meilleurs résultats ont été obtenus avec un ResNet-50 multi-vues, tandis que les performances de CLIP montrent surtout l'intérêt d'un fine-tuning bien travaillé au domaine spécifique des ouvrages d'art. Ce stage m'a permis de travailler sur un sujet de recherche concret, à la croisée de la vision par ordinateur, de l'apprentissage profond et des modèles vision-langage, tout en ouvrant des perspectives très pertinentes vers le fine-tuning et le transfer learning.

Langage et bibliothèque : Python (PyTorch)

Note : 16/20

Partage de connaissances

Probabilités à l'ENSIIE

Durant mon année à l'ENSIIE, j'ai rassemblé et produit différents documents afin d'aider mes camarades (et la promo suivante) à mieux comprendre les notions clés du cours de probabilités. Vous trouverez ici :

  • Correction du partiel - Une correction détaillée du sujet de partiel de probabilités 2022-2023.
  • « ++ » de Probabilités - Un "++", c'est un document supplémentaire destiné aux étudiants de la promo suivante, contenant des rappels de cours et des exemples pour consolider leurs révisions.

Statistiques à l'ENSIIE

De la même manière, j'ai conçu plusieurs documents en statistiques pour accompagner les étudiants dans leur apprentissage. Parmi ceux-ci :

Exercices corrigés (Terminale et Prépa)

Enfin, j'ai également regroupé quelques exercices corrigés de niveau Terminale et des exercices d'oraux de Prépa :

Projets Perso

Association EchequIIE

L'association EchequIIE est le club d'échecs de l'ENSIIE dans lequel j'ai occupé le rôle de président puis de secrétaire général pendant 2 ans. J'y ai investi de beaucoup de temps et d'énergie, et je suis particulièrement fier de son évolution et de l'ambiance qu'elle continue de générer.
Vous trouverez ci-dessous quelques documents liés à ses activités :

Autres documents (en vrac)

Enfin, voici quelques documents qui m'ont accompagné ou amusé au cours de mon parcours académique. Ils ne sont pas forcément liés à un projet précis, mais je les trouve utiles ou divertissants :