fonction set.seed()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

alex hassan
Messages : 81
Enregistré le : 02 Oct 2012, 11:25

fonction set.seed()

Messagepar alex hassan » 10 Oct 2014, 13:40

Bonjour,

je voulais juste une explication simple en français sur la fonction set.seed(),

j'ai lu des documents et j'ai compris le suivant:
une fonction qui sert à régénérer les mêmes données aléatoires,

Code : Tout sélectionner

set.seed(123)
rnorm(100)
set.seed(123)
rnorm(100)

ce code génère les les mêmes valeurs pour les histoires de simulation?
est-ce que c'est tout ???

Merci d'avance

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 10 Oct 2014, 13:56

Bonjour,

Oui c'est tout.
L'avantage est de pouvoir obtenir du code reproductible pour les fois ou l'on fait appel à un processus aléatoire (simulation, bootstrap....).

Sinon à chaque fois que tu fais tourner le code tu obtiens un résultat (un peu) différent. Grâce à ça le résultat est reproductible d'une session à l'autre, d'un ordinateur à l'autre (même entre système différent je pense).
Matthieu FARON

alex hassan
Messages : 81
Enregistré le : 02 Oct 2012, 11:25

Messagepar alex hassan » 11 Oct 2014, 09:01

Merci pour l'explication.

Cdlt

Alex

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 11 Oct 2014, 15:17

Bonjour,

Je viens de tester set.seed sur 3 machines différentes et 2 OS : Windows et Linux (je n'ai pas d’accès à un mac) et qq soit la machine :

Code : Tout sélectionner

set.seed(1)
> rnorm(10)
 [1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078 -0.8204684
 [7]  0.4874291  0.7383247  0.5757814 -0.3053884


Serge

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 11 Oct 2014, 16:57

le vrai aléatoire n'existe pas donc il existe différent moteur d'aléatoire et la fonction set.seed permet effectivement de fixer ce moteur pour tout ce qui contient un processus "aléatoire".

Nicolas

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 11 Oct 2014, 21:27

Serge Rapenne a écrit :[...] je n'ai pas d’accès à un mac [...]

Ça marche aussi pour mac, R est très bon pour cela :

Code : Tout sélectionner

> set.seed(1)
> rnorm(10)
 [1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078 -0.8204684
 [7]  0.4874291  0.7383247  0.5757814 -0.3053884
> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

locale:
[1] fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plsgenomics_1.2-6 MASS_7.3-33       pls_2.4-3       

loaded via a namespace (and not attached):
[1] tools_3.1.1

Amicalement,

Jean

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Messagepar Eric Wajnberg » 12 Oct 2014, 06:17

Un tirage pseudo-aléatoire n'est rien d'autre que le résultat d'un calcul comme un autre. Dans le même ordre d'idée si je lance le calcul :

Code : Tout sélectionner

2+3
[1] 5

J'obtiendrai - j'espère - le même résultat sur toutes les machines et tous les OS. Je ne vois pas trop où est la performance (de R, ou autre) ici.

Eric.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 12 Oct 2014, 07:48

Sauf que les OS unix ont leur propre générateur pseudo aléatoire (/dev/random) et que les développeurs de Gnu R aurait très bien pu faire le choix de l'utiliser ce qui aurait entrainer des divergences.
Mais il est vrai que les versions Windows et Mac sont sorties peu de temps après la version unix et que les développeurs R sont loin d'être des billes.

Serge

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Messagepar Eric Wajnberg » 12 Oct 2014, 08:56

/dev/random donne la seed (j'utilise souvent ce device dans mes simulations de Monte Carlo), mais ici, avec set.seed(), le point de départ de la congruence multiplicative est fixé, et la suite calculatoire (qui utilise tout le temps le même algorithme) reste la même, et est donc indépendante de la machine et/ou de l'OS.

AMicalement, Eric.

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 14 Oct 2014, 18:25

Moi j'ai ça :

Code : Tout sélectionner

> 2+2
[1] 5
mais que pour les grandes valeurs de 2, il est vrai.
Amicalement,
Jean

khaoula gammoudi
Messages : 43
Enregistré le : 22 Jan 2013, 16:48

Re: fonction set.seed()

Messagepar khaoula gammoudi » 01 Mar 2017, 20:09

Bonsoir,
Merci pour votre explication, ça m'a aidé pour comprendre l'utilité de la fonction set.seed().
Actuellement, j'essai de construire des graphiques de type network et je trouve cette fonction présente dans le conde R.
Ma question est comment choisir le nombre à accorder pour cette fonction, par exemple set.seed(576) ?
Merci infiniment.
gammoudi

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Re: fonction set.seed()

Messagepar Maxime Hervé » 02 Mar 2017, 13:27

Bonjour,

l'idée est que le résultat soit "aléatoire", donc le choix du nombre doit l'être lui-même. Personnellement je prends toujours l'heure qu'il est, en l'occurrence 14h27 donc 1427.

Maxime

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: fonction set.seed()

Messagepar Eric Wajnberg » 02 Mar 2017, 13:37

Maxime Hervé a écrit :Bonjour,

l'idée est que le résultat soit "aléatoire", donc le choix du nombre doit l'être lui-même. Personnellement je prends toujours l'heure qu'il est, en l'occurrence 14h27 donc 1427.

Maxime

Il y a un vrai problème ici, avec lequel je me bats depuis des années, faisant une très grande quantité de simulations moi-même de manière régulière. Premièrement, prendre l'heure ainsi ne fournit pas suffisamment de suites aléatoires différentes - loin s'en faut, conduisant à des biais importants dans les résultats. J'ai eu pas mal de problème avec ça dans le passé. Par ailleurs, ceci se complique fortement si les calculs se font sur des machines parallèles (ce qui est mon cas) car plusieurs calculs peuvent partir au même moment, et donc donner exactement les mêmes résultats !

Il faut se rendre à l'évidence : Sur des machines de type Windows, Microsoft, etc., il n'y a pas de moyen de s'en sortir. Il faut passer sur des machines de type unix ou linux, et utiliser le bruit généré par /dev/random ou /dev/urandom, y compris dans des calculs parallèles (heureusement, les grilles de calculs actuellement tournent principalement sur des architectures de type Linux).

HTH, Eric.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Re: fonction set.seed()

Messagepar Maxime Hervé » 02 Mar 2017, 14:36

Ola j'aurais dû préciser, je ne parlais que de situations simples du type générer une série de données pour un exemple comme plus haut dans le post. Pas d'une véritable étude basée sur une simulation, où l'on génère un grand nombre de séries de données. Dans un cas pareil bien sûr que je ne prendrais pas l'heure pour cause de biais évident que tu soulignes.

Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: fonction set.seed()

Messagepar François Bonnot » 03 Mar 2017, 08:45

Premièrement, prendre l'heure ainsi ne fournit pas suffisamment de suites aléatoires différentes - loin s'en faut, conduisant à des biais importants dans les résultats. J'ai eu pas mal de problème avec ça dans le passé. Par ailleurs, ceci se complique fortement si les calculs se font sur des machines parallèles (ce qui est mon cas) car plusieurs calculs peuvent partir au même moment, et donc donner exactement les mêmes résultats !


Bonjour,

D'après la documentation de set.seed(), il n'est pas nécessaire d'initialiser la graine en début de session (sauf pour obtenir des séries identiques comme expliqué ci-dessus) car celle-ci est par défaut initialisée à partir de l'heure système ou de la dernière valeur obtenue par le générateur:

"Initially, there is no seed; a new one is created from the current time (and since R 2.14.0, the process ID) when one is required. Hence different sessions will give different simulation results, by default. However, the seed might be restored from a previous session if a previously saved workspace is restored."

Je crois comprendre que set.seed(NULL) initialise la graine à partir de l'heure système mais la documentation n'est pas parfaitement claire:

"If called with seed = NULL it re-initializes (see ‘Note’) as if no seed had yet been set." (la note correspond au texte ci-dessus)

Pour initialiser explicitement la graine à partir de l'heure système, mieux vaut ne pas utiliser l'heure exprimée en secondes qui risque de donner plusieurs fois la même valeur en cas de calcul parallèle.

Utiliser les fractions de seconde devrait régler le problème comme le montre cet exemple qui donne (presque toujours) des heures différentes correspondant au temps d'exécution des commandes figurant sur la même ligne:

Code : Tout sélectionner

t <- as.numeric(Sys.time()) ; sprintf("%1.20f",t) ; t <- as.numeric(Sys.time()) ; sprintf("%1.20f",t)

Donc :

Code : Tout sélectionner

t <- as.numeric(Sys.time())
seed <- 1e8 * (t - floor(t))
set.seed(seed); print(seed)

Je ne l'ai pas inventé, je l'ai trouvé sur ce site :

http://stackoverflow.com/questions/10910698/questions-about-set-seed-in-r
François


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité