Logika rozmyta
Transkrypt
Logika rozmyta
Inteligencja obliczeniowa Laboratorium 7: Logika rozmyta Głównym zadaniem Underwritera jest ocena ryzyka związanego z klientem lub grupą klientów i wyliczenie, jaką cenę powinien on zapłacić za polisę. Załóżmy, że pracujemy dla towarzystwa ubezpieczeniowego i zastanawiamy się komu oferować atrakcyjną polisę ubezpieczeniową. Muszą to być osoby zdrowe, które dla ich szczęścia nie będą musiały otrzymac pieniędzy z tytułu choroby. Dla ułatwienia będziemy patrzyli na zdrowie osoby przez pryzmat trzech współczynników: • • • testu na hemoglobinę glikowaną (A1c) – pod kątem wykrycia cukrzycy indeksu masy ciała (BMI) – pod kątem otyłości lub niedowagi ciśnienie tętnicze (BP) – pod kątem nadciśnienia tętniczego Dla każdej osoby będziemy wystawiali ocenę (rating), która wpływa na ofertę polisy (ocena 1 oznacza dobre zdrowie i korzystną polisę, ocena 10 słabe zdrowie i odmowę wydania polisy). Zadanie 1 oaprte jest na samouczku „Fuzzy Logic in R” Jeffa Heatona (załączony pdf) Zadanie 1 (1 pkt) a) Zainstaluj paczkę sets w R i załaduj ją. install.packages("sets") library(sets) b) Definiujemy zakres dla wszystkich danych jakimi będziemy się posługiwać (A1c, BMI, BP,Rating). W naszym przypadku wystarczy od 0 do 40, z dokładnością do 0.1. sets_options("universe", seq(from = 0, to = 40, by = 0.1)) c) Definiujemy wszystkie zmienne lingwistyczne (A1c, BMI, BP, Rating) wraz z odpowiadającymi im wartościami lingwistycznymi (np. dla BMI „otyły”, „niedowaga”) variables <- set( bmi = fuzzy_partition(varnames = c(niedow = 9.25, zdro = 21.75, nadw = 27.5, otyl = 35), sd = 3.0), a1c = fuzzy_partition(varnames = c(nisk = 4, norm = 5.25, wys = 7), FUN = fuzzy_cone, radius = 5), rating = fuzzy_partition(varnames = c(odm = 10, stand = 5, pref = 1), FUN = fuzzy_cone, radius = 5), bp = fuzzy_partition(varnames = c(norm = 0, mnadcis = 10, nadcis = 20, dnadci = 30), sd = 2.5) ) Zwróć uwagę na to, jakie wartości przyjmują zmienne i jak wygląda funkja przynależności: • Zmienna bmi ma cztery wartości: niedowagę, zdrowy, nadwaga, otyłość z liczbami wskazującymi idealne bmi. Funkcja przynależności do każdej z kategorii to rozklad • • • normalny o odchyleniu standardowym 3. Zmienna a1c ma trzy wartości: niska, normalna, wysoka. Funkcje przynależności to tym razem stożki o promieniu 4 jednostek. Rating składa się z 3 wartości: odmowa, standard, preferowany. Wartości odpowiadają liczbą od 10 do 1, ponieważ underwriterzy często mają taki zakres oceny: od 10 (odmowa) do 1 (preferowany). Ciśnienie krwi po odpowiedniej obróbce danych numerycznych (np. normalizacja) można podzielić na 0 (normalne), 10 (małe nadciśnienie), 20 (nadciśnienie), 30 (duże nadciśnienie). d) Jesteśmy gotowi do drugiego etapu: definiujemy reguły rozmyte, które będą nam mówić jaką polisę zaoferować (prferowany, standard, odmowa). rules <set( fuzzy_rule(bmi %is% niedow || bmi %is% otyl || a1c %is% nisk, rating %is% odm), fuzzy_rule(bmi %is% nadw || a1c %is% nisk || bp %is% mnadcis, rating %is% stand), fuzzy_rule(bmi %is% zdro && a1c %is% norm && bp %is% norm, rating %is% pref) ) Widać, że akurat tutaj zdefiniowana tylko 3 reguły (można dodac i więcej, gdy są za tym przesłanki). Oczywiście znaki && oznaczają „oraz”, || oznacza „lub” a „%is%” oznacza operator „jest/równa się” dla reguł. e) Tworzymy model oparty o logikę rozmytą: system <- fuzzy_system(variables, rules) Nastepnie wyświetlamy zebrane dane: print(system) plot(system) Print wypisze jakie zmienne lingwistyczne mamy i ile wartości. Wypisze reguły. A Plot narysuje wykresy funkcji przynależności. Zwróć uwagę na maksima wykresów i ich kształty (niektóre są stożkami, niektóre mają rozkład normalny). f) Stworzyliśmy model, a teraz wypada go przetestować. Załóżmy, że zgłasza się do nas osoba o bmi=29, a1c=5, bp=20. Co powinniśmy jej zaoferować? Nasz ostatni etap: przeprowadzamy wnioskowanie rozmyte i obrazujemy je na wykresie: fi <- fuzzy_inference(system, list(bmi = 29, a1c=5, bp=20)) plot(fi) Jak widać, osoba ta „powinna” mieć ocenę 7 (pierwsza górka) lub około 10 (druga górka). Inne oceny są już mniej pewne. g) Jeśli jednak chcemy otrzymać konkretną wartość musimy przeprowadzić „od”-rozmycie (defuzzification). Jednym ze sposobów jest wyznaczenie środka ciężkości wykresu (centroid): gset_defuzzify(fi, "centroid") Osoba dostała ocenę 7.461458, co kwalifikuje ją jako niezbyt zdrową. Zadanie 2 (2 pkt) Klimatyzacja jest prawie wszędzie: w domu, biurze, samochodzie, hotelu. Dlatego ważne jest, by działała inteligentnie: gdy warunki są nieznośne – działała na pełni mocy, a gdy są stabilne – wyłączała się. Wydaje się, że system działający na bazie logiki rozmytej, może zdać tutaj egzamin. Będziemy rozpatrywać jedynie klimatyzację schładzającą i właściwie tylko jedną część urządzenia: sprężarkę. Sprężarka to jedna z najważniejszych i najdroższych części urzędzenia klimatyzującego. Jej tłoki powodują obieg czynnika chłodzącego i w konsekwencji napędzają działanie klimatyzatora. Im szybciej działają tłoki, tym mocniej ochładzane jest powietrze oraz tym sprawniej usuwana jest nadmierna wilgotność z powietrza. Będziemy rozpatrywać trzy czynniki (zmienne lingwistyczne): temperaturę [ºC] i wilgotność [%] powietrza oraz prędkosć sprężarki. Temperaturę mozemy określić jako: niską, średnią, wysoką, bardzo wysoką (cztery wartości lingiwstyczne). Wilgotność jako: sucho, przyjemnie, wilgotno, mokro. Zaś prędkość sprężarki jako: wyłączona, niska, średnia, wysoka. Co to znaczy, że temperatura jest niska? Jaka wilgotnośc powietrza jest „przyjemna”? Co to znaczy, że sprężarka działa szybko lub wolno? Ilustrują to poniższe wykresy funkcji przynależności. Drugie pytanie: jakie sesnowne reguły należy wymyślić? Sprężarka musi działać szybko gdy temperatura jest za wysoka. Gdy temperatura jest niska, można ją wyłączyć lub spowolnić działanie. Należy również uwzględnić wilgotność: im wyższa, tym szybciej działa sprężarka. Zestaw sensownych reguł podano poniżej. Lp. Temperatura Wilgotnosc PredkoscSprezarki 1 Niska Sucho Wył 2 Niska Przyjemnie Wył 3 Niska Wilgotno Wył 4 Niska Mokro Niska 5 Średnia Sucho Wył 6 Średnia Przyjemnie Wył 7 Średnia Wilgotno Niska 8 Średnia Mokro Srednia 9 Wysoka Sucho Niska 10 Wysoka Przyjemnie Srednia 11 Wysoka Wilgotno Wysoka 12 Wysoka Mokro Wysoka 13 Bardzo wysoka Sucho Srednia 14 Bardzo wysoka Przyjemnie Wysoka 15 Bardzo wysoka Wilgotno Wysoka 16 Bardzo wysoka Mokro Wysoka Twoim zadaniem jest powtórzyć kroki z zadania 1 dla klimatyzacji. W szczególności. a) Jaki powinien być zakreś wartości (uniwersum). Jeśli ustalisz to na 0-100, to problematyczna jest temperatura z zakresem 0-45. Wówczas należy ją zeskalować sprytną funkcją, która zamieni 0 na 0, 45 na 100, połowę z 45 czyli 22,5 na połowę ze 100 czyli 50. Jaka to funkcja? Jak będą wyglądać wykresy? b) Wczytaj wszystkie zmienne lingwistyczne z ich wartościami i funkcjami przynależności. Pamiętaj, żeby uwzględnić zmienione wartości temperatur (zakres 0-100). Warto użyć do tego funkcji fuzzy_variable (zamiast fuzzy_partition) oraz fuzzy_triangular (patrz: https://cran.r-project.org/web/packages/sets/sets.pdf strona 12,17). W przypadku prędkościSprężarki wartość „wyłączona” można dać „chudy” trójkąt zaczynający się w -1 i kończący w 1. c) Dodaj reguły takie, jak wymieniono w tabeli. d) Sprawdź jak działa Twój system dla takich inputów (temperatura, wilgotność): (5ºC, 30%), (23ºC, 65%), (23ºC, 85%), (35ºC, 35%) Dokonaj defuzzification. Wartości dla pierwszych dwóch inputów powinny wyjśc około: 0.3437555 49.37491 *Zadanie dla chętnych (wstęp do jednego z projektów) Przeprowadź podobną analizę w R dla problemu żółtego światła. Czy widząc żółte światło na skrzyżowaniu samochód powinien przyspieszyć i przejechać przez skrzyżowanie czy zwolnić i zatrzymać się? Jak to zależy od aktualnej prędkości i odległości od skrzyżowania. Badanie oprzyj na ostatnim rozdziale („Symulacja FLC”) ze strony MIMUW: http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_Modu%C5%82_4__Wnioskowanie_na_podstawie_wiedzy_niepewnej_i_niepe%C5%82nej (pod tym linkiem objaśniono też cały algorytm wnioskowania rozmytego – warto się wczytać) Jak widać: • Uniwersum będzie od 0 do 140. • Mamy trzy zmienne lingwistyczne: odległość – z wartościami mała, średnia, duża prędkość – z wartościami mała, średnia, duża przyspieszenie – z wartościami duże-,małe0,małe+,duże+ • Te trzy zmienne należy tak zdefiniować, by wyglądały podobnie na wykresach – czy zrobisz to za pomocą rozkładu normalnego, stożka (cone) czy trapezoidu? • Zmienna przyspieszenie zdefiniowana jest na wykresie poniżej tabel. Niestety jej zakres (-1,1) jest zbyt mały, by pasował do uniwersum. Proszę zatem rozciągnąć wykres stosując funkcję: f(x)=x*70+70. Powinno to wyglądać tak: • Reguły wymieniono w tabelach („W naszym przykładzie, wnioskowanie odbywa się zgodnie z zestawem reguł zamieszczonym poniżej.”) • Wnioskowanie przeprowadzamy na trzech podanych przypadkach samochodów. Sprawdź czy wyniki wyszły: 79.8159, 62.51538, 98.31958 Warto dodatkowo zrobić symulację zadania: Przeprowadź animację (symulację) jazdy samochodu przed skrzyżowaniem dla trzech przypadków z poprzedniego zadania. Może to być punkt poruszający się po linii, albo inny sposób animacji. Można badać co sekundę (albo lepiej co ułamek sekundy) jak szybko jedzie auto, jak przyspiesza i jak daleko jest od skrzyżowania. Wszystko zrobić w pętli: 1. Biorąc aktualne dane samochodu (odległość, prędkość) oblicz przyspieszenie za pomocą logiki rozmytej: fi <- fuzzy_inference(system, list(predk = ..., odleg=...)) nowe_przysp <- gset_defuzzify(fi, "centroid") 2. Jaka sytuacja będzie po sekundzie (lub ułamku sekundy)? Zaktualizuj dane: Jeśli prędkość na początku wynosiła 10 m/s (36 km/h) i obliczono, że samochód musi zwalniać w tempie nowe_przysp = -1m/s. To można założyć, że porusza się z prędkością 9 m/s (uwzględniono spowolnienie). Po uplywie 1 sekundy przejdzie więc 9 m (patrz rysunek). 3. Idź do kroku 1 uwzględniając nową prędkośc i położenie.