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 :
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 :
Avec m = 100 et s = 20
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 :
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; }
Hors ligne
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 :
Exponentielle :
Géométrique :
Beta :
Beta :
Hors ligne
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.
Hors ligne
Ca rend assez bien en tout cas, on dirait un peu des patterns de diffraction :
Hors ligne
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.
Hors ligne
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...
Hors ligne
Merci, je vais essayer.
Hors ligne
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.)
Hors ligne
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...
Hors ligne
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 ?
Hors ligne
Pages: 1