2015-05-26 21 views
5

Muszę wykonać pewne wnioskowania na temat sieci bayesowskiej, takie jak przykład, który stworzyłem poniżej. Bayesian networkWnioskowanie w sieci bayesowskiej

Szukałem czegoś takiego jak to, aby rozwiązać takie wnioski, jak P (F | A = Prawda, B = Prawda). Moje pierwsze podejście było zrobić coś takiego

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 

Ale nie sądzę, że to będzie działać, ponieważ faktycznie musimy przejść przez wiele zmiennych na raz, nie każdy na raz.

Słyszałem o algorytmie Pearls do przekazywania wiadomości, ale jeszcze nie znalazłem odpowiedniego opisu, który nie jest wyjątkowo gęsty. Aby uzyskać dodatkowe informacje, te sieci bayesowskie są ograniczone, aby nie mieć więcej niż 15-20 węzłów i mamy wszystkie tabele prawdopodobieństwa warunkowego, kod nie musi być naprawdę szybki ani wydajny.

Zasadniczo szukam sposobu, aby to zrobić, niekoniecznie NAJLEPSZY sposób to zrobić.

+0

Czy Twój wykres jest tylko przykładem, czy zaobserwowano wszystkie najważniejsze zmienne? –

+0

Algorytm przekazywania komunikatów Pearl dotyczy tylko sieci bez pętli. Istnieją dokładne algorytmy dla sieci loopy zmiennych dyskretnych i Gaussa, ale nie są one proste. Moja rada to znaleźć oprogramowanie do wykonywania obliczeń, więc wszystko, co musisz zrobić, to wprowadzić opis sieci (zmienne, połączenia i tabele prawdopodobieństwa) i uruchomić zapytania. Dostępne są zarówno komercyjne, jak i niekomercyjne oprogramowanie; przepraszam, nie mam rekomendacji. –

+0

wykres był tylko przykładem, górne zmienne nie zawsze są ściśle przestrzegane – suphug22

Odpowiedz

0

Twój BN nie wydaje się być szczególnie skomplikowany i myślę, że powinieneś z łatwością uciec przy użyciu metody dokładnego wnioskowania, takiej jak algorytm drzewa połączeń. Oczywiście nadal można po prostu wyliczać brute force, ale byłoby to marnotrawstwem zasobów procesora, zważywszy, że istnieje tak wiele miłych bibliotek, które implementują inteligentniejsze sposoby wykonywania dokładnych i przybliżonych wniosków w modelach graficznych.

Ponieważ twój tag wspomina o C++, moją rekomendacją będzie libDAI. Jest to dobrze napisana biblioteka, która implementuje wiele dokładnych i przybliżonych wniosków na generycznych wykresach współczynników . Nie ma żadnych dziwnych zależności i jest bardzo łatwy do zintegrowania z projektem. Szczególnie dobrze nadaje się do dyskretnych przypadków, takich jak twoje, dla których masz tabele prawdopodobieństwa.

Teraz zauważyłeś, że wspomniałem o wykresach czynnikowych. Jeśli nie jesteś zaznajomiony z koncepcją, skieruję Cię do Wikipedia, ale zasada jest bardzo prosta. Powinieneś reprezentować swój BN jako wykres czynnikowy, a następnie libDAI zrobi dla ciebie wnioskowanie.

EDIT:

Ponieważ zasoby procesora nie wydaje się być problemem dla Ciebie i prostota jest kluczem, a nie, zawsze można iść z brutalnej siły wyliczenie. Pomysł jest prosty. Twoja sieć bayesowska reprezentuje wspólny rozkład prawdopodobieństwa, który możesz zapisać w postaci równania, np.

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

Zakładając, że masz tabel dla wszystkich rozkład warunkowy, tzn P(A|B, C)P(B|C) i P(C) następnie można po prostu przejść przez wszystkie możliwe wartości zmiennych A, B i C i obliczyć wynik.

+0

Dzięki za pomoc, nie chcę korzystać z zewnętrznych bibliotek, a sieci są dość proste, zastanawiałem się, czy mógłbyś wyjaśnić, co masz na myśli, kiedy mówisz dokładne metody wnioskowania, wciąż jestem bardzo nowy w tym temacie. Edycja - Nie martwię się, że jest to marnowanie zasobów procesora, ponieważ nie jest to część większego programu, tylko sam program i większość węzłów przyjmie tylko 2-3 zmienne, tj. Prawda, fałsz, może – suphug22

+0

Cóż, jeśli szukasz czegoś bardzo prostego, możesz po prostu wykonać wyliczenie brutalnej siły, które sam sobie zasugerowałeś. Zrób to i wróć tutaj, jeśli zajmie to zbyt dużo czasu :) –

+0

Proszę zobaczyć moją edycję –

Powiązane problemy