2012-05-18 3 views
6

Je voudrais calculer le pdf pour la distribution de Dirichlet en python, mais n'ai pas pu trouver le code pour le faire dans n'importe quel type de bibliothèque standard. scipy.stats inclut une longue liste de distributions mais ne semble pas inclure le Dirichlet, et numpy.random.mtrand en laisse un échantillon, mais ne donne pas le pdf.Calcul de pdf de la distribution de Dirichlet en python

Puisque le Dirichlet est assez commun, je me demande s'il y a un autre nom que je devrais rechercher par scipy.stats ou similaire, ou si je l'ai juste manqué d'une façon ou d'une autre.

Répondre

4

Je ne pourrais pas trouver un dans numpy, mais il a semblé assez pour implémenter. Voici un vilain petit one-liner. (J'ai suivi la fonction donnée sur Wikipedia, sauf que vous devez fournir x = [x1, ..., xk] et alpha = [a1, ..., ak]).

import math 
import operator 

def dirichlet_pdf(x, alpha): 
    return (math.gamma(sum(alpha))/
      reduce(operator.mul, [math.gamma(a) for a in alpha]) * 
      reduce(operator.mul, [x[i]**(alpha[i]-1.0) for i in range(len(alpha))])) 

Avertissement: Je n'ai pas testé cela. Laissez-moi savoir si cela fonctionne.

+0

Merci pour votre aide. J'avais l'intention d'écrire quelque chose de similaire si personne ne montrait un existant déjà quelque part. – jpmccoy

+0

Pour ceux qui voient cet article en 2016+, utilisez la solution scipy.stats ci-dessous! C'est maintenant ajouté. –

-1

Vous pouvez dériver la distribution de Dirichlet à partir de la distribution gamma. Ceci est montré sur le wikipedia page. Là vous trouvez ce code de python:

params = [a1, a2, ..., ak] 
    sample = [random.gammavariate(a,1) for a in params] 
    sample = [v/sum(sample) for v in sample] 
+0

C'est pour l'échantillonnage de la Dirichlet. Je veux le pdf. La formule pour le pdf est raisonnablement simple et je pourrais juste la mettre en application, mais si le Dirichlet se cache quelque part dans scipy ou semblable ce serait utile. – jpmccoy

-2

Je pense qu'il pourrait être inclus à numpy.random.mtrand.dirichlet mais je ne suis pas complètement sûr si c'est le pdf ou pour l'échantillonnage.

+0

c'est juste pour l'échantillonnage –

3

Au scipy version 0.15, vous pouvez utiliser scipy.stats.dirichlet.pdf (voir here)