Explorer un modèle stochastique

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Considérons un modèle stochastique à un paramètre à valeurs réelles. Autrement dit, une variable aléatoire à valeurs réelles et paramétrée par un réel. Informatiquement, on aurait quelque chose de ce genre :

1
2
3
def model(p, seed=None):
    random.seed(seed)
    return p * random.random()

Considérant ce modèle comme une boîte noire, je souhaite étudier l’influence de $p$ sur le résultat. En particulier, je me pose deux questions :

  • Comment évolue la sortie en fonction de $p$ ?
  • Comment se comporte mon modèle pour $p$ suivant telle distribution (par exemple $\mathcal N(10, 1)$) ?

Comme mon modèle a en fait deux paramètres, je travaille dans un plan et peux mener mon exploration de multiples façons :

  • Pour $p$ fixé, faire varier la seed
1
2
3
4
5
seed
| x  x    x
| x  x    x
| x  x    x 
|_x__x____x___> p
1
2
3
4
outputs = {
    p: [model(p) for _ in range(N_RUNS)]
    for p in [1, 4, 10, 11]
}
  • Pour la seed fixée, faire varier $p$
1
2
3
4
5
seed
| x x x x x
| 
| x x x x x
|_____________> p
  • On fait varier les deux
1
2
3
4
5
seed
|    x    x
| x    x     x
|   x   x   x
|_x__x____x___> p
1
2
3
4
outputs = {
    p: model(p)
    for p in normal(10, 1, size=n)
}

Et j’ai du mal à déterminer dans quel cas quelle approche est souhaitable ou non. Déjà, cela fait-il sens de modéliser l’aléatoire par un axe réel que je peux explorer ou devrais-je simplement considérer que je n’ai que l’axe de $p$ ?

Merci.

+0 -0

Quand tu augmentes p, les valeurs que tu obtiens augmentent. P a un rôle ’naturel’ dans l’exercice.

Par contre quand tu joues sur seed, tu joues sur un paramètre ’fictif’. Tu joues sur un paramètre qui est là un peu par hasard. Donc faire un graphique quelqu’il soit où seed apparaît, ça n’a pas de sens.

Si tu souhaites voir l’influence de p seulement, tu prends une graine, tu changes p, et fini.

Si tu supposes que la graine a une influence (ce qui est mauvais signe pour une génération de nombre aléatoire, mais c’est possible), ou qu’il y a interactions entre la graine et p, tu peux soit réaliser un plan d’expérience, c’est à dire considérer des couples (p, seed) régulier (ce qui correspond à tes cas 1 et 2, qui sont en réalité équivalent), soit, si tu crains qu’il se passe des choses particulières avec des couples réguliers, tester avec des (p, seed) choisis aléatoirement entre des bornes (c’est ton cas 3).

En pratique, on fait souvent 1 ou 2, mais on devrait faire 3 (inconvénient, il faut souvent plus de mesure pour paver tout l’espace ; avantage, on est plus juste ; imagine la fonction sin(x) + sin(y), un pavage régulier pris au mauvais endroit risque de donner des résultats faux).

+0 -0

Merci pour vos réponses. :)

Si tu souhaites voir l’influence de p seulement, tu prends une graine, tu changes p, et fini.

Mais imaginons que j’ai le modèle suivant :

1
2
3
4
5
def model(p, seed=None):
    rd.seed(seed)
    if rd.random() > 0.5:
        return 0
    return p * rd.random()

En fixant la graine, ne risqué-je pas de me coincer dans le if ?

En fait, je ne souhaite pas observer la seed en tant que telle mais m’assurer que la propriété stochastique de mon modèle est suffisamment prise en compte. Si mon modèle m’indique que ma population s’éteint d’autant plus rapidement que $p$ est grand, comment savoir si ce n’est pas dû à la seed que j’ai fixée au préalable ?

Je me rends compte qu’il y a un cas que je n’ai pas mentionné, celui où on fait varier les deux mais sans contrôler la valeur de la seed :

1
2
3
4
5
seed
|     x     
|   x  
|       x 
|_x_______x_> p

Ici, $p$ prend des valeurs régulières mais pas la seed (qui, par exemple, est basée sur l’heure courante). Je ne parviens pas à déterminer si ce pavage est souhaitable ou non. Avec un modèle déterministe à deux paramètres $p_1$ et $p_2$, je ne pense pas que ce soit le cas. En effet, avec le pavage précédent, le fait que ma sortie augmente avec $p_1$ n’indique pas qu’ils sont corrélés vu que l’effet peut être dû à $p_2$ ou $(p_1, p_2)$. La même prudence est-elle requise quand $p_2$ est la graine ?

+0 -0

En fixant la graine, ne risqué-je pas de me coincer dans le if ?

Pas si tu fais les choses bien. :P Faire 100 essais avec une graine fixe, ce serait choisir une graine puis lancer ton test 100 fois. Là, avec ta fonction model, tu ferais 100 fois le même test.

En fait, je ne souhaite pas observer la seed en tant que telle mais m’assurer que la propriété stochastique de mon modèle est suffisamment prise en compte. Si mon modèle m’indique que ma population s’éteint d’autant plus rapidement que p est grand, comment savoir si ce n’est pas dû à la seed que j’ai fixée au préalable ?

Soit tu peux le prouver mathématiquement, soit le tester numériquement, soit utiliser des fonctions de tirage aléatoire qui, elle, ont été vérifiées. Sache par contre que ce genre de question est très complexe, même en tant que simple utilisateur, pour peu que tu veuilles du vrai hasard (cas typique : cryptographie, ou simulation scientifique (c’est mon cas)).

Sauf cas tordus, prendre une graine et la laisser courir ou réinitialiser la graine à chaque fois devrait donner le même résultat. Un essais à l’arrache me confirme cela (mais garder une seule graine est beaucoup plus rapide !).


Je pense que le problème vient du fait que tu cherches à tester avec la même méthode deux choses radicalement différente : l’effet de la graine, et donc la validité de ta génération aléatoire, ce qui est un problème complexe, mathématique, et qui doit se résumer en tant qu’utilisateur à « trouver le bon modèle » (Mersenne initialisé correctement1, wellrng…) et l’effet d’un paramètre du modèle, pour lequel tu dois conduire un plan d’expérience. Ce dernier est simple, et personne ne le fera pour toi ; ses effets devraient être visibles facilement et un plan d’expérience bête et méchant (régulier ou aléatoire) doit suffire. Le premier est complexe, déjà résolu par d’autres, et probablement hors de ta portée si tu souhaites le faire correctement.


  1. Ce qui est potentiellement très dur ; j’ai bien souffert avec le Mersenne de la bibliothèque standard du C++… 

+0 -0

Je pense que le problème vient du fait que tu cherches à tester avec la même méthode deux choses radicalement différente : l’effet de la graine […] et l’effet d’un paramètre du modèle, pour lequel tu dois conduire un plan d’expérience.

C’est bien la seconde partie, en gras, qui m’intéresse. La mention de la première découle d’une confusion de ma part : comme je ne lance actuellement mon modèle qu’une fois avec la même graîne (basée notamment sur l’heure), mon axe seed représente l’aléatoire, si ça fait sens.

En fait, la question que je me pose est : pour étudier l’influence de $p$, faut-il que je lance plusieurs fois mon modèle pour une valeur donnée du paramètre ou non ? Parmi les deux graphes ci-dessous, y en a-t-il un préférable (selon quel critère ?) ?

Exécution d’un modèle stochastique

Note : il est indiqué fixed seed mais la graîne n’est pas fixée et varie entre chaque point.

Au sujet du second graphe, où je ne fais qu’une exécution du modèle par valeur de $p$, comment puis-je savoir si je ne suis pas pile tombé sur la séquence de graînes qui mène à cette corrélation ?

Ce dernier est simple, et personne ne le fera pour toi ; ses effets devraient être visibles facilement et un plan d’expérience bête et méchant (régulier ou aléatoire) doit suffire.

Connaîtrais-tu des ressources (sites, livres, mots-clés…) que je pourrais consulter pour m’éduquer à ce sujet ?

+0 -0

En fait, la question que je me pose est : pour étudier l’influence de p, faut-il que je lance plusieurs fois mon modèle pour une valeur donnée du paramètre ou non ? Parmi les deux graphes ci-dessous, y en a-t-il un préférable (selon quel critère ?) ?

Ça dépend, et oui, mais ça peut être l’un ou l’autre selon ce que tu étudies.

Si tu cherches à prédire le résultat (avoir la loi) que tu vas avoir à partir d’un p donné, tu as besoin à minima d’un écart-type, et donc de lancer plusieurs essais avec un même p. Si tu cherches l’évolution des résultats selon l’évolution de p, choisir de nombreux p te permets de ne pas avoir à extrapoler les valeurs intermédiaires autant que dans le cas précédant.

Autrement dit, la première méthode te donne la volatilité à un p donné facilement, la seconde l’évolution de ton modèle avec p. En pratique, il y a bien évidemment un fort recoupement entre les deux méthodes, pour peu que le système se comporte de manière « gentille » (linéaire, c’est parfait, continue et dérivable de dérivée pas trop grande, c’est déjà pas mal). Mais chaque méthode te donne une information plus directement que l’autre.

Connaîtrais-tu des ressources (sites, livres, mots-clés…) que je pourrais consulter pour m’éduquer à ce sujet ?

Non. C’est souvent quelque chose d’appris à l’arrache avec l’expérience… Où dans certains cours, que je n’ai personnellement jamais eu. :-° Je ne peux que te recommander de fouiller internet avec le mot-clé plan d’expérience.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte