J'utilise des séquences à faible écart depuis un certain temps pour les distributions uniformes, car j'ai trouvé leurs propriétés utiles (principalement en infographie pour leur apparence aléatoire et leur capacité à couvrir densément [0,1] de manière incrémentielle).
Par exemple, des valeurs aléatoires ci-dessus, des valeurs de séquence Halton ci-dessous:
J'envisageais de les utiliser pour une planification d'analyse financière, mais j'ai besoin de distributions différentes de celles d'uniforme. J'ai commencé à essayer de générer une distribution normale à partir de mes distributions uniformes via l'algorithme polaire de Marsaglia, mais les résultats ne semblent pas aussi bons qu'avec la distribution uniforme.
Un autre exemple, encore aléatoire au-dessus, Halton ci-dessous:
Ma question est la suivante: quelle est la meilleure méthode pour obtenir une distribution normale avec les propriétés que j'obtiens d'une séquence uniforme à faible écart - couverture, remplissage incrémentiel, non-corrélation sur plusieurs dimensions? Suis-je sur la bonne voie, ou devrais-je adopter une approche complètement différente?
(Code Python pour les distributions uniformes et normales que j'utilise ci-dessus: Gist 2566569 )
la source
Réponses:
Vous pouvez transformer des variables aléatoires en toute autre distribution en utilisant l'inverse du CDF, également appelé fonction de point de pourcentage. Il est implémenté dans as scipy.stats.norm.ppf .U(0,1)
scipy
la source
J'ai récemment trébuché sur ce problème. Naïvement, je pensais que toute transformation de l'uniforme fonctionnerait, alors j'ai branché une séquence 1D Sobol (et Halton) comme si la séquence où un générateur de nombres aléatoires dans une
std::normal_distribution<>
variable. À ma grande surprise, cela n'a pas fonctionné, il a évidemment généré une distribution non normale.Ok, alors j'ai pris la fonction Numérique Recettes Troisième Edition Chapitre 7.3.9
Normal_dev
pour générer des nombres normaux à partir des séquences de Sobol ou Halton par la méthode de "Ratio-d'uniformes" et cela a échoué de la même manière. Ensuite, je pense, ok, si vous regardez le code, il faut deux nombres aléatoires uniformes pour générer deux nombres aléatoires normalement distribués. Peut-être que si j'utilisais une séquence 2D Sobol (ou Halton), cela fonctionnerait. Eh bien, cela a encore échoué.Je me suis souvenu de la "méthode Box-Muller" (mentionnée dans les commentaires) et comme elle a une interprétation plus géométrique, j'ai pensé que cela pouvait fonctionner. Eh bien, cela a fonctionné! J'étais très excité de commencer à faire d'autres tests, la distribution semble normale.
Le problème que j'ai vu était que la distribution n'était pas meilleure qu'aléatoire, c'est-à-dire en termes de remplissage, donc j'étais un peu déçu, mais prêt à publier le résultat.
Ensuite, j'ai fait une recherche plus approfondie (maintenant que je savais quoi chercher), et il s'est avéré qu'il y avait déjà un article sur ce sujet: http://www.sciencedirect.com/science/article/pii/S0895717710005935
Dans cet article, il est en fait affirmé
La conclusion générale est donc la suivante:
1) Vous pouvez utiliser le Box-Muller sur des séquences 2D à faible discordance pour obtenir des séquences distribuées normalement. Mais mes quelques expériences semblent montrer que la faible différence / espace, par exemple les propriétés de remplissage, est perdue dans la séquence transformée normale.
2) Vous pouvez utiliser la méthode inverse, sans doute les propriétés de faible écart / remplissage d'espace seront préservées.
3) Le rapport d'uniformes ne peut pas être utilisé.
EDIT : Ce https://mathoverflow.net/a/144234 pointe vers les mêmes conclusions.
J'ai fait une illustration (la première figure (Ratio d'uniformes sur Sobol) montre que la distribution obtenue n'est pas normale mais les ohters (Box-Muller et aléatoire pour comparaison) le sont):
EDIT2:
Le point principal est que, même si vous trouvez une méthode qui peut transformer la "distribution" d'une séquence à faible écart, il n'est pas évident que vous conserverez les bonnes propriétés de remplissage. Vous n'êtes donc pas meilleur qu'avec une distribution normale vraiment aléatoire (standard). Je n'ai pas encore trouvé de méthode à faible divergence et pourtant elle se remplit bien avec une distribution non uniforme. Je parie qu'une telle méthode n'est pas évidente et peut-être un problème ouvert.
la source
Il existe deux bonnes méthodes. Tout d'abord, comme indiqué ci-dessus, une approximation précise de l'inverse de la distribution gaussienne peut être utilisée. Ensuite, on peut transformer n'importe quelle séquence à faible écart en gaussienne.
La deuxième méthode est le Box-Muller. Cette méthode nécessite deux numéros d'entrée (R et A) et génère deux sorties. Une séquence bidimensionnelle à faible écart est nécessaire. On prend (par exemple dans la séquence de Halton), des paires de nombres premiers sont utilisées, une pour la composante radiale (R) et une pour la composante angulaire (A). On obtient Sqrt (-2 * Log (R)) pour la composante radiale et Sin (2 * Pi * A) et Cos (2 * Pi * A) pour les composantes angulaires. La multiplication de la radiale par les deux composantes angulaires (séparément) donne deux Gaussiennes. L'efficacité est la même que ci-dessus; deux entrées quasi-aléatoires et deux sorties gaussiennes.
Toute séquence multidimensionnelle à faible écart peut être utilisée, selon la dimensionnalité du problème.
la source
La méthode la plus native serait en effet d'utiliser le CDF inverse pour se transformer en gaussien normal, mais il y a aussi un problème avec cela. Si vous avez par exemple un ensemble de points LDS créé par des réseaux de rang 1, alors ce serait que le point de départ est toujours (0,0), donc pour le transformer, vous avez besoin d'un petit décalage, mieux pour avoir le même écart que pour le coin (1,1).
Jusqu'à présent, aucun problème, mais pour une distribution gaussienne idéale, N (0,1) + N (0,1) devrait donner la même distribution que la différence. Cependant, ce ne serait pas le cas en utilisant LDS de réseau de rang 1 et iCDF sur chaque variable, car le point de départ dans chaque variable donnerait un certain iCDF, comme−3σ (en fonction de N), la différence serait donc −6σ .
Et c'est une valeur trop extrême, menant vraiment à une erreur systématique (par exemple, vous n'obtiendrez pas+6σ de l'autre côté). Inspectez mieux votre LDS transformé également pour la somme et les différences, vérifiez ces points extrêmes ainsi que l'inclinaison et le kurtosis.
la source