2015-05-26 73 views
5

Devo eseguire alcune inferenze su una rete bayesiana, come nell'esempio che ho creato di seguito. Bayesian networkInferenza in una rete bayesiana

stavo guardando facendo qualcosa di simile qualcosa di simile per risolvere una deduzione come P (F | A = True, B = True). Il mio approccio iniziale era di fare qualcosa di simile

For every possible output of F 
    For every state of each observed variable (A,B) 
    For every unobserved variable (C, D, E, G) 
     // Calculate Probability 

Ma io non credo che questo funzionerà perché abbiamo effettivamente bisogno di andare oltre molte variabili in una sola volta, non ogni volta.

Ho sentito parlare dell'algoritmo di Pearls per il passaggio di messaggi, ma devo ancora trovare una descrizione ragionevole che non sia estremamente densa. Per ulteriori informazioni, queste reti bayesiane sono vincolate in modo da non avere più di 15-20 nodi, e abbiamo tutte le tabelle di probabilità condizionale, il codice non deve essere veramente veloce o efficiente.

Fondamentalmente sto cercando un modo per farlo, non necessariamente il modo migliore per farlo.

+0

Il tuo grafico è solo un esempio o tutte le principali variabili sono state osservate? –

+0

L'algoritmo di passaggio dei messaggi di Pearl si applica solo alle reti senza loop. Esistono algoritmi esatti per reti loopy di variabili discrete e gaussiane, ma non sono semplici. Il mio consiglio è di trovare del software per fare i calcoli, quindi tutto ciò che devi fare è inserire la descrizione della rete (variabili, connessioni e tabelle di probabilità) ed eseguire le query. Ci sono sia software commerciali che non commerciali per questo; scusa, non ho una raccomandazione. –

+0

il grafico era solo un esempio, le variabili principali non sono sempre strettamente osservate – suphug22

risposta

0

Il tuo BN non sembra particolarmente complesso e penso che dovresti riuscire a farla franca con il metodo di inferenza esatta, come l'algoritmo dell'albero di giunzione. Naturalmente, si può ancora fare l'enumerazione della forza bruta, ma sarebbe uno spreco di risorse della CPU dato che ci sono così tante belle librerie là fuori che implementano modi più intelligenti di fare l'inferenza esatta e approssimativa nei modelli grafici.

Poiché il tag menziona C++, la mia raccomandazione è libDAI. È una libreria ben scritta che implementa inferenze multiple esatte e approssimative su generici diagrammi fattoriali. Non ha strane dipendenze ed è molto facile da integrare nel tuo progetto. È particolarmente adatto per casi discreti, come i tuoi, per i quali hai le tabelle delle probabilità.

Ora, hai notato che ho menzionato i grafici dei fattori. Se non hai familiarità con il concetto, ti rimanderò a Wikipedia, ma il principio è molto semplice. Dovresti rappresentare il tuo BN come un fattore grafico e quindi libDAI farà l'inferenza per te.

EDIT:

Dal momento che le risorse della CPU non sembrano essere un problema per voi e la semplicità è la chiave, invece, si può sempre andare con la forza bruta di enumerazione. L'idea è semplice. La tua rete bayesiana rappresenta una distribuzione di probabilità congiunta, che puoi scrivere in termini di equazione, ad es.

P(A,B,C) = P(A|B,C) * P(B|C) * P(C) 

Supponendo di avere le tabelle per tutte le distribuzioni di probabilità condizionale, cioè P(A|B, C)P(B|C) e P(C) allora si può semplicemente andare oltre tutti i possibili valori delle variabili A, B, e C e calcolare l'uscita.

+0

Grazie per l'aiuto, sto cercando di non usare librerie esterne, e le reti sono abbastanza semplici, mi stavo chiedendo se potessi elaborare quello che intendi quando dici metodi di inferenza esatta, sono ancora molto nuovo sull'argomento. modifica - Non sono preoccupato che si tratti di uno spreco di risorse della CPU poiché questo non fa parte di un programma più grande, solo il programma stesso e la maggior parte dei nodi prenderà solo 2-3 variabili, cioè vero, falso, forse – suphug22

+0

Beh, se stai cercando qualcosa di molto semplice, puoi semplicemente fare un'enumerazione di forza bruta che hai suggerito tu stesso. Fallo e torna qui se ci vuole troppo tempo :) –

+0

Vedi la mia modifica –