No project description provided
Project description
Inteligencia Artificial: Laboratorio 2 - Inferencia Probabilistica
Descripcion
La clase BayesianNetworkx representa una red bayesiana, un modelo probabilístico que se utiliza en el aprendizaje automático para representar la dependencia entre variables. La clase tiene métodos para agregar nodos a la red, comprobar que la red esté completamente descrita, imprimir la red en forma compacta y en forma de factores, y calcular la probabilidad de un nodo dado un conjunto de evidencia.
-
add_node()
: permite agregar nodos a la red, especificando el nombre del nodo, los padres del nodo y la tabla de probabilidad condicional. -
check_model()
: verifica que cada probabilidad en las tablas de probabilidad condicional sumen 1 y que las probabilidades calcuadas sean iguales a las de la tabla con una tolerancia de 0.01. Retorna un booleano:
True
get_compact()
: imprime la representacio de la red bayesiana en forma compacta. Retorna un string de la siguiente manera:
P(R,T,A,J,M) = P(R)P(T)P(A|R,T)P(J|A)P(M|A)
get_factors()
: Imprime todos los factores de la red bayesiana. Retorna un string de la siguiente manera:
[('P(R)', '', '', ''), ('', 'R(0)', 0.999, ''), ('', 'R(1)', 0.001, ''), ('', '', '', ''), ('P(T)', '', '', ''), ('', 'T(0)', 0.998, ''), ('', 'T(1)', 0.002, ''), ('', '', '', ''), ('P(A|R, T)', '', '', ''), ('', '0, 0', 0.999, 0.001), ('', '0, 1', 0.71, 0.29), ('', '1, 0', 0.06, 0.94), ('', '1, 1', 0.05, 0.95), ('P(J|A)', '', '', ''), ('', '0', 0.95, 0.05), ('', '1', 0.1, 0.9), ('P(M|A)', '', '', ''), ('', '0', 0.99, 0.01), ('', '1', 0.3, 0.7)]
- Se puede mencionar que
get_factors()
tiene una funcion ayudante llamadaprint_factors(factors)
, la cual sirve para poder imprimir los factores en formato de una tabla para que se vea mas ordenado. Esta funcion toma como parametros todos los facotores que se obtienen enget_factors()
y los imprime de la siguiente manera:
+-----------+----------+-------+-------+
| var | phi(var) | P(0) | P(1) |
+-----------+----------+-------+-------+
| P(R) | | | |
+-----------+----------+-------+-------+
| | R(0) | 0.999 | |
+-----------+----------+-------+-------+
| | R(1) | 0.001 | |
+-----------+----------+-------+-------+
| | | | |
+-----------+----------+-------+-------+
| P(T) | | | |
+-----------+----------+-------+-------+
| | T(0) | 0.998 | |
+-----------+----------+-------+-------+
| | T(1) | 0.002 | |
+-----------+----------+-------+-------+
| | | | |
+-----------+----------+-------+-------+
| P(A|R, T) | | | |
+-----------+----------+-------+-------+
| | 0, 0 | 0.999 | 0.001 |
+-----------+----------+-------+-------+
| | 1 | 0.1 | 0.9 |
+-----------+----------+-------+-------+
| P(M|A) | | | |
+-----------+----------+-------+-------+
| | 0 | 0.99 | 0.01 |
+-----------+----------+-------+-------+
| | 1 | 0.3 | 0.7 |
+-----------+----------+-------+-------+
enumaration_ask(variables, evidence)
: Imprime la probabilidad de distribucion de una variable, dado evidencia de otras variables de la red. El parametro de variables, es una lista de las variables de quines obtener los resultados. Y el parametro evidence es un diccionario que contiene los valores de las variables dadas. Ejemplo:bn.enumaration_ask("R", {"J": 1, "M": 1})
Retorna un string de la siguiente manera:
defaultdict(<class 'float'>, {0: 0.716, 1: 0.284})
- Es bueno mencionar que la funcion enumaration_ask() no funciona por si sola, pero que tiene metodos ayudantes para poder encontrar la inferencia exacta y poder imprimirla de una manera mas visualmente llamativa.
enumaration_all(variables, evidence)
: Este es el metodo ayudante recursivo, el cual es el responable de poder encontrar la inferencia exacta usando el algoritmo de enumeracion.normalize(Q)
: Este metodo es el responsable de poder normalizar la probabilidad de distribucion, la cual es representeada como un diccionario.print_result(result)
: Este metodo es el responable de poder imprimir el resultado de una manera mas ordenada y facil de entender. Este meotodo es el que llama a todos los demas metodos para poder realizar lo que se quiere y logra imprimir el resultado de la siguiente manera:
+------+----------+
| R | phi(R) |
+======+==========+
| R(0) | 0.716 |
+------+----------+
| R(1) | 0.284 |
+------+----------+
Uso
- Se debe de importar la libreria bayesiannetworkx.
import bayesiannetworkx as bnx
- Para crear una instancia de la red, no se necesita ningun parametro.
bn = bnx.BayesianNetworkx()
- La red se arma a la hora de crear los nodos y agregarlos a la red. Un nodo consiste de un nombre, una lista de padres, y un diccionario con la tabla de probabilidades. Un nodo tiene que seguir el siguiente formato:
node = {
"name": name,
"parents": parents,
"cpt": cpt,
}
Creando y agregando un nodo sin padres.
bn.add_node("R", [], {(): [0.999, 0.001]})
Creando y agregando un nodo con padres.
bn.add_node("A", ["R", "T"], {(0, 0): [0.999, 0.001], (0, 1): [0.71, 0.29], (1, 0): [0.06, 0.94], (1, 1): [0.05, 0.95]})
- Finalmente, la red esta creada, y se puede utilizar cualquiera de las funciones mencionadas anteriormente para poder obtener la informacion y probabilidades de la red bayesiana.
Ejemplo
El siguiente codigo muestra el clasico ejemplo de la alarma. Para este ejemplo debemos de considerar un par de cosas.
- Tenemos una alarma antirrobo instalada en una casa.
- La alarma salta normalmente con la presencia de ladrones.
- Pero tambien cuando ocurren temblores de tierra.
- Tenemos dos vecinos en la casa, Juan y Maria, que han prometido llamar a la policia si oyen la alarma.
- Juan y Mara podrian no llamar aunque la alarma sonara: por tener musica muy alta en su casa, por ejemplo.
- Incluso podran llamar aunque no hubiera sonado: por confundirla con un telefono, por ejemplo.
Con esta informacion, ya podemos armar la red bayesiana. Siendo "R" el nodo del robo, "T" el nodo del temblor, "A" el nodo de la alarma, "J" el nodo de Juan y "M" el nodo de Maria.
import bayesiannetworkx as bnx
bn = bnx.BayesianNetworkx()
bn.add_node("R", [], {(): [0.999, 0.001]})
bn.add_node("T", [], {(): [0.998, 0.002]})
bn.add_node("A", ["R", "T"], {(0, 0): [0.999, 0.001], (0, 1): [0.71, 0.29], (1, 0): [0.06, 0.94], (1, 1): [0.05, 0.95]})
bn.add_node("J", ["A"], {(0,): [0.95, 0.05], (1,): [0.1, 0.9]})
bn.add_node("M", ["A"], {(0,): [0.99, 0.01], (1,): [0.3, 0.7]})
print(bn.check_model())
print(bn.get_compact())
bn.print_factors(bn.get_factors())
bn.print_result("R", {"J": 1, "M": 1})
Este codigo retorna el siguiente resultado dada la variable y la evidencia en print_result("R", {"J": 1, "M": 1})
:
+------+----------+
| R | phi(R) |
+======+==========+
| R(0) | 0.716 |
+------+----------+
| R(1) | 0.284 |
+------+----------+
Autor
Javier Mombiela
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file bayesiannetworkx-0.0.7.tar.gz
.
File metadata
- Download URL: bayesiannetworkx-0.0.7.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c0743b65882316e1327086638498f7e5f35649c80e847e2e3630ed1c03b246e |
|
MD5 | 037798c12b4e19e7434244f288272462 |
|
BLAKE2b-256 | 35883320ab14c545a755f56f2103f3f5165054fca9bafdabb8747e745ce5f24d |
File details
Details for the file bayesiannetworkx-0.0.7-py3-none-any.whl
.
File metadata
- Download URL: bayesiannetworkx-0.0.7-py3-none-any.whl
- Upload date:
- Size: 5.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5e78babbdb6f08ca307ee741b5a0ae583dcaa57d9cf07c435899d7717bd99897 |
|
MD5 | daccf0291974de6e6cba2b406684b2d0 |
|
BLAKE2b-256 | bdd70495fb1768910985737f43c3733353ee5b58d0231b83f4254394f6a824e1 |