python-3.x - scikit - naive bayes python
Crea una red bayesiana y aprende parĂ¡metros con Python3.x (4)
Estoy buscando la herramienta más adecuada para python3.x en Windows para crear una Red Bayesiana, conocer sus parámetros a partir de los datos y realizar la inferencia.
La estructura de red quiero definirme de la siguiente manera:
Se toma de this papel.
Todas las variables son discretas (y pueden tomar solo 2 estados posibles) excepto "Tamaño" y "GraspPose", que son continuas y deben modelarse como Mezcla de Gaussianos.
Los autores utilizan el algoritmo de Expectativa-Maximización para aprender los parámetros de las tablas de probabilidad condicional y el algoritmo de árbol de unión para calcular la inferencia exacta.
Según tengo entendido, todo se realizó en MatLab con Bayes Net Toolbox de Murphy.
Intenté buscar algo similar en python y aquí están mis resultados:
- Python Bayesian Network Toolbox http://sourceforge.net/projects/pbnt.berlios/ ( http://pbnt.berlios.de/ ). El sitio web no funciona, el proyecto no parece ser compatible.
- BayesPy https://github.com/bayespy/bayespy Creo que esto es lo que realmente necesito, pero no encuentro algunos ejemplos similares a mi caso para entender cómo abordar la construcción de la estructura de la red.
PyMC parece ser un módulo poderoso, pero tengo problemas para importarlo en Windows 64, python 3.3. Recibo error cuando instalo la versión de desarrollo
ADVERTENCIA (theano.configdefaults): g ++ no detectado! Theano no podrá ejecutar implementaciones C optimizadas (tanto para la CPU como para la GPU) y usará de forma predeterminada las implementaciones de Python. El rendimiento será severamente degradado. Para eliminar esta advertencia, configure Theano flags cxx en una cadena vacía.
ACTUALIZAR:
- libpgm ( http://pythonhosted.org/libpgm/ ). Exactamente lo que necesito, desafortunadamente no es compatible con Python 3.x
- Muy interesante biblioteca en desarrollo activo: PGMPY. Desafortunadamente, las variables continuas y el aprendizaje a partir de datos todavía no son compatibles https://github.com/pgmpy/pgmpy/
Cualquier consejo y ejemplos concretos serán muy apreciados.
Estaba buscando una biblioteca similar, y encontré que la granada es buena. Gracias
Aquí hay un ejemplo de cómo usarlo.
from pomegranate import *
import numpy as np
mydb=np.array([[1,2,3],[1,2,4],[1,2,5],[1,2,6],[1,3,8],[2,3,8],[1,2,4]])
bnet = BayesianNetwork.from_samples(mydb)
print(bnet.node_count())
print(bnet.probability([[1,2,3]]))
print (bnet.probability([[1,2,8]]))
Para el problema g ++ de pymc, recomiendo encarecidamente que se realice la instalación de g ++, aumentaría enormemente el proceso de muestreo; de lo contrario, tendrá que vivir con esta advertencia y permanecer allí durante 1 hora para un proceso de muestreo de 2000.
La manera de solucionar el problema es: 1. instalar g ++, descargar cywing y instalar g ++, puede buscarlo en Google. Para verificar esto, solo ve a "cmd" y escribe "g ++", si dice "requiere archivo de entrada", genial, tienes g ++ instalado. 2. Instala el paquete python: mingw, libpython 3. instala el paquete python: theano
Esto debería solucionar este problema.
Actualmente estoy trabajando en el mismo problema contigo, ¡buena suerte!
Parece que la pomegranate se actualizó recientemente para incluir las redes bayesianas. No lo he intentado yo mismo, pero la interfaz se ve bien y es bastante clara.
Tarde en la fiesta, como siempre, pero envolví la API de Java de BayesServer con JPype; Es posible que no tenga todas las funciones que necesita, pero podría crear la red anterior utilizando algo como:
from bayesianpy.network import Builder as builder
import bayesianpy.network
nt = bayesianpy.network.create_network()
# where df is your dataframe
task = builder.create_discrete_variable(nt, df, ''task'')
size = builder.create_continuous_variable(nt, ''size'')
grasp_pose = builder.create_continuous_variable(nt, ''GraspPose'')
builder.create_link(nt, size, grasp_pose)
builder.create_link(nt, task, grasp_pose)
for v in [''fill level'', ''object shape'', ''side graspable'']:
va = builder.create_discrete_variable(nt, df, v)
builder.create_link(nt, va, grasp_pose)
builder.create_link(nt, task, va)
# write df to data store
with bayesianpy.data.DataSet(df, bayesianpy.utils.get_path_to_parent_dir(__file__), logger) as dataset:
model = bayesianpy.model.NetworkModel(nt, logger)
model.train(dataset)
# to query model multi-threaded
results = model.batch_query(dataset, [bayesianpy.model.QueryModelStatistics()], append_to_df=False)
No estoy afiliado al servidor Bayes, y el envoltorio de Python no es "oficial" (puede usar la API de Java directamente a través de Python). Mi envoltorio hace algunas suposiciones y coloca limitaciones en funciones que no uso mucho. El repositorio está aquí: github.com/morganics/bayesianpy