Bienvenue

sur ma page

Projets

Ordre indéterminé (si en cours)

qomet

Application web pour faire passer des examens

L'objectif (à moyen terme) est de proposer une alternative aux examens papiers, encore très répandus dans les universités. Il suffirait de disposer d'assez de salles machines, et éventuellement de les sécuriser en mode kiosk (car certaines tentatives de triche élaborées ne sont pas détectables par l'application seule).

Note : prototype en cours de test.


valse avec Emilie Devijver et Benjamin Goehry

Variable selection with mixtures of models

Sélection de modèle suivant une grille de paramètres de régularisation, sous forme d'un package R. Fait suite à un code similaire écrit en MATLAB, plateforme peu sympathique concernant la création et diffusion de toolbox libres. La méthode est décrite dans cet article.

Note : Il reste une division par zéro à élucider dans la boucle principale, mais le coeur du code (EMGLLF et EMGrank) est fonctionnel.


morpheus avec Mor-Absa Loum

Estimation de paramètres de mélange par des méthodes spectrales

La motivation pour ce travail est la recherche d'une alternative plus algébrique à l'algorithme EM utilisé notamment dans le package flexmix, permettant d'obtenir certains paramètres de manière exacte en temps fini. On montre en effet que les directions des vecteurs β sont retrouvées. Pour les détails en attendant le manuscrit de thèse vous pouvez consulter ce document qui présente un algorithme inpirant fortement le fichier "computeMu.R" du package.


epclust avec Jairo Cugliari, Yannig Goude et Jean-Michel Poggi

Classification des courbes de charge EDF

Fait suite à un projet aux objectifs similaires mais complètement écrit en C, très spécialisé et donc difficile à réutiliser (accessible ici). La classification des séries temporelles (échantillonnées à la demi-heure ou moins) s'effectue via une parallélisation de l'algorithme PAM.

Résumé du fonctionnement du package

talweg avec Jean-Michel Poggi et Bruno Portier

Time-Series Samples Forecasted With Exogenous Variables

Ce projet est la continuation du package aggexp, visant cette fois à prédire l'évolution intra-journalière des indices de pollution, heure par heure (si vos données sont échantillonnées plus finement le code s'applique aussi). Le principal modèle utilisé cherche les jours similaires à l'instant t, puis effectue une moyenne pondérée des séries passées. Il est comparé à plusieurs prédicteurs naifs (moyenne sur toute la série, etc).


aggexp avec Jean-Michel Poggi et Bruno Portier

Agrégation séquentielle d'experts pour prédire des indices de pollution

Premier volet d'une collaboration avec AirNormand (maintenant fusionné et rebaptisé Atmo Normandie), visant à améliorer la qualité des prédictions de PM10. Le package n'est pas spécifique aux données atmosphériques, et prédit une série au temps t+1 en effectuant une combinaison linéaire des prédictions d'experts. Une présentation est disponible.


mixmod de Florent Langrognet et al.

Classification (supervisée ou non) via des modèles de mélange gaussiens

Suite logicielle en C++ — avec des interfaces en R et Python — permettant d'effectuer la classification de jeux de données de nature continue, symbolique ou mixte. J'ai contribué au code C++ de 2013 à 2015 environ. Plus de détails sur les modèles statistiques.


mixstore

Site web regroupant des packages en lien avec les modèles de mélange

L'idée initiale était de disposer d'une sorte de "CMAN" ("comprehensive mixture models archive network"), où chaque utilisateur pourrait déposer ses packages, en rechercher, laisser des commentaires, voter ...etc. Le projet n'a pas vraiment rencontré l'adhésion du public (bien que le site soit fonctionnel : cf. screenshots sur ce poster). Une plateforme permettant d'effectuer des calculs intensifs avec un petit nombre de packages présélectionnés a vu le jour depuis (massiccc), mais l'objectif est différent.


synclust avec Christophe Giraud

Classification de sites d'observation d'oiseaux en fonction des variations d'effectifs annuels.

Méthode statistique d'identification des régions à dynamiques de populations synchrones, à partir de données de comptage obtenues au fil des années en chaque site. L'identification des régions est réalisée via la minimisation d'un critère de log-likelihood pénalisé (pour favoriser les dynamiques synchrones). Pour plus de détails, voir cet article.

Outils

Quelques codes, par ordre assez indéterminé

epica avec Gilles Celeux

Entropy-based ProbabIlistic Clustering visuAlization

Visualisation d'un résultat de clustering probabiliste (i.e. on dispose d'une matrice de probabilités d'appartenance des points aux classes), utilisant une distance de type Kullback-Leibler puis l'algorithme MDS. L'objectif est de déterminer rapidement si les données sont bien séparées ou non, d'une façon plus souple qu'avec les seuls indicateurs d'entropie.

Méthode décrite dans ce document.


cgds

Librairie C fournissant des structures de données génériques

À la fois simple d'utilisation et assez complète : vecteur, liste, tas, buffer trié, pile, queue (inverse d'une pile), arbre, file de priorité. L'implémentation utilise des pointeurs non typés (void*) afin de stocker n'importe quoi. Attention : aucune vérification de type n'est effectuée, le seul point commun exigé aux élément d'une structure est qu'ils soient représentés par le même nombre d'octets.

Bien sûr d'autres librairies existent - en particulier celle du projet GNOME. Ceci dit, développer sa propre version est un exercice intéressant :-]


erdiag

Génération de diagrammes MLD et MPD à partir d'un schéma E/A

Lors de la phase de conception d'une base de données il est parfois nécessaire de dessiner divers diagrammes avant de se lancer dans le code. Ici encore il existe divers outils pour réaliser cela, mais je n'en ai trouvé aucun satisfaisant à 100%. Ce code s'inspire de merisier, et tout comme lui fait appel à graphviz.

[customer]
#id
name
email
phone

[product]
#reference
name
description
price

{order}
customer +
product *
--
date

sha1

Quelques lignes de javascript pour calculer la Sha1-sum

Rien de plus (et même un peu moins : l'algo est limité aux messages de taille raisonnable), mais ça m'est souvent utile alors le voici sur github.


sview

Nano framework web prévu pour un site essentiellement statique

Inspiré par ShortPHP, avec les mêmes motivations : "I built [sview] because I constantly find myself building pure-HTML websites just needing a little bit of PHP here and there and a *tiny* bit of structure". Prévu initialement pour réaliser ma page web, ce qui fut le cas un moment.


pkgdev

Développer un package R contenant des sous-répertoires dans le dossier R/

pkgdev permet de...

  • Charger un package quelconque dans R (avec son code compilé et ses éventuels jeux de données) ;
  • Lancer ses tests unitaires écrits en R (resp. en C) dans R/tests (resp. src/tests). Essentiellement du bricolage : il existe des outils plus sérieux (j'utilise régulièrement testthat côté R, et en C pourquoi pas cmocka).
  • Recharger le package à tout moment (mise à jour des fonctions R et de la librairie associée).

...Comme devtools en moins complet (modulo les sous-répertoires dans R/) ; mais a été écrit quand devtools ne fonctionnait pas aussi bien qu'actuellement.

Informatrucs

Git

Mieux que dropbox & cie !

Pourquoi ? Car git permet de

  • retrouver n'importe quelle version passée de votre travail (en local d'ailleurs),
  • gérer différentes versions en créant des branches et des tags (évite d'avoir 12 dossiers nommés v1, v1_stable, v2 etc.),
  • comprendre les changements à chaque mise à jour (si le message de commit est bien écrit ; à défaut on peut facilement visualiser les différences),
  • collaborer sur un projet sans aucune crainte de perte de données : si quelqu'un a fait des changements entre-temps sur un fichier, vous ne pourrez pas envoyer vos modifications (il faut les fusionner d'abord).

Note : git gère mal les fichiers binaires, car il ne peut pas les compresser ni afficher les diffs (normal...). Il faut utiliser un outil annexe pour ça :

  • git-lfs : permet une gestion transparente des fichiers binaires, mais nécessite l'implémentation d'un serveur spécial. Fonctionne sur github (les développeurs de git-lfs) et gitlab CE, entre autres.
  • git-annex : moins transparent, mais ne nécessite pas de serveur particulier. Permet en particulier d'utiliser plusieurs remotes (les gros fichiers sont distribués en plusieurs emplacements).
  • git-fat : tient en un fichier Python de ~600 lignes, permet aussi plusieurs remotes, moins de possibilités qu'avec git-annex mais suffisant en ce qui me concerne.

Vous êtes convaincus ? ☺ ...alors lisez au moins les deux voire trois premiers chapitres.


Chiffrement

Comment et pourquoi chiffrer vos données et messages ?

  1. Une réponse de la CNIL, que l'on peut compléter par des logiciels agissant au niveau d'un dossier (veracrypt chiffre une partition entière) : ecryptfs par exemple est utilisé par défaut à l'installation d'Ubuntu.
  2. Concernant les emails, cet article est plutôt complet. Lisez au moins la citation d'introduction (source sur le site de l'auteur).

Note sur Gmail : le chiffrement est garanti entre deux correspondants Gmail uniquement (pas si vous envoyez à u-psud, yahoo ou autre). De plus Google garde l'accès à vos messages en clair lors de leur rédaction au moins (et il s'en sert...).


reveal.js

Réaliser des présentations en HTML (+ javascript)

Cette application permet de créer des ensembles de slides dynamiques (grâce à javascript), visionnables dans un navigateur. Un environnement de développement sympa peut être obtenu avec gulp par exemple, pour "compiler" puis recharger la page à chaque changement. Un bon éditeur LaTeX propose aussi un mode de compilation immédiate affichée à côté du texte, mais le gros souci avec LaTeX (en plus de la syntaxe pas toujours simple) est la séparation des sources du rendu : il n'est pas rare de perdre les sources ou de ne plus savoir quelle version a généré quoi. Impossible avec reveal car les sources sont contenues dans le rendu : un exemple avec une version de 2015. Clic droit, afficher source : tout est là.

Note : si comme moi vous n'aimez pas taper directement en HTML, essayez pug !


Jupyter

Confectionner ses vignettes R sans efforts

Jupyter peut être utilisé de plein de façons différentes : "Project Jupyter exists to develop open-source software, open-standards, and services for interactive computing across dozens of programming languages.", disent-ils. En tout cas cette application se prête bien à la rédaction de documentation annexe pour les packages R, puisqu'elle permet de mêler code R interactif avec markdown + LaTeX (comme RStudio + rmarkdown en fait, mais en plus général).

Note : il faut convertir par exemple en HTML pour obtenir une vignette acceptée sur le CRAN.

Note bis : combinaison reveal.js + Jupyter


Terminal

Pourquoi utiliser une interface graphique ?

Dans beaucoup de situations il n'est pas nécessaire d'utiliser un outil graphique, et on peut être plus efficace en utilisant des applications en mode console. Celles-ci peuvent être considérées moins jolies que leur contrepartie graphique, mais elles ont aussi l'avantage d'être utilisable après s'être logué sur un serveur via ssh.

Pour en citer quelques-uns que j'utilise régulièrement :

  • mutt : "All mail clients suck. This one just sucks less" ;
  • vim : le célèbre éditeur (parce que je maîtrise mal ed) ;
  • vifm : un explorateur de fichiers aux commandes similaires ;
  • dmenu : un lanceur d'applications, parfait avec dwm.

Note : mutt peut facilement être configuré pour (dé)chiffrer les messages et fonctionner en mode local, les courriels étant synchronisés par un autre outil (qui lui ne fait que ça : isync).


Mode local

"Inverser" sa configuration au labo

Pour ne plus dépendre des éventuels problèmes réseau (il devrait moins y en avoir dans le nouveau bâtiment ceci dit), vous pouvez créer et toujours utiliser un compte local, qui se charge de monter au démarrage votre dossier distant. Si vous effectuez une sauvegarde régulière des données distantes (rsync + systemd par exemple), les fichiers locaux seront toujours accessibles dans le dernier état connu, même s'il y a une panne du serveur de fichier. Cela permet de travailler quand-même puis de synchroniser après la panne local → remote.

Note : nécessite un accès root (demander au service info de vous ajouter aux sudoers).

Enseignements

2018 = année scolaire 2017-2018

Coordonnées

Bâtiment 307, bureau 2A3 IMO / Équipe probabilités-statistiques Université Paris-Sud 91405 Orsay Cedex France


prenom.nom@math.u-psud.fr (email + tel)

Clé PGP :
  • Empreinte : FA5B F719 70B1 2F1F 4A2C 4DF2 5D68 7162 BCD8 D7E9
  • Fichier .asc

CV

Mon parcours...

Depuis décembre 2012

Ingénieur dans l'équipe probabilités-statistiques de l'IMO :
  • collaborations sur divers projets en statistiques appliquées,
  • assistance informatique au niveau de l'équipe,
  • co-administration du cluster de calcul du laboratoire,
  • quelques enseignements.

Juin 2011-Août 2012

Lokad, ingénieur R&D sur le coeur du moteur de prévision (Lokad.Analytics) :
  • optimisation du code existant,
  • élaboration de nouvelles méthodes de prévision,
  • réagencement du code (refactoring),
  • écriture de tests unitaires.
Ce que cette expérience m'a apporté :
  • développement en équipe sur un code volumineux,
  • prise en compte des retours et demandes des clients,
  • cloud computing via la plateforme Windows Azure.

Février 2008-Février 2011

Thèse au CEA Cadarache, co-encadrée par

Sujet : modélisation statistique de codes de calculs à sorties fonctionnelles.

  1. classification non supervisée des entrées/sorties du code,
  2. réduction de la dimension dans chaque groupe,
  3. application d'algorithmes d'apprentissage classiques.

Septembre 2006-Décembre 2007

Master2 à l'Université de Sherbrooke (Québec), encadré par Froduald Kabanza.
Thème principal : planification de trajectoires.

Projet de fin de M2 : optimisation des trajectoires de caméras filmant des actions réalisées par les astronautes en entraînement ; implémentation des algorithmes dans RomanTutor. Ce logiciel est destiné à faciliter la manipulation du bras-robot canadien.

Cours/TD/TP suivis :
IntituléProjet
planification (en intelligence artificielle)"trajectoire" d'une pierre au jeu de go si pas assez d'espace pour vivre localement.
informatique cognitiveprogrammation d'un joueur de poker en utilisant Act-R.
reconnaissance de formeimplémentation de la méthode de clustering décrite dans cet article.
intelligence artificielleimplémentation de la méthode NEAT d'apprendre les déplacements d'un personnage de jeu vidéo.
programmation orientée objetinterface graphique pour superviser des scénarios de tests sur des robots mobiles.

Juin 2006-Août 2006

Stage de fin de 2A au CEA Cadarache avec Bertrand Iooss.

Sujet : étude du comportement des indices de sensibilité basés sur l'entropie.

Contenu :
  • démontration de quelques-unes des propriétés des indices ;
  • écriture d'algorithmes de calcul.

Résumé des travaux. Rapport final

Septembre 2004-Juin 2006

1A et 2A à l'ENSIMAG (Grenoble), et L3 puis M1 de mathématiques (à l'Université Joseph Fourier).

Options ENSIMAG 2A (liste des cours) :
Systèmes intelligents, reconnaissance et raisonnement : parcours de graphes, classification bayésienne/algorithme EM, systèmes experts avec CLIPS.
Statistique inférentielle : intervalles de confiance, tests d'hypothèse, estimation (non) paramétrique ; quelques cours.
Algorithmique : complexité, parallélisme, heuristique.
Analyse, conception et validation de logiciels : modélisation objet, patrons de conception, diagrammes UML.
Optimisation numérique : théorème de KKT, dualité lagrangienne, algorithmes de descente de gradient.
Optimisation combinatoire : algorithme du simplexe, flot maximum dans un graphe, problèmes de plus courts chemins.

Projet de fin de 2A encadré par Julien Moncel : dislocation d'un graphe.

  • Étude de quelques cas particuliers.
  • Implémententation de diverses heuristiques.

Options UJF :

Algèbre : le cours devait plus ou moins correspondre à ceci.
Fonctions holomorphes : fonctions analytiques, intégrale curviligne, théorème des résidus.
Analyse fonctionnelle : espaces de Banach et de Hilbert, séries de Fourier, théorie spectrale.
Géométrie Différentielle : sous-variétés, fibré tangent, champs de vecteurs.
Processus stochastiques : processus à temps discret, martingales, chaînes de Markov.
Calcul formel : le cours devait correspondre au moins en partie à ce document.

TER de M1 supervisé par Bernard Parisse sur les bases de Gröbner :

  • implémentation de l'algorithme de Buchberger et de quelques optimisations ;
  • vérification de théorèmes de géométrie élémentaires à l'aide du code.

Musée

2006 à 2011

J'ai re-compilé et testé le plus de codes possible. En principe peut tourner moyennant quelques adaptations mineures (gcc a évolué !), sauf le projet sur le bras-robot canadien (car la partie graphique dépendait de plusieurs DLLs Windows...).

2006

Projets de fin de 2A / TER de M1

Dislocation

Implémentation d'algorithmes de Δ-dislocation d'un graphe ; c'est à dire lui retirer des arêtes jusqu'à ce que toutes ses composantes connexes soient de cardinal au plus Δ. Réaliser cela de manière optimale (i.e. avec le moins d'arêtes possible) n'est pas possible en temps raisonnable, sauf sur de très petits graphes. Diverses heuristiques peuvent cependant être appliquées ; quelques-unes sont implémentées dans le code et discutées dans le rapport.

Bases de Gröbner

Ma première expérience de développement en calcul formel. Pour citer Wikipedia : "une base de Gröbner d'un idéal I de l'anneau de polynômes K[X1,...,Xn] est un ensemble de générateurs de cet idéal, vérifiant certaines propriétés supplémentaires. [...] Les bases de Gröbner ont le grand avantage de ramener l'étude des idéaux polynomiaux à l'étude des idéaux monomiaux (c'est-à-dire formés de monômes), plus faciles à appréhender".

Seul l'algorithme de Buchberger est écrit (ainsi que quelques optimisations), et nous avions essayé de vérifier des théorèmes géométriques pour utiliser et valider le code. Pour des algorithmes plus performants voir F4 et F5 de Jean-Charles Faugère.

Stage au CEA Cadarache sur les indices de sensibilité

L'objectif était d'étudier des indices de sensibilité basés sur l'entropie, contrastant avec les indices de Sobol couramment utilisés. On montre essentiellement que les deux sont complémentaires, à travers une implémentation en C++, une (maladroite...) en R et diverses analyses théoriques dans le rapport.

2007 à Sherbrooke au Québec, laboratoire planiart

ArbreClassif, Classification

Le premier dossier contient la première version d'un code calculant un arbre de décision. Il avait de meilleures performances que quelques références de l'époque dont par exemple C4.5. De plus il peut traiter des données de nature continue, discrète ordonnée ou discrète symbolique. Le second dossier est une extension du premier, ajoutant d'autres méthodes de classification dont les k plus proches voisins, et un mélange de gaussiennes.

Jeu PPC

Inspiré par un article dont j'ai un peu perdu les références, et surtout par ce papier, ce code joue à pierre-papier-ciseaux. Deux modes sont possibles : humain vs. ordinateur, ou machine vs. machine (éventuellement avec des stratégies différentes). L'idée est d'utiliser un réseau de neurones comme "mémoire", celle-ci étant proportionnelle au nombre de neurones d'entrée.

Application moderne : une mini-appli javascript proposant de jouer à "Rock-Paper-Scissors-Lizard-Spock" tel qu'introduit par Sheldon dans TBBT.

Projet d'IA

Programme amusant d'inspiration biologique, faisant évoluer un réseau de neurones de manière non conventionnelle : celui-ci mute, est croisé avec d'autres, nait et meurt (surtout s'il n'est pas adapté) ; bref le réseau est un individu dans un algorithme génétique. Les opérateurs génétiques sont repris du code NEAT officiel, que j'avais réécrit car celui-ci compilait mal. L'objectif était d'utiliser un jeu vidéo comme fonction de fitness, faisant ainsi évoluer une population vers un "super joueur" ; l'ambition étant par exemple de prouver qu'un jeu est possible, et de noter sa difficulté en fonction de la complexité du gagnant.

Projet de fin de M2 : déterminer les déplacements d'un jeu de caméras

Les caméras en question sont arrimées à la surface de la station spatiale internationale (ISS), et il fallait - étant donnée une trajectoire du bras-robot - optimiser l'utilisation des caméras de façon à ce que les astronautes à l'entraînement aient toujours un bon angle de vue sur le bras. Ce fut l'occasion de m'initier au cinéma (types de plan, paramètres de la caméra), tout en improvisant quelques méthodes, implémentées dans le logiciel RomanTutor.

Interface du logiciel - Exemple de vidéo

Thèse CEA - UPMC

2009

matop

Code C++ calculant la SVD d'une matrice, "from scratch" (sans librairies externes). Point positif : elle fournit un résultat juste, la méthode est robuste (essayez avec de grandes matrices). Point négatif : en 2009 elle était beaucoup plus lente que Lapack (utilisée par R), ça ne s'est sûrement pas arrangé depuis. Ceci dit la méthode a l'avantage d'être simple à implémenter et comprendre :

  1. Bidiagonalisation : par ici (ou par là).
  2. Rotations de Givens
searchBasis

Programme R développé à l'occasion d'une collaboration avec Aurélie Fischer sur un article visant à optimiser une base de fonctions relativement à un critère de distorsion. Nous avions choisi un ensemble de bases d'ondelettes, comme un bon compromis entre adaptation aux données (la meilleure base de ce point de vue étant en pratique calculée par une SVD, plutôt coûteuse) et vitesse de calcul. Les applications s'effectaient notamment sur les sorties du code CATHARE.

Note : le code est difficile à utiliser, étant non packagé et quasi sans documentation...

2011

modelcf

Le package développé au fil de ma thèse ; il contient des bouts de code intéressants (détermination automatique du nombre de clusters, apprentissage de variétés) mais cherche à en faire trop. Du coup il contient - très probablement - des bugs, qui ont compliqué la phase applicative en fin de doctorat. Il aurait fallu le scinder en deux : clustering / manifold learning, puis écrire un code faisant appel à ces deux sous-packages.

Lokad

Les premiers jours, mise à niveau en C#

Afin de me familiariser avec la plateforme de développement, on m'avait demandé d'écrire un parser d'expressions algébriques simples permettant de les évaluer et de les dériver formellement. Le résultat est fonctionnel bien que largement perfectible (les expressions sont correctement traitées, mais les dérivées ne sont pas simplifiées).

Note : C# est un langage très agréable (surtout avec ReSharper). Dommage qu'il ne soit pas multi-plateformes...