2012-05-18 21 views
6

Me gustaría calcular el pdf para la distribución de Dirichlet en python, pero no he podido encontrar el código para hacerlo en ningún tipo de biblioteca estándar. scipy.stats incluye una larga lista de distribuciones, pero no parece incluir el Dirichlet, y numpy.random.mtrand deja una muestra de él, pero no da el pdf.Calculando el pdf de la distribución de Dirichlet en python

Dado que el Dirichlet es bastante común, me pregunto si hay algún otro nombre que debería estar buscando en scipy.stats o similar, o si me lo he perdido de alguna manera.

Respuesta

4

No pude encontrar uno en numpy, pero parecía suficiente para implementarlo. Aquí hay un feo y pequeño trazador de líneas. (Seguí la función dada en Wikipedia, excepto que tiene que proporcionar x = [x1, ..., xk] y alfa = [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))])) 

Advertencia: No he comprobado esto. Déjame saber si funciona.

+0

Gracias por esto. Pensaba escribir algo similar si nadie apuntaba a uno ya existente en alguna parte. – jpmccoy

+0

Para aquellos que ven esta publicación en 2016+, ¡usen la solución scipy.stats a continuación! Ahora está agregado. –

-1

Puede derivar la distribución Dirichlet de la distribución gamma. Esto se muestra en el wikipedia page. Ahí encuentra este código python:

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

Eso es para el muestreo de la Dirichlet. Quiero el pdf. La fórmula para el pdf es razonablemente sencilla y podría implementarla, pero si el Dirichlet se oculta en algún lugar en scipy o similar, sería útil. – jpmccoy

-2

Creo que podría estar incluido en numpy.random.mtrand.dirichlet, pero no estoy completamente seguro de si es el pdf o para el muestreo.

+0

es solo para muestreo –

3

A partir de scipy version 0.15, puede utilizar scipy.stats.dirichlet.pdf (ver here)

Cuestiones relacionadas