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.

Podobne dokumenty