Poniżej przedstawiony jest przykład modelu graficznego sieci. Mokra trawa(atrybut WetGrass) jest bezpośrednio uzależniona od dwóch czynników: czy został załączony zraszacz (Sprinkler) oraz od tego czy padał deszcz (Rain). Te dwa czynniki są uzależnione od pochmurności ( atrybut Cloudy). Zgodnie z relacją przechodnią, mokra trawa jest pośrednio zależna od pochmurności. Każdy z atrybutów ma dwie opcje: może zajść lub nie może zajść (T i F). Dla każdej kombinacji przedstawione jest prawdopodobieństwo wystąpienia takiego zdarzenia.
Dajmy na to, że chcemy obliczyć z jakim prawdopodobieństwem padał deszcz (Rain(R)=T) przy zaistnieniu (zaobserwowaniu) mokrej trawy (atrybut WetGrass(W)= T). Czyli mamy do czynienia z prawdopodobieństwem warunkowym P(R|W=T).
Do implementacji takiego modelu z pomocą przychodzi nam projekt o naziwe Infer.NET. Służy on m.in. do wnioskowania dla bayesowskiego modelu graficznego. Implementacja przedstawiona jest poniżej:
#region implementacja modelu //pochmurnie Variable<bool> cloudy = Variable.Bernoulli(0.5); // spryskiwacz Variable<bool> sprinkler = Variable.New<bool>(); using (Variable.If(cloudy)) sprinkler.SetTo(Variable.Bernoulli(0.1)); using (Variable.IfNot(cloudy)) sprinkler.SetTo(Variable.Bernoulli(0.5)); // deszcz Variable<bool> rain = Variable.New<bool>(); using (Variable.If(cloudy)) rain.SetTo(Variable.Bernoulli(0.8)); using (Variable.IfNot(cloudy)) rain.SetTo(Variable.Bernoulli(0.2)); // mokra trawa Variable<bool> wetGrass = Variable.New<bool>(); using (Variable.If(sprinkler)) { using (Variable.If(rain)) wetGrass.SetTo(Variable.Bernoulli(0.99)); using (Variable.IfNot(rain)) wetGrass.SetTo(Variable.Bernoulli(0.9)); } using (Variable.IfNot(sprinkler)) { using (Variable.If(rain)) wetGrass.SetTo(Variable.Bernoulli(0.9)); using (Variable.IfNot(rain)) wetGrass.SetTo(Variable.Bernoulli(0.0)); } #endregion #region wnioskowanie wetGrass.ObservedValue = true; //mokra trawa InferenceEngine ie = new InferenceEngine(); ie.ShowProgress = false; Console.WriteLine("P(deszcz | trawa jest mokra)=" + ie.Infer(rain)); Console.WriteLine("P(spryskiwacz | trawa jest mokra)=" + ie.Infer(sprinkler)); cloudy.ObservedValue = false; //nie jest pochmurnie Console.WriteLine("P(deszcz | trawa jest mokra, nie jest pochmurnie)=" + ie.Infer(rain)); Console.WriteLine("P(spryskiwacz | trawa jest mokra, nie jest pochmurnie)=" + ie.Infer(sprinkler)); #endregion
W 60 linijkach mamy zaimplementowany cały model graficzny oraz mechanizm wnioskujący. Dla potrzeb publikacji zamieściłem zdjęcie z okienkiem całej aplikacji oraz prawdopodobieństwa dla paru innych warunków.
Implementacja podanego przykładu można znaleźć pod adresem Bayesian Networks na Codeplex. Więcej o samej sieci bayesowskiej jest na wykładzie pt. Introduction To Bayesian Inference.
Brak komentarzy:
Prześlij komentarz