Professional Documents
Culture Documents
Rozdz4 Bayes
Rozdz4 Bayes
Rozdz4 Bayes
4.1 Wprowadzenie
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.
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
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
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
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 )
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
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
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
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 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
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 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.
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ą).
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
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.
38
x) do klasy. W przypadku Pythona klasy implementujące klasyfikator znajdują się w pakiecie
naive_bayes modułu ScikitLearn [61].
MATLAB Python
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
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')
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
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.
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