Aujourd’hui, on va s’amuser un peu en prenant les concepts de base de l’évolution (mutation + sélection) et en les appliquant à un problème qui est courant quand on veut travailler avec des modèles : la calibration. Vous savez déjà qu’un modèle est une formulation mathématique de la réalité. C’est un outil qui va nous permettre de comprendre comment ce qu’on observe fonctionne, mais qui comme tous les outils à souvent besoin d’être calibré. Par exemple, on peut modéliser la somme d’argent disponible sur votre compte l’année prochaine comme étant
soit la somme disponible pour l’année t, multipliée par le taux d’intérêt. Si on veut prédire correctement combien on aura l’année prochaine, il faut connaître la valeur de tau. Dans certains cas, on peut approcher cette valeur en jetant un œil plus ou moins attentif à des données disponibles, et en connaissant un peu le « bestiaire » des fonctions principales. Ou alors, en faisant un peu de maths.
Dans d’autres cas, ça va devenir un peu plus compliqué. Il faudra, par exemple, estimer différents paramètres en même temps. Imaginons un exemple simple. On observe au labo une population en croissance, et on voudrait bien estimer quelques paramètres de cette population.
Imaginons qu’on aie les données qui suivent :
Sur le temps qu’on observe, on voit qu’on peut résumer notre phénomène à quelque chose qui ressemblerait à
ou P est la population, t le temps qui passe, et a b et c sont des paramètres qu’on voudrait connaître. La courbe noire est la « vraie » fonction, les points gris sont des données simulées en ajoutant du « bruit » sur cette fonction.
A ce stade, je mentionne quand même qu’il y a toute une tapée d’algorithmes pour estimer des paramètres, et tout autant de moyens de confirmer dans quelle mesure le modèle utilisé colle aux données. Ce n’est pas l’objectif de ce billet d’en parler. Et puis ça me rappelle le travail…
On peut se dire qu’on va essayer de trouver les valeurs en réfléchissant bien et en faisant des calculs, ou alors on peut se dire qu’il est l’heure d’aller se chercher un café pendant qu’on laisse l’évolution travailler pour nous. Quel rapport avec l’évolution?
C’est très simple. Dans la version la plus brute qu’on puisse considérer, l’évolution est l’ensemble des phénomènes qui vont maximiser la fitness. En fait, on cherche l’endroit d’un « paysage » dans lequel on est le plus performant, ce qu’on appelle un « pic adaptatif ». Nous allons donc faire évoluer un jeu de paramètres du modèle, pris au hasard, et leur faire trouver un pic adaptatif. Quel est ce pic? Facile, c’est le jeu de paramètres pour lequel le coût payé est le moins important.
Par coût, ici, on entend le fait d’être « loin » des vraies données. Sur le figure précédente, la ligne noire a un coût très faible (elle reproduit bien les données), et une ligne horizontale aurait un coût très élevé. Tout ça impose de trouver un moyen d’estimer la distance aux données, et on utilise pour ça la valeur des somme des carrés résiduels, soit
Tout simplement, on prend le carré de la différence entre les vraies données et le jeu de données (E) qui sert à l’estimation, et on fait la somme pour chaque point des données. Plus l’estimation va être proche des données, plus C va tendre vers 0, ce qui indique qu’on est en haut du pic.
On a donc des règles de base pour l’évolution de nos paramètres. On cherche un pic qui correspond à C proche de 0. Nous partons d’une série de 100 valeurs de paramètres (100 fois a, 100 fois b, 100 fois c), tous compris entre 0 et 3 (c’est à ce moment que l’œil intervient).
Ensuite, on va lancer une série de 100 générations de reproduction, avec les règles suivantes : (i) à chaque génération, seulement le meilleur génotype (C le plus faible) se reproduit et (ii) il donne toujours le même nombre de descendants (on a toujours 100 jeux de paramètres en cours). On peut complexifier la règle (i) pour différentes raisons (si on craint que le paysage possède plusieurs pics, on peut introduire de la recombinaison par exemple), mais ce n’est pas nécessaire ici.
Pour les 100 descendants, 99 portent des mutations sur les différents paramètres (la nouvelle valeur est distribuée normalement autour de la valeur du parent). En on recommence ainsi de suite.
Pour générer ce jeu de données, j’ai utilisé la formule
Et après 100 générations, on a assisté à l’évolution de la formule
ce qui n’est pas si mal pour une méthode aussi simple!
Le résultat est le suivant :
La courbe rouge (résultat de l’évolution) colle pas mal du tout aux données!
On peut même voir à quelle vitesse le coût a baissé au cours du temps :
Le coût baisse rapidement au début (on est loin du pic, et la sélection fait une coupe franche dans les paramètres), et de plus en plus lentement à la fin. La progression est logarithmique, et il faudrait en gros laisser courir 100 fois plus longtemps pour gagner 10 % de précision (mais, à ce niveau la, 10 % de précision en plus ne nous intéressent pas puisqu’on a une très bonne estimation des données).Ce petit exemple montre comment on peut utiliser les bases de l’évolution pour faire un travail qui est, sinon, assez difficile et intense en terme de calculs. En revanche, il ne montre rien sur la nature de l’évolution en elle même (qui n’est pas finaliste, ne sait pas ou est le pic, et qui des fois a tout avantage a ne pas le monter).
Comme d’habitude, script .r disponible sur demande.