emoc — 2009-05-11 16:43:02

Bonjour,

Je cherche des algorithmes de tirages aléatoires avec densités de répartition...

Une image valant un long discours :
En utilisant la fonction random() de processing on obtient une densité uniforme des valeurs, exemple avec un tirage aléatoire de 50 000 points :

http://codelab.fr/up/random-uniform.png

Mais il existe d'autres lois fixant la densité de répartition. En cherchant j'ai trouvé cet algorithme en ruby, qui applique une densité normale à la répartition. 2 variables supplémentaires, m et s définissent la zone de répartition : m correspond à la valeur médiane et s, l'écart par rapport à cette valeur médiane :
Par exemple avec m = 0 et s = 100, on obtient :

http://codelab.fr/up/random-normal-0-100.png

Avec m = 100 et s = 20

http://codelab.fr/up/random-normal-100-20.png

il y a différentes lois de densité (sur wikipedia : lois de densité), mais je ne sais pas lire ces formules..., quelqu'un saurait-il transformer ça en fonction?

Les images sont faites avec ce sketch :

Code (p5) :

void setup() {
  size(400,400);
  background(0); stroke(255);
  noLoop();
  
}

void draw() {
  for (int i =0; i < 50000; i++) {
    float a = random (-PI,PI);
    //float d = random_uniform(0, 180);
    float d = random_normal(0, 180, 100, 20);
    float x = 200 + (d * cos(a));
    float y = 200 + (d * sin(a));
    point(x,y);
  }
}

float random_uniform(float xmin, float xmax) {
  float x = random(xmin, xmax);
  return x;
}

float random_normal(float xmin, float xmax, float m, float s) {
  float x = (s * sqrt(-2.0 * log(random(.0001,1))) * cos(2.0 * PI * random(0,1))) + m;
  return x;
}
emoc — 2009-05-13 22:12:11

J'ai trouvé mon bonheur : colt une bibliothèque de fonctions scientifiques développée par le CERN, c'est du costaud, avec de nombreux modèles de distribution... et intégrable facilement à processing.

javadoc api : http://acs.lbl.gov/~hoschek/colt/api/index.html

Pour se faire une idée des distributions, le « Compendium of Common Probability Distributions » rend bien service, c'est remplie de formules qui me laissent froid, mais il y a aussi de bien belles courbes...

Quelques images pour tester différentes méthodes de distribution :

Distribution de Cauchy :

http://codelab.fr/up/random-cauchy.png

Exponentielle :

http://codelab.fr/up/random-exponential.png

Géométrique :

http://codelab.fr/up/random-geometric.png

Beta :

http://codelab.fr/up/random-beta.png

Beta :

http://codelab.fr/up/random-beta-2.png

juan — 2009-05-17 03:12:19

La solution qu'on utilise classiquement pour régler la densité de probabilité d'une variable selon une loi quelconque c'est du pseudo-Monté-Carlo: j'ai la fleme de faire un dessin mais imaginons une variable x entre a et b, suivant une ddp (densité de proba) entre 0 et 1: pour tout x, x a une proba de P(x).

P(x) peut être n'importe quelle fonction: une vraie loi statistique ou un bricolage: peu importe, il faut juste être capable de calculer P(x).

L'algo a la forme suivante:
On tire 100000 valeurs de x au hasard entre a et b
{
     on calcule p=P(x) // par n'importe quelle méthode, on s'en fout, mais on le calcule.
    {   
     on tire une valeur y au hasard entre 0 et 1
         si y<p
         {
              alors on garde ce point
              // sinon, on l'oublie
         } // fin si
    }---- fin du "on tire une valeur de y"
}---- fin du "on tire 1000 points"

AU FINAL: il ne reste pas 100000 points, mais une fraction suffisante pour que que ceux qu'on a retenus suivent la loi P(x) qu'on a décidé de leur faire suivre.

Staross — 2009-05-17 11:32:44

Ca rend assez bien en tout cas, on dirait un peu des patterns de diffraction :

http://media-2.web.britannica.com/eb-media/28/96828-004-644E46F6.jpg

http://upload.wikimedia.org/wikipedia/commons/archive/7/7d/20071104200851!X-ray_diffraction_pattern_3clpro.jpg

mfm — 2012-08-30 15:27:39

emoc a écrit:

J'ai trouvé mon bonheur : colt une bibliothèque de fonctions scientifiques développée par le CERN, c'est du costaud, avec de nombreux modèles de distribution... et intégrable facilement à processing.

javadoc api : http://acs.lbl.gov/~hoschek/colt/api/index.html

Bon, je déterre (à la pioche)… Mais voilà, cette library m'a l'air sympathique mais je n'arrive absolument pas à l'installer dans processing… (en suivant les démarches habituelles pour installer des library) :( Donc si tu te rappelles comment tu as fait, et si tu pouvais l'expliquer, ce serait formidable ! Merci.

emoc — 2012-08-30 16:08:25

Salut

Si je me souviens bien, il suffit de créer un répertoire "code" dans le répertorie de ton sketch et d'y placer le .jar de la library (même fonctionnement que le répertoire "data"). C'est une fonction qui est dans processing depuis longtemps (et j'espère qu'elle y est toujours!) mais plutôt mal documentée il me semble...

mfm — 2012-08-30 18:11:46

Merci, je vais essayer.

mfm — 2012-10-02 17:18:09

Bon, j'ai réussi en mettant le .jar dans processing/mode/java/librairies/colt/library

(en gras : ce sont les dossiers que j'ai créés.)

emoc — 2012-10-02 22:23:49

Bon, le principal, c'est que ça marche ;)
Je suppose que la structure des librairies a du changer dans la dernière version de processing, et comme elle avait déjà pas mal changé ces derniers temps...

mfm — 2012-10-02 22:41:51

Par contre j'ai du mal à utiliser les classes et méthodes de distributions (poisson, beta, etc.) de cette library… Te rappelles-tu si tu avais, pour coder tes images ci-dessus, utilisé les classes (ou méthode ?) de distribution ou si tu avais tout codé à la main ?