Wstęp do stucznej inteligencji - laboratoria

Wnioskowanie na podstawie wiedzy niepewnej i niepełnej: Wnioskowanie Rozmyte

Systemy rozmyte w python'ie

Na zajęciach wykorzystamy moduł fuzzython (https://github.com/yudivian/fuzzython), orginalny moduł zawiera błąd przez co nie da się go zainstalować za pomocą pip, aby go zainstalować należy pobrać zmodyfikowany moduł fuzzython.zip rozpakować go do PATH\Anaconda3\Lib\site-packages, następnie w konsoli ustawić sie w folderze PATH\Anaconda3\Lib\site-packages\fuzzython i wpisać python setup.py install (należy upewnić się że instalujemy do paython'a z dystrybucji Anaconda3).

Uwaga: W sali komputerowej moduł jest już zainstalowany. Przy importowaniu elementów z modułu trzeba zacząć od nazwy modułu: fuzzython.cos_tam_dalej

Przykład: Sterowanik Mamdaniego

Na podstawie jakości jedzenia oraz obsługi wnioskujemy wysokość napiwku.

In [1]:
# import modułów
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
from fuzzython.fsets.triangular import Triangular
from fuzzython.adjective import Adjective
from fuzzython.variable import Variable

#Definicja zmiennych lingwistycznych
#Dla każdej ze zmiennych definiujemy wartości lingwistyczne, trójkątne zbiory rozmyte

q_poor = Triangular((-0.1,0), (0,1), (5,0))
q_average = Triangular((0,0), (5,1), (10,0))
q_good = Triangular((5,0), (10,1), (10.1,0))
q_poor = Adjective('q_poor', q_poor)
q_average = Adjective('q_average', q_average)
q_good = Adjective('q_good', q_good)
quality = Variable('quality', 'star', q_poor, q_average, q_good) #jakość jedzenia w skali od 0 do 10

s_poor = Triangular((-0.1,0), (0,1), (5,0))
s_average = Triangular((0,0), (5,1), (10,0))
s_good = Triangular((5,0), (10,1), (10.1,0))
s_poor = Adjective('s_poor', s_poor)
s_average = Adjective('s_average', s_average)
s_good = Adjective('s_good', s_good)
service = Variable('service', 'star', s_poor, s_average, s_good) #obsługa w skali od 0 do 10

t_low = Triangular((-0.1,0), (0,1), (13,0))
t_medium = Triangular((0,0), (13,1), (25,0))
t_high = Triangular((13,0), (25,1), (25.1,0))
t_low = Adjective('t_low', t_low)
t_medium = Adjective('t_medium', t_medium)
t_high = Adjective('t_high', t_high)
tip = Variable('tip', '%', t_low, t_medium, t_high, defuzzification='COG', default=0) # napiwek od 0 do 25%
In [3]:
# Definicja reguł
from fuzzython.ruleblock import RuleBlock

scope = locals()

rule1 = 'if quality is q_poor or service is s_poor then tip is t_low'
rule2 = 'if quality is q_average then tip is t_medium'
rule3 = 'if quality is q_good or service is s_good then tip is t_high'

block = RuleBlock('first', operators=('MIN','MAX','ZADEH'), activation='MIN', accumulation='MAX')
block.add_rules(rule1, rule2, rule3, scope=scope)
In [4]:
# Stworzenie sterownika rozmytego typu Mamdani
from fuzzython.systems.mamdani import MamdaniSystem

mamdani = MamdaniSystem('ms1', block)

# wnioskowanie
inputs = {'quality': 6.5, 'service': 9.8}
res = mamdani.compute(inputs)
print(res)
{'first': {'tip': 14.833665565060613}}

Wykres przestrzeni decyzyjnej

In [5]:
sampled = np.linspace(0, 10, 20)
x, y = np.meshgrid(sampled, sampled)
z = np.zeros((len(sampled),len(sampled)))

for i in range(len(sampled)):
    for j in range(len(sampled)):
        inputs = {'quality': x[i, j], 'service': y[i, j]}
        res = mamdani.compute(inputs)
        z[i, j] = res['first']['tip']

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # Required for 3D plotting

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis',
                       linewidth=0.4, antialiased=True)

cset = ax.contourf(x, y, z, zdir='z', offset= -1, cmap='viridis', alpha=0.5)
cset = ax.contourf(x, y, z, zdir='x', offset= 11, cmap='viridis', alpha=0.5)
cset = ax.contourf(x, y, z, zdir='y', offset= 11, cmap='viridis', alpha=0.5)

ax.view_init(30, 200)

Przykład: Sterownik Takagi-Sugeno

In [6]:
# Zmienne zdefiniowane jak poprzednio

# Definiujemy reguły
rule4 = 'if quality is q_poor or service is s_poor then z=quality*0.5 + service*0.5'
rule5 = 'if quality is q_average then z=quality*0.7+5'
rule6 = 'if quality is q_good or service is s_good then z=quality*0.4+service*0.6+15'

block = RuleBlock('second', operators=('MIN', 'MAX', 'ZADEH'), activation='MIN')
block.add_rules(rule4, rule5, rule6, scope=scope)
In [7]:
# Stworzenie sterownika rozmytego typu Takagi-Sugeno
from fuzzython.systems.sugeno import SugenoSystem

sugeno = SugenoSystem('ss1', block)

# wnioskowanie
inputs = {'quality': 6.5, 'service': 9.8}
res = sugeno.compute(inputs)
print(res)
{'second': 17.605903614457834}

Przestrzeń decyzyjna

In [8]:
sampled = np.linspace(0, 10, 20)
x, y = np.meshgrid(sampled, sampled)
z = np.zeros((len(sampled),len(sampled)))

for i in range(len(sampled)):
    for j in range(len(sampled)):
        inputs = {'quality': x[i, j], 'service': y[i, j]}
        res = sugeno.compute(inputs)
        z[i, j] = res['second']

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # Required for 3D plotting

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis',
                       linewidth=0.4, antialiased=True)

cset = ax.contourf(x, y, z, zdir='z', offset= -1, cmap='viridis', alpha=0.5)
cset = ax.contourf(x, y, z, zdir='x', offset= 11, cmap='viridis', alpha=0.5)
cset = ax.contourf(x, y, z, zdir='y', offset= 11, cmap='viridis', alpha=0.5)

ax.view_init(30, 200)

Zadania do wykonania:

Zadanie 1:

Zaprojektuj sterownik rozmyty typu Mamdaniego dla przykładu z materiałów Wnioskowanie Mamdaniego. Przygotuj przynajmniej sześć różnych wykresów powierzchni zmiennosci odpowiedzi sterownika rozmytego, korzystajac z róznych metod dla norm, implikacji, operatora defuzyfikacji oraz różnych kształtów funkcji przynależności.

Zadanie 2:

Zaprojektuj sterownik rozmyty typu Takagi-Sugeno dla przykładu z materiałów Wnioskowanie Takagi-Sugeno. Przygotuj przynajmniej sześć różnych wykresów powierzchni zmiennosci odpowiedzi sterownika rozmytego, korzystajac z róznych metod dla norm, implikacji, operatora defuzyfikacji oraz różnych kształtów funkcji przynależności.

MiniProjekt:

Opracuj swój własny problem decyzyjny. Stwórz dla niego wybrany sterownik rozmyty. Wykonaj analize stworzonego przez siebie sterownika ze wzgledu na dobór metod dla norm, implikacji i operatora wyostrzania.

In [ ]: