[Python] Sous échantillon aléatoire pas vraiment aléatoire! Pourquoi ?

Sous échantillon aléatoire pas vraiment aléatoire! Pourquoi ? [Python] - Python - Programmation

Marsh Posté le 09-07-2017 à 20:07:51    

Bonjour, :hello:

 

j'ai un script Python qui sélectionne de manière aléatoire un sous-ensemble d'une taille déterminée (50) de paires de valeurs parmi un ensemble d'origine plus grand (2000).
Aléatoire ?
Ben non !

 

Et ça m'embête beaucoup.

 


Je m'explique...

 

En gros j'ai un array X et un autre y représentant un nuage de points. Y a 2000 points dans chaque vecteur.
Je fais un plot(X,y) ça me fait un joli dessin. Bien.

 

Si je stack X et y dans un array de dimensions (2000,2) pour ensuite faire :

Code :
  1. XY = np.hstack((X,y.reshape(2000,1)))
  2. idx = np.random.randint(2000, size=50)
  3. Xsub  = Xysub[:,0].reshape(M,1)
  4. ysub  = Xysub[:,1].reshape(M,1)
 

Ben j'extrais un sous-échantillons de 50 pairs (X,y).
Si je les plot, ça va bien.

 

Le hic c'est que quand je lance ce script une deuxième, puis une troisième, puis une n-ième fois, il me retrouve systématiquement les mêmes 50 paires qu'il était censé trouvé de manière aléatoire pourtant !

 


Questions :

 

1. Pourquoi tant de systématisme dans ce qui devrait être du hasard ?

 

2. Comment s'appelle ce phénomène ?

 

3. Comment l'éviter, i.e. donc comment avoir réellement 50 autres paires choisies de manière aléatoire dans mon jeu de données lorsque je lance le script plusieurs fois ?

  

Merci beaucoup pour vos éclairages :jap:


Message édité par Swiss_Knight le 09-07-2017 à 20:09:12

---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 09-07-2017 à 20:07:51   

Reply

Marsh Posté le 09-07-2017 à 20:40:11    

Pour la postérité; apparemment ça ça marche mieux :
https://docs.python.org/2/library/random.html
 

Code :
  1. r  = random.SystemRandom()
  2. idx = r.sample(range(2000), 50)
  3. Xy_subsampled = Xys[idx,:]


---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 10-07-2017 à 09:16:00    

Les nombres aléatoires en informatique sont calculées à partir de seed. On appelle cela des générateurs de nombre pseudo aléatoires.
Il s'agit généralement d'une suite arithmétique qui dépend d'une entrée x et défois d'autres facteurs.
La méthode rand de posix fonctionne de la même manière et renverra toujours le même suite de nombre.

 


Il y a plusieurs méthodes

 

On peut prendre par exemple une suite de Fibonacci et l'appliquer un modulo en sortit
https://wikimedia.org/api/rest_v1/media/math/render/svg/0b6e8c6a4eecbbdb3a976f2a502fba620aae3be2

 

Ou des suites simples
https://wikimedia.org/api/rest_v1/media/math/render/svg/8e5c64e5830d332220bc6cc9fb310e20ec824dc7

 

En cryptographie on a recourt souvent a des registres à décallages gauches (LFSR)
On charge un nombre dans un de ces registres et on applique des décallages de bits successifs.

 

Pour éviter ce genre de phénomènes les générateurs peuvent prendre des entrées à valeur variables, comme par exemple le temps, l'heure actuel, l'état de la mémoire etc...

 

pour numpy voila un post qui décrit ton problème.

 

https://stackoverflow.com/questions [...] m-seed0-do

 

si tu changes numpy.random.seed(0) par numpy.random.seed(time)
tu obtiendras des suites différentes, voila.


Message édité par The_Kid le 10-07-2017 à 09:31:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed