Considérons un petit paramètre de forme près de 0, tel que . Dans la plage comprise entre 0 et , est d'environ , donc le pdf Gamma est d'environ . Cela peut être intégré à un CDF approximatif, . En l'inversant, nous voyons une puissance : un énorme exposant. Pour cela entraîne un risque de sous-dépassement (une valeur de double précision inférieure à , plus ou moins). Voici un graphique de la chance d'obtenir un dépassement de capacité en fonction du logarithme en base dix deα = 1 / 100 α e - α 1 x α - 1 d x / Γ ( α ) F de ( la x ) = x ααα=1/100αe−α1xα−1dx/Γ(α) 1/αα=1/10010-300αFα(x)=xααΓ(α)1/αα=1/10010−300α :
Une solution consiste à exploiter cette approximation pour générer des variables log (Gamma): en effet, essayez de générer une variable Gamma et si elle est trop petite, générez son logarithme à partir de cette distribution de puissance approximative (comme illustré ci-dessous). (Effectuez cette opération à plusieurs reprises jusqu'à ce que le journal se trouve dans la plage de sous-dépassement, afin qu'il soit un substitut valide pour la variable de sous-flux d'origine.) Pour le calcul de Dirichlet, soustrayez le maximum de tous les logarithmes de chacune des valeurs de journal: cela redimensionne implicitement tous le gamma varie donc il n'affectera pas les valeurs de Dirichlet. Traitez tout journal résultant qui est trop petit (par exemple, moins de -100) comme étant le journal d'un vrai zéro. Exponentiate les autres journaux. Vous pouvez maintenant continuer sans débordement.
Cela va prendre encore plus de temps qu'auparavant, mais au moins ça marchera!
Pour générer une variable Gamma logarithmique approximative avec le paramètre de forme , précalculez . C'est facile, car il existe des algorithmes pour calculer directement les valeurs du journal Gamma . Générer un flotteur aléatoire uniforme entre 0 et 1, prendre son logarithme, diviser par , et ajouter à elle.C = log ( Γ ( α ) ) + log ( α ) α CαC=log(Γ(α))+log(α)αC
Étant donné que le paramètre d'échelle ne fait que redimensionner la variable, il n'y a aucun problème à l'adapter dans ces procédures. Vous n'en avez même pas besoin si tous les paramètres d'échelle sont identiques.
Éditer
Dans une autre réponse, l'OP décrit une méthode dans laquelle la puissance d'une variable uniforme (une variable ) est multipliée par une variable . Cela fonctionne car le pdf de la distribution conjointe de ces deux variables est égal à . Pour trouver le pdf de nous substituons , divisons par le jacobéen et intégrons . L'intégrale doit aller de à car , d'où1/αB(α)Γ(α+1)(αxα−1)(yαe−ydy/Γ(α+1))z=xyy→z/xxxz∞0≤y≤1
pdf(z)=αΓ(α+1)∫∞z(xα/x)e−x(z/x)α−1dxdz=1Γ(α)zα−1e−zdz,
qui est le pdf d'une distribution .Γ(α)
Le fait est que lorsque , une valeur tirée de est peu susceptible de dépasser et en sommant son log et fois le log d'une variable uniforme indépendante, nous aura le journal d'une variable . Le journal est probablement très négatif, mais nous aurons contourné la construction de son antilog, qui débordera dans une représentation en virgule flottante.0<α<1Γ(α+1)1/αΓ(α)