Rozdz4 Bayes

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

4.

Klasyfikatory probabilistyczne Bayes’a

4.1 Wprowadzenie

Klasyfikatory Bayes'a należą do klasyfikatorów probabilistycznych i stanowią jedną z metod


uczenia maszynowego, stosowaną do rozwiązywania problemu klasyfikacji [11,58,82].
Zadaniem klasyfikatora Bayes'a jest przyporządkowanie nowego przypadku obserwacji
stanowiących zmienne typu boolowskiego (prawda kodowana jako jedynka, fałsz kodowany
w postaci zera) do jednej z klas zdefiniowanych z góry, przy czym zbiór klas decyzyjnych
musi być skończony i kompletny [11].

Każdy przykład uczący używany w procesie klasyfikacji opisany jest przy pomocy
zbioru atrybutów warunkowych Xi (zmiennych wejściowych) i jednego atrybutu decyzyjnego
Di stowarzyszonego z nimi. W myśl teorii Bayes'a, najbardziej prawdopodobną klasą, do
której należy przypisać nowy obiekt, opisany znanymi wartościami N wejściowych atrybutów
Xj1 = xj1, Xj2 = xj2 … Xjn = xjN zapisanych w skrócie jako wektor x, jest klasa di, która
maksymalizuje prawdopodobieństwo warunkowe P(di | xj1, xj2 … xjN). Klasa ta wyznaczona
jest jako maximum a posterori.
Klasyfikator bayesowski dobrze nadaje się do problemów o wielu wymiarach na
wejściu (wektor wejściowy x o wymiarze N>>1). Mimo prostoty metody, często działa nie
gorzej od innych, bardziej skomplikowanych rozwiązań klasyfikacyjnych.

4.2 Pełny klasyfikator Bayes’a

Podstawę działania klasyfikatora bayesowskiego stanowi twierdzenie Bayes’a [11].


Oznaczmy przez P(A) prawdopodobieństwo prawdziwości zdarzenia A (czyli, że A jest
prawdą, oznaczoną jako wartość 1), a przez P ( A ) prawdopodobieństwo, że A jest fałszem
(wartość zerowa). Dla zdarzeń dyskretnych, przy założeniu równomierności rozkładu, można
oszacować wartość prawdopodobieństwa P(A) jako stosunek liczby wystąpień A (sukcesów)
do liczby wszystkich zdarzeń P(A)=liczba sukcesów/liczba zdarzeń. Prawdopodobieństwo
porażki (wystąpienia A ) jest równe P(A ) = 1 − P( A) . Oznaczmy przez P( A  B)
prawdopodobieństwa zajścia jednoczesnego zdarzenia A i B, a przez P( A  B)
prawdopodobieństwa zajścia zdarzenia A lub zdarzenia B. Obowiązują tutaj podstawowe
związki

P( A  B) = P( A) + P( B) − P( A  B) (4.1)
oraz
27
P( A  B) = P( A) + P( B) − P( A  B) (4.2)
Prawdopodobieństwo warunkowe P(A/B) jest rozumiane jako prawdopodobieństwo zajścia
zdarzenia A pod warunkiem, że zaszło zdarzenie B. Jest ono definiowane jako stosunek
prawdopodobieństwa jednoczesnego zajścia A i B do prawdopodobieństwa wystąpienia
zdarzenia B
P( A  B)
P( A / B) = (4.3)
P( B)
W praktyce prawdopodobieństwo to jest estymowane jako stosunek liczby przypadków
jednoczesnego zajścia zdarzeń A i B do liczby przypadków zajścia zdarzenia B, przy czym
obowiązuje
P( B) = P( B / A) P( A) + P( B / A ) p( A ) (4.4)
W analogiczny sposób określa się prawdopodobieństwo warunkowe P(B/A)
P ( B  A)
P ( B / A) = (4.5)
P ( A)
Z zależności (4.3) i (4.5) wynika sformułowanie reguły Bayes’a
P( A  B) P( B / A) P( A)
P( A / B) = = (4.6)
P( B) P( B)
Wartość P(A/B) nazywane jest prawdopodobieństwem a posteriori, natomiast P(A), P(B)
oraz P(B/A) prawdopodobieństwami a priori (estymowanymi bezpośrednio na podstawie
przeprowadzonych pomiarów liczby odpowiednich wystąpień).
W praktyce klasyfikacyjnej zdarzenie A może być utożsamione z klasą a B ze
zmierzonymi zmiennymi niezależnymi (atrybutami wejściowymi), na podstawie których
należy określić przydział do klasy (prawdopodobieństwo wystąpienia klasy A pod warunkiem
wystąpienia pomiarów określonych atrybutami B). W dalszych rozważaniach wystąpienie
klasy oznaczymy symbolem D (decyzja przydziału do klasy) a atrybuty wejściowe symbolem
X.
Przykładowo wyznaczymy prawdopodobieństwa a priori dla zbioru 3 atrybutów
wejściowych X1, X2, X3 zadanych w postaci binarnej (stanowiących obserwacje) i
przedstawionych w tabeli 4.1 [58]. Czwarta kolumna tej tabeli przedstawia przynależność
obserwacji do jednej z trzech klas D1, D2 oraz D3.

28
Tabela 4.1 Dane wejściowe obserwacji
X1 X2 X3 Klasa D
1 0 1 2
0 1 1 2
1 1 1 3
1 1 0 3
0 0 1 1
1 0 0 1
1 1 1 3
1 1 0 2
0 1 1 2
0 1 1 1
0 0 0 1
1 1 1 2
1 1 1 2
1 1 1 3
1 1 0 1
1 0 1 3
1 1 1 3
1 0 0 2
0 0 1 2
1 1 0 1

Prawdopodobieństwo warunkowe a priori P(Xi/Dj) estymuje się jako liczbę zgodności Xi


(mierzoną liczbą jedynek) z badaną klasą odniesioną do liczby wystąpień danej klasy w
zbiorze danych uczących.
liczba zgodnosci jedynek X i z klasą
P( X i / D j ) =
liczba reprezentantów klasy Dj

Przykładowo prawdopodobieństwo P(X1/D2) określa się zliczając liczbę jedynek w kolumnie


pierwszej tabeli (zmienna X1) występujących jednocześnie z klasą D=2 (jest ich 5) i odnosząc
ją do liczby wstąpień klasy 2 w zbiorze (jest ich 8).

Tabela 4.2 Estymacja prawdopodobieństw a priori dla danych z tabeli 4.1


D1 D2 D3
P(X1/Di) 3 5 6
6 8 6
P(X2/Di) 3 5 5
6 8 6
P(X3/Di) 2 6 5
6 8 6

29
P(Di) 6 8 6
20 20 20

W tym przypadku otrzymuje się P(X1/D2) =5/8. Postępując w ten sposób dla wszystkich
atrybutów wejściowych i wszystkich klas otrzymuje się wyniki prawdopodobieństw a priori
przedstawione w tabeli 4.2.
Przy oznaczeniu klasy symbolem D decyzja przydziału do jednej z dwu istniejących
klas: D i klasy przeciwnej przy wystąpieniu jednego atrybutu wejściowego przyjmującego
wartość prawdziwą X=1 i po uwzględnieniu zależności (4.6) prawdopodobieństwo klasy D
określa reguła Bayes’a zapisana w postaci
P( X / D) P( D) P( X / D) P( D)
P( D / X ) = = (4.7)
P( X ) P( X / D) P( D) + P( X / D ) P( D )
Przy istnieniu M klas D1, D2, …, DM i jednego atrybutu wejściowego X o wartości prawdziwej
(równej 1) prawdopodobieństwo wystąpienia i-tej klasy Di określa wzór
P( X / Di ) P( Di )
P( Di / X ) = M (4.8)
 P( X / Dk ) P( Dk )
k =1

Dla M klas i wystąpieniu jednoczesnym N atrybutów wejściowych prawdziwych X1, X2, …,


XN (przyjmujących wartość jeden) prawdopodobieństwo wystąpienia i-tej klasy Di przy i = 1,
2, ..., M, określa wzór
P( X 1 , X 2 ,...,X N / Di ) P( Di )
P( Di / X 1 , X 2 ,...,X N ) = M (4.9)
 P( X 1 , X 2 ,...,X N / Dk ) P( Dk )
k =1

Przy założeniu niezależności atrybutów wejściowych wzór powyższy można uprościć do


postaci
P( X 1 / Di ) P( X 2 / Di ) P( X N / Di ) P( Di )
P( Di / X 1 , X 2 ,...,X N ) = M (4.10)
 P( X 1 / Dk ) P( X 2 / Dk ) P( X N / Dk ) P( Dk )
k =1

Po wyznaczeniu prawdopodobieństwa wystąpienia każdej klasy, za zwycięską uznaje się tę o


największej wartości prawdopodobieństwa. Jest to pełna reguła Bayes’a minimalizująca
statystyczne ryzyko pomyłki.
Jako przykład rozpatrzmy proces decyzyjny, w którym występują trzy niezależne
atrybuty wejściowe X1, X2, X3 przypisujące przynależność obserwacji do jednej z trzech
wykluczających się klas D1, D2, D3. Przyjmijmy, że na podstawie danych uczących określone
zostały z góry prawdopodobieństwa a priori, podane w tabeli 4.3.

30
Tabela 4.3 Wartości prawdopodobieństw a priori dla obserwacji w przykładzie
D1 D2 D3
P(X1/Di) 0.3 0.8 0.5
P(X2/Di) 0.9 0 0.7
P(X3/Di) 0.6 0.7 0.9
P(Di) 0.4 0.35 0.25

Określimy prawdopodobieństwo wystąpienia każdej z trzech klas przy różnych układach


wartości atrybutów wejściowych zmierzonych w procesie.
W pierwszej kolejności rozpatrzymy zdarzenie, w którym tylko jedna zmienna X3 była
prawdą (X3=1), a pozostałe przyjęły wartość zerową. Określimy prawdopodobieństwo
przynależności tego zdarzenia do każdej z trzech klas (D1, D2, D3) korzystając ze wzoru
P( X 3 / Di ) P( Di )
P( Di / X 3 ) = 3
 P( X 3 / Dk ) P( Dk )
k =1

Wykorzystując dane liczbowe z tabeli 4.3 otrzymuje się kolejno


0.6  0.4
P( D1 / X 3 ) = = 0.338
0.6  0.4 + 0.7  0.35 + 0.9  0.25
0.7  0.35
P( D2 / X 3 ) = = 0.345
0.6  0.4 + 0.7  0.35 + 0.9  0.25
0.9  0.25
P( D3 / X 3 ) = = 0.317
0.6  0.4 + 0.7  0.35 + 0.9  0.25
Wynik obliczeń wskazuje na klasę drugą, choć odległość do klasy pierwszej jest bardzo mała.
Zauważmy, że suma prawdopodobieństw jest równa 1.
W następnej kolejności rozpatrzymy zdarzenie, w którym jednocześnie (niezależnie od
siebie) dwa niezależne atrybuty wejściowe (X3 oraz X1) były prawdziwe (przyjmują wartości
binarne równe 1). W tym przypadku odpowiednie prawdopodobieństwa są określone relacją
P( X 1 , X 3 / Di ) P( Di ) P( X 1 / Di ) P( X 3 / Di ) P( Di )
P( Di / X 1 , X 3 ) = 3 = 3
 P( X 1 , X 3 / Dk ) P( Dk )  P( X 1 / Dk ) P( X 3 / Dk ) P( Dk )
k =1 k =1

Po wstawieniu danych liczbowych z tabeli 4.3 otrzymuje się


0.3  0.6  0.4
P( D1 / X 1 , X 3 ) = = 0.19
0.3  0.6  0.4 + 0.8  0.7  0.35 + 0.5  0.9  0.25
0.8  0.7  0.35
P( D2 / X 1 , X 3 ) = = 0.52
0.3  0.6  0.4 + 0.8  0.7  0.35 + 0.5  0.9  0.25
0.5  0.9  0.25
P( D3 / X 1 , X 3 ) = = 0.29
0.3  0.6  0.4 + 0.8  0.7  0.35 + 0.5  0.9  0.25
Przy takiej obserwacji zwycięzcą jest klasa druga (największa wartość prawdopodobieństwa).
31
W ostatniej kolejności rozpatrzymy przypadek, w którym wszystkie trzy atrybuty
wejściowe reprezentują prawdę (przyjęły wartość jedynkową). W takim przypadku kolejne
prawdopodobieństwa warunkowe określone są wzorem

P( X1 , X 2 , X 3 / Di ) P( Di ) P( X1 / Di ) P( X 2 / Di ) P( X 3 / Di ) P( Di )
P( Di / X1 , X 2 , X 3 ) = 3
= 3

 P( X , X
k =1
1 2 , X 3 / Dk ) P( Dk )  P( X
k =1
1 / Dk ) P( X 2 / Dk ) P( X 3 / Dk ) P( Dk )

Po wstawieniu danych liczbowych z tabeli 4.3 otrzymuje się


0.3  0.9  0.6  0.4
P( D1 / X 1 , X 2 , X 3 ) = = 0.45
0.3  0.9  0.6  0.4 + 0 + 0.5  0.7  0.9  0.25
0
P( D2 / X 1 , X 2 , X 3 ) = =0
0.3  0.6  0.4 + 0 + 0.5  0.9  0.25
0.5  0.7  0.9  0.25
P( D3 / X 1 , X 2 , X 3 ) = = 0.55
0.3  0.6  0.4 + 0 + 0.5  0.9  0.25
Przy takich wartościach atrybutów wejściowych wynikających z obserwacji zwycięzcą jest
klasa trzecia (największa wartość prawdopodobieństwa).
W praktyce przypisanie obserwacji do klasy o najwyższym prawdopodobieństwie nie
zawsze jest logicznie uzasadnione. Przykładem może być proces wykrywania nieuczciwej
transakcji, której niewykrycie może prowadzić do znaczących strat. W takim przypadku
należy wziąć pod uwagę także estymowaną wartość poziomu prawdopodobieństwa
wystąpienia takiej transakcji. Jeśli w wyniku obliczeń prawdopodobieństwo transakcji
prawidłowej wynosi 0.6 a nieuczciwej 0.4, to przyjmując na przykład za wartość alarmową
transakcji nieuczciwej poziom 0.3 należy taką obserwację zakwalifikować do klasy
„nieuczciwej” pomimo, że odpowiadająca jej wartość prawdopodobieństwa jest niższa niż
klasy przeciwnej.

4.3 Naiwny klasyfikator Bayes’a

Pełny klasyfikator Bayes’a stanowi procedurę stosunkowo złożoną w obliczeniach,


szczególnie przy dużej liczbie atrybutów wejściowych i liczbie rozważanych klas. Zakłada
przy tym, że atrybuty wejściowe przyjmują wartości wcześniej użyte w bazie danych
uczących (przy określaniu odpowiednich prawdopodobieństw a priori). W praktyce używa się
powszechnie uproszczoną wersję tego klasyfikatora zwaną naiwnym klasyfikatorem Bayes’a.

Naiwny klasyfikator nie oblicza dokładnego prawdopodobieństwa przynależności


aktualnej obserwacji do określonej klasy, a jedynie współczynnik proporcjonalny do wartości

32
tego prawdopodobieństwa (suma tych współczynników nie jest równa jeden). Aktualną
obserwację przypisuje się do klasy o największej wartości tego współczynnika
prawdopodobieństwa.
Z matematycznego punktu widzenia naiwny klasyfikator bayesowski wywodzi się z
podstawowej zależności (4.9), która tutaj przepiszemy postaci
P(x / Di ) P( Di )
P( Di / x) = M
(4.11)
 P(x / Dk ) P( Dk )
k =1

gdzie x oznacza wektor atrybutów wejściowych x=[X1, X2,…, XN]T. Zauważmy, że


mianownik powyższej zależności jest wspólny dla każdej klasy, stąd decyzja o przynależności
do klasy może być podjęta na podstawie jedynie licznika tej zależności, co zapiszemy w
postaci
P( Di / x)  ( Di / x) = P( Di ) P(x / Di ) (4.12)
Powyższa zależność określa jedynie wskaźnik prawdopodobieństwa α(Di) wystąpienia
klasy Di i wskazuje na stopień prawdopodobieństwa a nie na dokładną jego wartość.
Klasyfikator naiwny przyjmuje dodatkowo uproszczone (naiwne) założenie
niezależności zmiennych wejściowych dla których prawdopodobieństwo warunkowe
wielowymiarowe jest równe iloczynowi prawdopodobieństw jednowymiarowych po
wszystkich zmiennych Xi. Takie założenie upraszcza wskaźnik prawdopodobieństwa (4.12) o
do postaci
N
 ( Di / x) = P ( Di ) P ( X j / Di ) (4.13)
j =1

Przy założeniu równego prawdopodobieństwa wystąpienia wszystkich klas D1, D2, …, DM


określenie zwycięskiej klasy sprowadza się do określenia odpowiedniej wartości
maksymalnej według uproszczonego wzoru
N
max  ( Di / x) → max  P( X
j =1
j / Di ) (4.14)

Wzory (4.13) i (4.14) stanowią kwintesencję procedury wyznaczania przynależności aktualnej


obserwacji do odpowiedniej klasy według klasyfikatora naiwnego Bayes’a.
Jako przykład rozpatrzmy klasyfikator naiwny Bayes’a przy atrybutach wejściowych
w postaci binarnej, wytrenowany na bazie danych uczących przedstawionych w tabeli 4.4.
Zadaniem klasyfikatora jest przypisanie obserwacji testowej zadanej wektorem x=[1 1]T do
klasy 1 lub 2. Zauważmy, że taki układ atrybutów wejściowych ma swoje reprezentacje w
bazie danych uczących wskazując zarówno na klasę 1 jak i 2.

33
Tabela 4.4 Baza danych uczących dla naiwnego klasyfikatora Bayes’a
X1 X2 Klasa
1 0 1
0 0 1
1 1 2
0 1 2
1 1 1

Wobec nierównego występowania obu klas wyznaczymy najpierw prawdopodobieństwo


wystąpienia klasy 1 i 2. Wynosi ono
P(D1)=3/5
P(D2)=2/5
Prawdopodobieństwa warunkowe P(Xi/Dj) dla zadanych wartości wektora testującego x dla
danych z tabeli wynoszą

P (( X 1 = 1) / D1 ) =
2
3
P (( X 1 = 1) / D2 ) =
1
2
P (( X 2 = 1) / D1 ) =
1
3
P (( X 2 = 1) / D2 ) = 1
Stąd

P(x / D1 ) = P(( X 1 = 1) / D1 )P(( X 2 = 1) / D1 ) =


2
9
P(x / D2 ) = P(( X 1 = 1) / D2 )P(( X 2 = 1) / D2 ) =
1
2
Odpowiednie wskaźniki prawdopodobieństwa a posteriori wystąpienia obu klas wynoszą
2 3 2
 ( D1 / x) = P(x / D1 ) P( D1 ) =  =
9 5 15
1 2 3
 ( D2 / x) = P(x / D2 ) P( D2 ) =  =
2 5 15
Obserwację określoną wektorem x=[1 1]T zaliczymy zatem do klasy 2.
Jako drugi przykład rozpatrzmy klasyfikator naiwny Bayes’a wytrenowany na bazie
danych uczących przedstawionych w tabeli 4.5. Zadaniem klasyfikatora jest przypisanie
obserwacji testowych w postaci trzech wektorów xt1=[1 1]T, xt2=[0 1]T oraz xt3=[0 0]T do
klasy 1 lub 2.

34
Tabela 4.5 Baza danych uczących dla naiwnego klasyfikatora Bayes’a
X1 X2 Klasa
1 0 1
0 0 1
1 1 2
0 1 2
1 1 1
1 1 1
1 0 1
0 1 2
0 0 2

Na podstawie danych z tabeli 4.5 wartości prawdopodobieństwa a priori dla klasyfikatora


Bayesa przyjmują wartości jak poniżej

Tabela 4.6 Prawdopodobieństwa a priori dla danych z tabeli 4.5


D1 D2
P(X1/Di) 4/5 1/4
P(X2/Di) 2/5 3/4
P(Di) 5/9 4/9

Na tej podstawie korzystając ze wzoru (4.13) otrzymuje się następujące wyniki klasyfikacji
dla wektorów testowych xt1, xt2, xt3
• Wektor testowy xt1=[1 1]T.
Odpowiednie wskaźniki prawdopodobieństwa a posteriori wystąpienia obu klas wynoszą
4 2 5
 ( D1 / xt1 ) = P( x1 / D1 ) P( x2 / D1 ) P( D1 ) =   = 0.1778
5 5 9
1 3 4
 ( D2 / xt1 ) = P( x1 / D2 ) P( x2 / D2 ) P( D2 ) =   = 0.0833
4 4 9
Obserwację określoną wektorem x=[1 1]T zaliczymy zatem do klasy pierwszej.
• Wektor testowy xt2=[0 1]T.
Odpowiednie wskaźniki prawdopodobieństwa a posteriori wystąpienia obu klas wynoszą
2 5
 ( D1 / xt 2 ) = P( x2 / D1 ) P( D1 ) =  = 0.222
5 9
3 4
 ( D2 / xt 2 ) = P( x2 / D2 ) P( D2 ) =  = 0.333
4 9
Obserwację określoną wektorem x=[1 1]T zaliczymy zatem do klasy drugiej.
• Wektor testowy xt3=[0 0]T.
Odpowiednie wskaźniki prawdopodobieństwa a posteriori wystąpienia obu klas wynoszą

35
1 3 4
 ( D1 / xt 3 ) = P( x1 / D1 ) P( x2 / D1 ) P( D1 ) = (1 − P( x1 / D1 ) )(1 − P( x2 / D1 ) )(1 − P( D1 ) ) =   = 0.0533
5 5 9
3 1 5
 ( D2 / xt 3 ) = P( x1 / D2 ) P( x2 / D2 ) P( D2 ) = (1 − P( x1 / D2 ) )(1 − P( x2 / D2 ) )(1 − P( D2 ) ) =   = 0.1042
4 4 9
Obserwację określoną wektorem x=[0 0]T zaliczymy zatem do klasy drugiej.
Matlab posiada rozbudowany zbiór funkcji wspomagających implementację modelu
naiwnego klasyfikator Bayes’a [49]. Do głównych należą: funkcja fitcnb tworząca model
bayesowski, funkcja predict analizująca działanie wytrenowanego klasyfikatora na danych
wejściowych testujących oraz funkcja posteriori obliczająca prawdziwą wartość
prawdopodobieństwa przynależności zmiennych wejściowych (wektora x) do klasy
Prawidłowość obliczeń z powyższego przykładu można sprawdzić w wykorzystując
funkcję fitcnb Matlaba [49] oraz model sklearn.naive_bayes.CategoricalNB [98],
implementującą naiwny klasyfikator Bayesa przy użyciu komend
MATLAB Python
from sklearn.naive_bayes import CategoricalNB

X = [1 0 1 X = np.mat('''1 0 1;
0 0 1 0 0 1;
1 1 2 1 1 2;
0 1 2 0 1 2;
1 1 1 1 1 1;
1 1 1 1 1 1;
1 0 1 1 0 1;
0 1 2 0 1 2;
0 0 2]; 0 0 2''');
x = X(:,1:2); x = X[:,0:2];
d = X(:,3); d = X[:,2];

model=CategoricalNB()
model=fitcnb(x,d)
model.fit(x,d);

xt = [1 1 xt = np.mat('''1 1;
0 1 0 1;
0 0]; 0 0''');

klasa=model.predict(xt)
klasa=model.predict(xt)
klasa

klasa = array([1, 2, 2])


1
2
2

gdzie x oznacza macierz oryginalnych danych uczących, d – wektor „destination”, a xt wektor


danych testujących podanych na wytrenowany klasyfikator Bayesa.
Zaletą naiwnego klasyfikatora Bayes’a jest jego prostota, mniejsza złożoność
obliczeniowa (w porównaniu z pełnym klasyfikatorem) oraz stosunkowo skuteczne działanie
w większości zastosowań, zwłaszcza tam, gdzie dostępna jest bardzo duża liczba danych
uczących. Należy jednak pamiętać, że wynik klasyfikacji jest tworzony na podstawie

36
uszeregowania wskaźników prawdopodobieństwa przynależności do poszczególnych klas,
bez dokładnego obliczania tych prawdopodobieństw. Oznacza to, że mogą wystąpić problemy
z właściwą interpretacją wyników dla zbioru gdzie jedna z klas występuje bardzo rzadko.
Problem właściwej klasyfikacji dotyczyć może przypadków, gdy w zbiorze uczącym (wśród
atrybutów wejściowych) nie pojawi się żaden przedstawiciel klasy rzadkiej. W takim
przypadku prawdopodobieństwo przydzielenia takich atrybutów wejściowych do tej klasy jest
z definicji równe zeru.
Klasyfikator naiwny Bayes’a można stosować zarówno przy atrybutach wejściowych
binarnych (zero-jedynkowych) rozważonych powyżej jak i atrybutach typu rzeczywisto
liczbowego [11].
• W pierwszym przypadku (atrybuty typu binarnego) odpowiednie prawdopodobieństwa
P(Xj/Di) są estymowane na podstawie bazy uczącej jako względna częstotliwość
występowania próbek mających wartość prawdy atrybutu Xj w klasie Di.
• W przypadku zmiennych Xj o wartościach rzeczywistych zamiast wyznaczania kolejnych
wartości numerycznych prawdopodobieństwa P(Xj/Di) w i-tej klasie estymuje się wartość
P(x/Di) dla całego wektora x poprzez zastosowanie wielowymiarowej funkcji Gaussa [6]
1  1 
P(x / Di )  exp  − (x − mi )T Si−1 (x − mi )  (4.15)
( 2 )  
N /2 1/2
Si 2

W zależności tej x oznacza wektor atrybutów wejściowych x=[X1,X2, …, XN]T, mi


reprezentuje wartość średnią wektorów x należących do i-tej klasy a Si macierz
kowariancji atrybutów wejściowych dla i-tej klasy.
Obliczenia upraszczają się w przypadku danych spełniających warunek niezależności. W tym
przypadku wyrażenie na prawdopodobieństwo łączne P(x / Di ) funkcji gaussowskiej jest
równe iloczynowi prawdopodobieństw zmiennych indywidualnych i zapisuje się w postaci
P(x / Di )  Gauss( x1 / Di )  Gauss( x2 / Di ) Gauss( xN / Di ) (4.16)
przy czym prawdopodobieństwa indywidualne określane są wzorem
1  1 
Gauss( xk / Di ) = exp  − 2 ( xik − mik )2  (4.17)
2  2 ik 
2
ik

W wyrażeniu tym i oznacza klasę, k – numer zmiennej w wektorze x,  ik2 wariancję zmiennej
xk w i-tej klasie, mik - wartość średnią zmiennej xk w i-tej klasie.

Jako przykład rozpatrzymy naiwny klasyfikator Bayesa działający na liczbach


rzeczywisto-liczbowych stanowiących wektor 2-wymiarowy. Dane pomiarowe w postaci

37
macierzy zmiennych wejściowych X i przynależności klasowej d uzyskane w sześciu
obserwacjach są jak poniżej. Zakłada się niezależność poszczególnych zmiennych.

1 1  1 
1 2  1 
   
 2 1.5 1 
X=  d= 
1 3  2
3 2  2
   
 3 3   2 

Zgodnie z procedurą przedstawioną powyżej określa się wartości wariancji i średnie klasowe
dla poszczególnych zmiennych (pierwszy indeks oznacza klasę, drugi zmienną).

Wariancje zmiennych w klasie: var11=0.33, var12=0.25, var21=1.33, var22=0.33

Średnie klasowe zmiennych: m11=1.333, m12=1.500, m21=2.33, … m22=2.667

Przyjmijmy wektor testowy w postaci xt=[1.5 0]

Po wstawieniu tych wartości do wzorów (4.16) i (4.17) otrzymuje się

Gauss(xt(1)/D1)=0.6628

Gauss(xt(2)/D1)=0.0891

Gauss(xt(1)/D2)=0.1189

Gauss(xt(2)/D2)= 5.0878e-04

Stąd wskaźniki prawdopodobieństwa przynależności wektora xt do klasy pierwszej i drugiej


wynoszą

P(D1/xt)=0.6628*0.0891=0.0059

P(D2/xt)=0.1189*5.0878e-04=6.0494e-05

Wektor xt przynależeć będzie do klasy pierwszej. Identyczny wynik otrzymuje się przy
wykorzystaniu funkcji fitcnb Matlaba.

4.4 Przykład zastosowania implementacji naiwnego klasyfikatora Bayes’a

Matlab oraz Python posiadają rozbudowany zbiór funkcji wspomagających


implementację modelu naiwnego klasyfikator Bayes’a [2,49]. W przypadku Matlaba [49] do
głównych należą: funkcja fitcnb tworząca model bayesowski, funkcja predict analizująca
działanie wytrenowanego klasyfikatora na danych wejściowych testujących oraz funkcja
posteriori obliczająca prawdopodobieństwo przynależności zmiennych wejściowych (wektora

38
x) do klasy. W przypadku Pythona klasy implementujące klasyfikator znajdują się w pakiecie
naive_bayes modułu ScikitLearn [61].

Ich użycie w programie może być następujące:

MATLAB Python

model = fitcnb(x, klasa) – funkcja budująca model=CategoricalNB()


model.fit(x,d);
model Bayesa na podstawie danych uczących
zawierających zbiór wektorów x oraz ich
przynależność do klasy

klasa_odtw=model.predict(x) – funkcja
klasa_odtw=model.predict(xt)
analizująca działanie wytrenowanego klasyfikatora
na danych wejściowych i przypisująca klasę
estymowaną przez model do zadanych wartości
zbioru wektorów x

Obliczenie dokładnej wartości prawdopodobieństwa przynależności atrybutów wejściowych


zgromadzonych w wektorze xtest do klasy jest również możliwe przy użyciu komendy
MATLAB Python
[klasa,posterior] = predict(model,xtest) klasa =model.predict(xt)
posterior=model.predict_proba(xt)

Poniżej przedstawiono fragment programu uczenia i testowania naiwnego klasyfikatora


Bayesa na losowych danych dwuwymiarowych tworzących wektor x przypisanych do 2 klas
(wektor klasa).
MATLAB Python
from numpy.matlib import repmat
% Klasyfikator Bayesa from sklearn.naive_bayes import GaussianNB
% from sklearn.metrics import confusion_matrix
% Generacja danych uczących 2 klas
x1=randn(20,2); x1=np.random.randn(20,2);
x2=repmat([1.5 2.1],20,1)+randn(20,2); x2=repmat([1.5,2.1],20,1)+np.random.randn(20,2);
xucz=[x1;x2];
figure(1) xucz= np.concatenate( (x1,x2) );
plot(x1(:,1),x1(:,2),'o', ... print(xucz)
x2(:,1),x2(:,2),'rx')
title('dane uczące') plt.subplot(1,2,1)
klasa=[repmat('klasa1',20,1) plt.plot(x1[:,0],x1[:,1],'o',
repmat('klasa2',20,1)]; x2[:,0],x2[:,1],'rx')
plt.title('dane uczące')
klasa=np.concatenate( (repmat(1,20,1),
repmat(2,20,1)));
% Budowa modelu klasyfikatora Bayes'a
# Budowa modelu klasyfikatora Bayes'a
model = fitcnb(xucz,klasa);
# dla cech będących liczbami rzeczywistymi
% Tryb odtwarzania danych uczących
model=GaussianNB()
Klas_ucz = model.predict(xucz);
model.fit(xucz,klasa[:,0]);

% Macierz niezgodności # Tryb odtwarzania danych uczących

39
CMatrix_ucz = confusionmat(klasa,Klas_ucz) Klas_ucz = model.predict(xucz);

# Macierz niezgodności
% Generacja danych testujących 2 klas
CMatrix_ucz = confusion_matrix(klasa,Klas_ucz)
x1=randn(20,2);
print(CMatrix_ucz)
x2=repmat([1.4 2.2],20,1)+randn(20,2);
xtest=[x1;x2];
# Generacja danych testujących 2 klas
klasa=[repmat('klasa1',20,1)
x1=np.random.randn(20,2);
repmat('klasa2',20,1)];
x2=repmat([1.4,2.2],20,1)+np.random.randn(20,2);
figure(2)
plot(x1(:,1),x1(:,2),'o', ...
xtest=np.concatenate( (x1,x2) );
x2(:,1),x2(:,2),'rx')
klasa=np.concatenate( (repmat(1,20,1),
title('dane testujace')
repmat(2,20,1)));
plt.subplot(1,2,2)
plt.plot(x1[:,0],x1[:,1],'o',
x2[:,0],x2[:,1],'rx')
plt.title('dane testujace')

# Testowanie na danych testujących


% Testowanie na danych testujących Klas_test = model.predict(xtest);
Klas_test = model.predict(xtest); # Macierz niezgodności
% Macierz niezgodności CMatrix_test = confusion_matrix(klasa,Klas_test)
CMatrix_test = confusionmat(klasa,Klas_test) print(CMatrix_test)
[label, posterior] = predict(model,xtest) label = model.predict(xtest)
posteriori = model.predict_log_proba(xtest)

Rys. 4.1 przedstawia rozkład danych uczących z zaznaczeniem ich przynależności do klas w
przykładzie, opisany powyższym fragmentem programu w Matlabie. Na ich podstawie został
ukształtowany model naiwnego klasyfikatora bayesowskiego.

MATLAB Python

Rys. 4.1 Rozkład danych uczących oraz testujących należących do 2 klas w


przykładzie (dane generowane losowo)

W wyniku testowania modelu na danych uczących uzyskano rezultaty przedstawione w tabeli


4.5 w postaci macierzy rozkładu klas (elementy diagonalne przedstawiają liczbę poprawnie
sklasyfikowanych danych, a element ij-ty macierzy przedstawia liczbę danych klasy i-tej

40
zakwalifikowanych przez klasyfikator jako klasa j-ta). Należy zwrócić uwagę, że wszystkie
dane są generowane losowo, więc wyniki powtórnego uruchomienia programu za każdym
razem mogą być nieco inne.

Tabela 4.5 Macierz rozkładu klas dla danych uczących


MATLAB Python

Liczba danych Liczba danych Liczba danych Liczba danych


rozpoznanych rozpoznanych rozpoznanych rozpoznanych
jako klasa 1 jako klasa 2 jako klasa 1 jako klasa 2
Liczba 19 1 Liczba 19 1
danych danych
klasy 1 klasy 1
Liczba 3 17 Liczba 1 19
danych danych
klasy 2 klasy 2

Testowanie wytrenowanego klasyfikatora zostało przeprowadzone na innym zbiorze losowo


wygenerowanych danych o rozkładzie przedstawionym na rys. 4.1. W wyniku testowania
tego zbioru uzyskano rezultaty rozpoznania klas jak przedstawiono w tabeli 4.6. Wynik
rozpoznania danych testujących niebiorących udziału w uczeniu dla Pythona jest nieco gorszy
(5 błędów rozpoznania klas dla 40 danych testujących). Pogorszenie się dokładności
rozpoznania klas wynika z aktualnego (innego niż dla danych uczących) rozkładu losowego
danych. Zauważmy, że w zbiorze testującym jest większa liczba danych należących do klas
przeplatających się.

Tabela 4.6 Macierz rozkładu klas dla danych testujących


MATLAB Python

Liczba danych Liczba danych Liczba danych Liczba danych


rozpoznanych rozpoznanych rozpoznanych rozpoznanych
jako klasa 1 jako klasa 2 jako klasa 1 jako klasa 2
Liczba 19 1 Liczba 19 1
danych danych
klasy 1 klasy 1
Liczba 0 20 Liczba 4 16
danych danych
klasy 2 klasy 2

Ostatnia linia programu generuje wartości dokładne prawdopodobieństwa przynależności


poszczególnych danych testujących do obu klas w postaci

41
MATLAB Python
[label, posterior] = [ list(map(lambda r: ('Klasa 1' if r[0] == 1
'klasa2 ' 0.1183 0.8817 else 'Klasa 2',
'klasa1 ' 0.6748 0.3252 f"{r[1]:.2}",f"{r[2]:.2}"),
'klasa1 ' 0.8492 0.1508 np.concatenate(
'klasa1 ' 0.9457 0.0543 (label[:,None], posteriori),
'klasa1 ' 0.8421 0.1579 axis=1) ))
'klasa1 ' 0.9309 0.0691
'klasa1 ' 0.6845 0.3155 [('Klasa 1', '1.0', '0.00075'),
'klasa1 ' 0.9003 0.0997 ('Klasa 1', '0.92', '0.083'),
'klasa1 ' 0.9552 0.0448 ('Klasa 1', '1.0', '0.00014'),
'klasa1 ' 0.9377 0.0623 ('Klasa 1', '1.0', '0.00079'),
'klasa1 ' 0.9815 0.0185 ('Klasa 1', '1.0', '5.4e-06'),
'klasa1 ' 0.5698 0.4302 ('Klasa 1', '1.0', '0.00082'),
'klasa1 ' 0.9656 0.0344 ('Klasa 1', '0.99', '0.0089'),
'klasa1 ' 0.8369 0.1631 ('Klasa 1', '1.0', '0.00094'),
'klasa1 ' 0.9923 0.0077 ('Klasa 1', '1.0', '0.00066'),
'klasa1 ' 0.9830 0.0170 ('Klasa 1', '1.0', '0.0011'),
'klasa1 ' 0.9315 0.0685 ('Klasa 1', '1.0', '0.0023'),
'klasa1 ' 0.5214 0.4786 ('Klasa 1', '1.0', '0.0017'),
'klasa1 ' 0.6312 0.3688 ('Klasa 1', '0.9', '0.1'),
'klasa1 ' 0.8195 0.1805 ('Klasa 1', '0.93', '0.071'),
'klasa2 ' 0.0001 0.9999 ('Klasa 1', '0.99', '0.011'),
'klasa2 ' 0.1035 0.8965 ('Klasa 1', '1.0', '1e-05'),
'klasa2 ' 0.0001 0.9999 ('Klasa 1', '0.99', '0.0063'),
'klasa2 ' 0.0489 0.9511 ('Klasa 1', '1.0', '0.0027'),
'klasa2 ' 0.0155 0.9845 ('Klasa 1', '0.98', '0.022'),
'klasa2 ' 0.0000 1.0000 ('Klasa 2', '0.41', '0.59'),
'klasa2 ' 0.0000 1.0000 ('Klasa 2', '0.0019', '1.0'),
'klasa2 ' 0.0400 0.9600 ('Klasa 2', '0.014', '0.99'),
'klasa2 ' 0.0364 0.9636 ('Klasa 2', '0.077', '0.92'),
'klasa2 ' 0.0002 0.9998 ('Klasa 2', '0.045', '0.96'),
'klasa2 ' 0.2852 0.7148 ('Klasa 2', '0.011', '0.99'),
'klasa2 ' 0.0016 0.9984 ('Klasa 2', '0.013', '0.99'),
'klasa2 ' 0.0020 0.9980 ('Klasa 2', '0.083', '0.92'),
'klasa2 ' 0.0005 0.9995 ('Klasa 1', '0.62', '0.38'),
'klasa2 ' 0.0001 0.9999 ('Klasa 2', '0.086', '0.91'),
'klasa2 ' 0.0269 0.9731 ('Klasa 2', '0.044', '0.96'),
'klasa2 ' 0.0068 0.9932 ('Klasa 1', '0.52', '0.48'),
'klasa2 ' 0.0387 0.9613 ('Klasa 2', '0.051', '0.95'),
'klasa2 ' 0.0066 0.9934 ('Klasa 1', '0.83', '0.17'),
'klasa2 ' 0.0004 0.9996 ] ('Klasa 2', '0.00012', '1.0'),
('Klasa 1', '0.98', '0.015'),
('Klasa 2', '0.0075', '0.99'),
('Klasa 2', '0.15', '0.85'),
('Klasa 2', '0.07', '0.93'),
('Klasa 2', '0.2', '0.8'),
('Klasa 2', '0.26', '0.74')]

42

You might also like