2015-05-26 9 views
5

Ich muss einige Rückschlüsse auf ein Bayes-Netzwerk vornehmen, wie das Beispiel, das ich unten erstellt habe. Bayesian networkInferenz in einem Bayes-Netzwerk

Ich habe versucht, etwas wie so etwas zu tun, um eine Inferenz wie P zu lösen (F | A = True, B = True). Mein erster Ansatz war so etwas wie

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 

zu tun, aber ich glaube nicht, das wird funktionieren, weil wir tatsächlich benötigen, um viele Variablen auf einmal durchgehen, nicht jeder zu einer Zeit.

Ich habe über Pearls-Algorithmus für die Weitergabe von Nachrichten gehört, bin aber noch eine angemessene Beschreibung zu finden, die nicht extrem dicht ist. Für zusätzliche Informationen sind diese Bayes-Netzwerke so eingeschränkt, dass sie nicht mehr als 15-20 Knoten haben, und wir haben alle bedingten Wahrscheinlichkeitstabellen, der Code muss nicht wirklich schnell oder effizient sein.

Grundsätzlich suche ich nach einem Weg, dies zu tun, nicht unbedingt der beste Weg, dies zu tun.

+0

Ist Ihr Graph nur ein Beispiel oder werden alle Top-Variablen beobachtet? –

+0

Pearls Message-Passing-Algorithmus gilt nur für Netzwerke ohne Schleifen. Es gibt exakte Algorithmen für loopyy Netze von diskreten und Gaußschen Variablen, aber sie sind nicht einfach. Mein Rat ist, eine Software zu finden, die die Berechnungen durchführt. Sie müssen lediglich die Netzwerkbeschreibung (Variablen, Verbindungen und Wahrscheinlichkeitstabellen) eingeben und die Abfragen ausführen. Dazu gibt es sowohl kommerzielle als auch nichtkommerzielle Software; Entschuldigung, ich habe keine Empfehlung. –

+0

das Diagramm war nur ein Beispiel, die oberen Variablen werden nicht immer genau beobachtet – suphug22

Antwort

0

Ihr BN scheint nicht besonders komplex zu sein und ich denke, Sie sollten mit der Methode der exakten Inferenz, wie dem Junction-Tree-Algorithmus, leicht davonkommen. Natürlich können Sie immer noch Brute-Force-Enumeration durchführen, aber das wäre eine Verschwendung von CPU-Ressourcen, da es so viele schöne Bibliotheken gibt, die intelligentere Methoden zur genauen und ungefähren Inferenz in grafischen Modellen implementieren.

Da Ihr Tag C++ erwähnt, wäre meine Empfehlung libDAI. Es ist eine gut geschriebene Bibliothek, die mehrere exakte und ungefähre Rückschlüsse auf generische Faktorgraphen implementiert. Es hat keine seltsamen Abhängigkeiten und ist sehr einfach in Ihr Projekt zu integrieren. Es eignet sich besonders gut für diskrete Fälle wie Ihre, für die Sie die Wahrscheinlichkeitstabellen haben.

Jetzt haben Sie bemerkt, dass ich Faktorgraphen erwähnt habe. Wenn Sie mit dem Konzept nicht vertraut sind, werde ich Sie auf Wikipedia verweisen, aber das Prinzip ist sehr einfach. Sie sollten Ihre BN als Faktorgraphen darstellen und dann wird libDAI die Schlussfolgerung für Sie treffen.

EDIT:

Da CPU-Ressourcen nicht ein Problem für Sie zu sein scheinen und Einfachheit ist der Schlüssel, stattdessen können Sie immer mit Brute-Force-Enumeration gehen. Die Idee ist einfach. Ihr Bayes-Netzwerk stellt eine gemeinsame Wahrscheinlichkeitsverteilung dar, die Sie in Form einer Gleichung aufzeichnen können, z.

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

Unter der Annahme, dass Sie Tabellen für alle bedingte Wahrscheinlichkeitsverteilungen haben, das heißt P(A|B, C)P(B|C) und P(C) dann können Sie einfach gehen über alle möglichen Werte der Variablen A, B und C und die Ausgabe berechnen.

+0

Danke für die Hilfe, ich suche keine externen Bibliotheken zu verwenden, und die Netzwerke sind ziemlich einfach. Ich habe mich gefragt, ob Sie das, was Sie meinen, sagen, wenn Sie exakte Inferenzmethoden sagen, ich bin immer noch sehr neu in diesem Thema. bearbeiten - Ich mache mir keine Sorgen darüber, dass es eine Verschwendung von CPU-Ressourcen ist, da dies nicht Teil eines größeren Programms ist, nur das Programm selbst und die meisten Knoten nehmen nur 2-3 Variablen dh wahr, falsch, vielleicht – suphug22

+0

Nun, wenn Sie nach etwas sehr sehr einfach suchen, können Sie einfach eine Brute-Force-Enumeration, die Sie selbst vorgeschlagen haben. Mach das und komm zurück, wenn es zu viel Zeit braucht :) –

+0

Bitte sehe meine Bearbeitung –