Kontekst: Jestem programistą z pewnym (na wpół zapomnianym) doświadczeniem w statystyce z kursów uni. Niedawno natknąłem się na http://akinator.com i spędziłem trochę czasu próbując sprawić, by zawiodła. A kto nie był? :)
Postanowiłem dowiedzieć się, jak to może działać. Po przejrzeniu Google'a i przeczytaniu pokrewnych postów na blogu i dodaniu części mojej (ograniczonej) wiedzy do powstałej mieszanki, wpadłem na następujący model (jestem pewien, że użyję niewłaściwej notacji, proszę nie zabijaj mnie za to):
Istnieją tematy (S) i pytania (Q). Celem predyktora jest wybór podmiotu S, który ma największe prawdopodobieństwo bycia podmiotem, o którym myśli użytkownik, biorąc pod uwagę zebrane do tej pory pytania i odpowiedzi.
Niech gra G będzie zestawem zadanych pytań i udzielonych odpowiedzi: .
Następnie predyktor szuka .
Wcześniej dla przedmiotów ( ) może być tylko liczba odgadnięć podmiotu podzielona przez całkowitą liczbę gier.
Zakładając, że wszystkie odpowiedzi są niezależne, możemy obliczyć prawdopodobieństwo podmiotu S, biorąc pod uwagę grę G:
Możemy obliczyć jeśli będziemy śledzić, które pytania i odpowiedzi zostały udzielone, gdy użyte zostały chociaż w danym temacie:
Teraz definiuje rozkład prawdopodobieństwa między podmiotami i kiedy musimy wybrać następne pytanie, musimy wybrać to, dla którego oczekiwana zmiana w entropii tego rozkładu jest maksymalna:
Próbowałem to zaimplementować i działa. Ale, oczywiście, wraz ze wzrostem liczby pacjentów, wydajność spada ze względu na konieczność ponownego obliczenia po każdym ruchu i obliczenia zaktualizowanego rozkładu dla wybór pytania.
Podejrzewam, że po prostu wybrałem niewłaściwy model, będąc ograniczonym ograniczeniami mojej wiedzy. A może w matematyce jest błąd. Proszę, oświeć mnie: z czym powinienem się zapoznać lub jak zmienić predyktor, aby mógł poradzić sobie z milionami tematów i tysiącami pytań?