Pokazywanie postów oznaczonych etykietą AI. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą AI. Pokaż wszystkie posty

piątek, 14 grudnia 2012

Dobre filmy

Czy kiedykolwiek zdarzyło ci się, że oglądałeś film w kinie, na który polecił ci kolega lub trailer był fajny i po parunastu minutach (nie liczę czasu z reklamami przed filmem) okazało się, że jest to kompletny badziew. Ja wtedy siedzę spokojnie i mówię do sobie, że „już zapłaciłem i poświeciłem czas na dojazd do kino, to jeszcze tą godzinę wytrzymam”. Jeżeli miałeś taką sytuacje jak ja, to może ci pomóc mechanizmu zaimplementowany na portalu filmweb. Teraz oglądam te dobre filmy, wygenerowane z rekomendacji.



Ale jakie są dobre, a jakie słabe filmy? Każda osoba ma swój własny gust filmów. Mechanizmem do wyliczania scoringu filmu nazywa się Gustomierz. Korzysta z wielu zmiennych, takich jak gatunek, głosy innych użytkowników czy twórcy filmu. Model do wyliczenia najlepszych filmów działa na bazie algorytmu K-najbliższych sąsiadów.
I pamiętaj. Szanuj swój czas jaki poświęcasz na oglądanie filmów.

poniedziałek, 27 lutego 2012

Sieć bayesowska w .NET

Sieć bayesowska jest zaawansowaną probabilistyczną metodą odkrywania wiedzy i wnioskowania. Przedstawia ona zależności pomiędzy zdarzeniami bazując na wzorze Bayesa oraz rachunku prawdopodobieństwa. Umożliwia reprezentację probabilistycznych zależności przyczynowych między dowolnymi atrybutami (zdarzeniami). W praktyce sieć bayesowska jest reprezentowana przez skierowany graf acykliczny. Największą korzyścią sieci bayesowskiej jest czytelna i intuicyjna graficzna reprezentacja wiedzy o bezpośrednio zachodzących zależnościach.

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.