Optymalny klasyfikator statystyczny¶
Zadanie klasyfikacji nadzorowanej (por. [Stapor2005], [Stapor2011]) można rozpatrywać w kategoriach probabilistycznych (por. [Greblicki1974], [Berger1985]). Wówczas przestrzeń obserwacji to zbiór wszystkich możliwych wartości wektora cech, natomiast zbiór wszystkich numerów klas I={1,2,…,L} jest przestrzenią decyzyjną. Prawdopodobieństwa pojawiania się obiektów z poszczególnych klas to prawdopodobieństwa a priori P(J=j)=pj dla j∈1,…,L. Jest to rozkład dyskretnej zmiennej losowej J. Wektor losowy cech X dla każdego j∈{1,…,k} ma natomiast rozkład prawdopodobieństwa wyrażony gęstością warunkową cech w klasie daną wzorem
Gęstość bezwarunkowa zmiennej X wyraża się wzorem
Przyjmujemy, że f(x)>0 dla każdego x∈Rd. Obliczmy teraz prawdopodobieństwo warunkowe, że obiekt, któremu odpowiada wektor x należy do klasy j tzn.:
Stosując wzór Bayesa otrzymujemy
Przyjmując oznaczenia
otrzymujemy
Prawdopodobieństwo pj(x) nazywamy prawdopodobieństwem a posteriori klasy j. Optymalny klasyfikator statystyczny (klasyfikator Bayesa) obiekt reprezentowany przez wektor cech x przyporządkowuje do tej klasy dla której wartość prawdopodobieństwa a posteriori jest największa. Ponieważ dla dowolnego wektora cech x wartość f(x) jest stała a więc reguła decyzyjna klasyfikatora Bayesa jest następująca
Ponieważ logarytm jest funkcją rosnącą a więc powyższą regułę można również zapisać w równoważnej postaci
Często spotykamy się z przypadkiem kiedy rozkłady wektorów cech pochodzą z wielowymiarowego rozkładu normalnego. Mamy wówczas do czynienia ze szczególnym przypadkiem klasyfikatora Bayesa czyli klasyfikatorem gaussowskim. Funkcje gęstości d-wymiarowego rozkładu normalnego dane są wzorami
gdzie x jest d-wymiarowym wektorem cech, mj jest d-wymiarowym wektorem wartości średnich, Σj macierzą kowariancji w klasie j. Po podstawieniu (1) uzyskujemy ogólny wzór na funkcje dyskryminacyjne klasyfikatora gaussowskiego
Po zlogarytmowaniu otrzymujemy
Pomijając stałą d2ln2π otrzymujemy funkcje klasyfikujące dla klasyfikatora gaussowskiego
Z powyższego wzoru wynika, że w ogólnym przypadku funkcja klasyfikująca jest funkcją kwadratową, co z kolei oznacza, że powierzchnie rozdzielające w przestrzeni cech są hiperpłaszczyznami drugiego stopnia a ich typ zależy od parametrów rozkładu cech. W przypadku dwuwymiarowej przestrzeni cech mamy do czynienia z krzywymi płaskimi drugiego stopnia.
Załóżmy, że macierze kowariancji we wszystkich klasach są takie same tzn Σj=Σ dla każdego j∈{1,…,l}. Wówczas po usunięciu jednakowego dla wszystkich klas czynnika 12ln|Σ| otrzymujemy następującą funkcję dyskryminacyjną
Można pokazać, że po dokonaniu w powyższym wzorze szeregu mnożeń a następnie usunięciu stałego dla wszystkich klas czynnika xTΣ−1x uzyskujemy uproszczoną postać wzoru funkcji dyskryminacyjnych
Wówczas funkcje dyskryminacyjne są funkcjami liniowymi, co z kolei oznacza, że powierzchnie rozdzielające w przestrzeni cech są hiperpłaszczyznami.
Załóżmy dodatkowo, że cechy w poszczególnych klasach są statystycznie niezależne i mają tę samą wariancję σ2 tzn
gdzie I jest macierzą jednostkową stopnia L. Wówczas po podstawieniu (3) do wzoru (2) uzyskujemy
Stąd po wymnożeniu składnika (x−mj)T(x−mj) i usunięciu wspólnego dla wszystkich klas czynnika xTx otrzymujemy następujący wzór na funkcję dyskryminacyjną
gdzie wj=1σ2mj, w0=−12σ2mTjmj+lnpj. Również w tym przypadku funkcje dyskryminacyjne są funkcjami liniowymi z czego z kolei wynika, że powierzchnie rozdzielające w przestrzeni cech są hiperpłaszczyznami. Jeśli teraz dodatkowo założymy, że prawdopodobieństwa a priori poszczególnych klas są jednakowe to uzyskamy następująca postać funkcji dyskryminacyjnej
Klasyfikator mający funkcje dyskryminacyjne powyższej postaci nazywamy klasyfikatorem minimalno-odległościowym.
Optymalna klasyfikacja bayesowska wymaga znajomości rozkładu zmiennej losowej J i warunkowej gęstości rozkładu prawdopodobieństwa cech w klasach. W praktycznych zadaniach klasyfikacji tej wiedzy na ogół nie mamy. Spotykamy się z sytuacjami gdzie znana jest postać rozkładu lecz nie są znane jego parametry lub nieznana jest nawet postać rozkładu prawdopodobieństwa. W przypadku gdy znana postać warunkowego rozkładu cech w klasach natomiast nie są znane jego parametry wówczas brakującą wiedzę rekompensujemy informacjami zawartymi w zbiorze uczącym. Zadanie polega na estymacji brakujących parametrów i wstawieniu uzyskanych wartości do funkcji klasyfikujących optymalnego algorytmu Bayesa. Algorytm uzyskany w ten sposób nazywamy Parametrycznym klasyfikatorem Bayesa. Prawdopodobieństwa a priori klas przybliżamy częstościami występowania poszczególnych klas w zbiorze uczącym tzn
gdzie N to liczebność całego zbioru uczącego, natomiast Nj to liczebność j-tej klasy. Estymacja parametrów gęstości warunkowych cech w klasach zależy od samej postaci tych gęstości i może odbywać się na przykład metodą największej wiarogodności (por. [Gren1987]).
Przykład 4
Rozważmy zbiór danych Iris. Jest to wielowymiarowy zbiór danych na temat irisów wprowadzony w 1936r. przez Rolanda Fishera. Zbiór ten zawiera 150 obiektów z trzech różnych gatunków irysów: setosa, versicolor, virginica. Każdy z obiektów jest charakteryzowany przez cztery cechy: długość (w cm.) listka kielicha kwiatowego, szerokość (w cm) listka kielicha kwiatowego, długość (w cm) płatka kwiatu, szerokość (w cm) płatka kwiatu. Zbiór ten dzielimy, w sposób losowy na dwie części: uczącą i testową w stosunku 70:30. Następnie przeprowadzamy na zbiorze uczącym proces uczenia klasyfikatora Bayesa. Sprawność klasyfikatora to prawie 98%. Jedna próbka ze zbioru testowego została błędnie zaklasyfikowana. Poniżej prezentujemy skrypt w języku python realizujący powyższą procedurę.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.cross_validation import train_test_split
#importujemy zbiór danych
iris = datasets.load_iris()
gnb = GaussianNB()
#Zbiór obiektów
X = iris.data
#Wektor poprawnej klasyfikacji obiektów
y = iris.target
y=np.array(y)
#Dzielimy losowo zbiór na dwie części
train, test, train_targets, test_targets = train_test_split(X, y,
test_size=0.30, random_state=42)
#Uczymy klasyfikator
clf = gnb.fit(train, train_targets)
#Testujemy
Z = clf.predict(test)