bn4r es una librería de redes bayesianas en Ruby que proporciona al usuario clases para crear redes bayesianas y varios algoritmos para resolverlas.
La implementación de los algoritmos está basada en: S.Russell, P.Norving, "Artificial Intelligence, A Modern Approach", 2nd Edition.
Página web: bn4r.rubyforge.org/es
Página web (versión inglesa): bn4r.rubyforge.org
Proyecto en Rubyforge: rubyforge.org/projects/bn4r
La librería consiste en el objeto BayesNet pensado para llenarse con objetos del tipo BayesNetNode, estos objetos están definidos en bn.rb. El objeto BayesNet es una especialización de RGL::DirectedAdjacencyGraph ( rgl.rubyforge.org ).
En el archivo bn_algorithms.rb está la implementación de los algorimos de inferencia que resuelven las estructuras BayesNet creadas con la librería.
Los archivos bn_export.rb y bn_import.rb contienen métodos para importar y exportar las redes bayesianas en varios formatos.
Finalmente se distribuyen unos métodos para rellenar automáticamente las tablas de probabilidades condicionadas de los nodos de la red bayesiana (BayesNetNode)
gem install bn4r
require 'bn4r'
# Create BayesNet
bn_aima = BayesNet.new
# Create nodes for the Bayes Net (BayesNetNodes)
burglary = BayesNetNode.new("Burglary")
earthquake = BayesNetNode.new("Earthquake")
alarm = BayesNetNode.new("Alarm")
john_calls = BayesNetNode.new("JohnCalls")
mary_calls = BayesNetNode.new("MaryCalls")
# Add nodes ( vertex ) to the BayesNet
bn_aima.add_vertex(burglary)
bn_aima.add_vertex(earthquake)
bn_aima.add_vertex(alarm)
bn_aima.add_vertex(john_calls)
bn_aima.add_vertex(mary_calls)
# Add relations ( edges ) between nodes in the BayesNet
bn_aima.add_edge(burglary,alarm)
bn_aima.add_edge(earthquake,alarm)
bn_aima.add_edge(alarm,john_calls)
bn_aima.add_edge(alarm,mary_calls)
# Assign probabilities to each node
burglary.set_probability_table([], [0.001, 0.999] )
earthquake.set_probability_table([], [0.002, 0.998] )
alarm.set_probability_table([burglary,earthquake], [0.95, 0.05, 0.94, 0.06, 0.29, 0.71, 0.001,0.999] )
john_calls.set_probability_table([alarm], [0.90,0.10,0.05,0.95])
mary_calls.set_probability_table([alarm], [0.70,0.30,0.01,0.99])
# John and Mary are calling ...
john_calls.set_value(true)
mary_calls.set_value(true)
# Why?
is_there_a_burglary = bn_aima.enumeration_ask( burglary, [john_calls, mary_calls] )
puts "Call the police!" if is_there_a_burglary[0] > is_there_a_burglary[1]
is_the_alarm_on = bn_aima.enumeration_ask( alarm, [john_calls, mary_calls] )
puts "Run home, your alarm is distubing the neigborhood!" if is_the_alarm_on[0] > is_the_alarm_on[1]
is_there_a_earthquake = bn_aima.enumeration_ask( earthquake, [john_calls, mary_calls] )
puts "Calm yourself, there isn't a earthquake ;)" if is_there_a_earthquake[0] < is_there_a_earthquake[1]
# In .dot format
bn_aima.to_dot
# In Microsoft Belief Networks (.xbn) format
# (download for free in: http://research.microsoft.com/adapt/MSBNx )
bn_aima.to_xbn
Se puede encontrar documentación en inglés en la dirección bn4r.rubyforge.org/rdoc o se puede generar con rdoc con el comando:
rdoc README lib
Gracias a Núria Bel ( www.upf.edu/pdi/iula/nuria.bel ) por su trabajo en este proyecto sin ella no se podría haber hecho.
Gracias a Ryan Dahl por su trabajo en www.math.rochester.edu/people/grads/rld/bayesnets, fue la idea base del proyecto.
También gracias a toda la comunidad Ruby.
Este trabajo esta desarrollado por Sergio Espeja ( www.upf.edu/pdi/iula/sergio.espeja, sergio.espeja en gmail.com ) principalmente en el Institut Universitari de Lingüística Aplicada de la Universitat Pompeu Fabra ( www.iula.upf.es ), y en bee.com.es ( bee.com.es ).
Es software libre y debe distribuirse bajo la licencia GPL.
Contactarme en rubyforge.org/projects/bn4r.