¿Qué combinación de estructuras de datos almacena eficientemente redes Bayesianas discretas?


22

Entiendo la teoría detrás de las redes bayesianas, y me pregunto qué se necesita para construir una en la práctica. Digamos para este ejemplo, que tengo una red Bayesiana (dirigida) de 100 variables aleatorias discretas; cada variable puede tomar uno de hasta 10 valores.

¿Debo almacenar todos los nodos en un DAG y para cada nodo almacenar su Tabla de probabilidad condicional (CPT)? ¿Hay otras estructuras de datos que debería utilizar para garantizar un cálculo eficiente de los valores cuando cambian algunos CPT (aparte de los utilizados por un DAG)?


Estoy usando en la base de datos sqlite de memoria para almacenar tablas de CP, ya que se espera que los DB tengan algoritmos y estructuras de datos eficientes para manejar tablas. ¡Funciona bien! :)
Pratik Deoghare

Defina qué quiere decir con eficiente (memoria, rendimiento, etc.) e incluya sus limitaciones. Sin ellos, esto podría terminar fácilmente en un concurso para los más eficientes que se degradará a un código críptico con el que nunca querría tener que lidiar en el trabajo diario.
Justin Bozonier

1
@JustinBozonier requiere menos memoria y es rápido?
Pratik Deoghare

Respuestas:


12

La "mejor" estructura de datos probablemente depende del problema particular que intente resolver con ella. Aquí hay un enfoque que he visto (y que he usado yo mismo), que simplemente almacena toda la información y deja al algoritmo qué hacer con ella.

  1. Primero indexa los nodos por enteros únicos, de 0 a n-1. Luego, simplemente almacena, para cada nodo, la lista de sus padres como una matriz de enteros --- en C ++, por ejemplo, podría tener un std::vector<std::vector<int> >: primer vector sobre nodos, el segundo vector enumera los respectivos padres). Eso captura toda la estructura DAG.

  2. Además, dado que cada nodo tiene exactamente una tabla de probabilidad condicional asociada, puede indexar aquellos con las mismas ID de enteros. Para cada tabla de probabilidad, necesita almacenar su alcance, es decir, el conjunto de variables aleatorias sobre las que se define. En segundo lugar, probablemente tendría una gran lista de números de coma flotante que contiene las probabilidades condicionales reales (y querrá asegurarse de obtener la indexación correcta). Para dar un ejemplo de C ++ nuevamente, algo como esto podría hacer:

    struct CondProbTable {
        std::vector<int> scope;    // list of random variables the CPT is defined over
        std::vector<double> table; // appropriately sized and indexed table of
                                   // conditional probabilities
    };
    

    Con eso, puede usar a std::vector<CondProbTable>para almacenar todos sus CPT.

Nuevamente, esto básicamente solo almacena la red Bayes, no supone nada sobre lo que desea hacer con ella. Incluir el alcance de CPT en CondProbTable es algo redundante, ya que podría inferirse de la lista de nodos principales que se describe en el punto 1.


0

Básicamente, las CPT discretas son hipermatrices, y debe observarlas de esta manera.

Una forma bastante común de representar una hipermatriz es usar una tabla hash usando el índice de cadena. por ejemplo, en 2 dimensiones t [1] [2] sería t.get ("1_2")

Son posibles soluciones más eficientes en memoria: si la hipermatriz es escasa, puede usar una representación escasa especial (por ejemplo, Fuchs 72), si tiene estructura, puede usar ADD (diagrama de decisión algrebraico) o reglas basadas en la lógica.

Su última pregunta no está muy clara, sin embargo, si esperaba que su CPT cambiara con frecuencia, probablemente sea mejor con una representación plana del CPT con una tabla o una tabla hash.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.