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,\ldots, L\}\) jest przestrzenią decyzyjną. Prawdopodobieństwa pojawiania się obiektów z poszczególnych klas to prawdopodobieństwa a priori \(P(J=j)=p_j\) dla \(j\in 1,\ldots, L\). Jest to rozkład dyskretnej zmiennej losowej \(J\). Wektor losowy cech \(X\) dla każdego \(j\in\{1,\ldots,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\in\mathbb{R}^d\). 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 \(p_j(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, \(m_j\) jest d-wymiarowym wektorem wartości średnich, \(\Sigma_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łą \(\frac{d}{2}\ln{2\pi}\) 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 \(\Sigma_j=\Sigma\) dla każdego \(j\in\{1,\ldots, l\}\). Wówczas po usunięciu jednakowego dla wszystkich klas czynnika \(\frac{1}{2}\ln{|\Sigma|}\) 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 \(x^T\Sigma^{-1}x\) 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ę \(\sigma^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-m_j)^T(x-m_j)\) i usunięciu wspólnego dla wszystkich klas czynnika \(x^Tx\) otrzymujemy następujący wzór na funkcję dyskryminacyjną
gdzie \(w_j=\frac{1}{\sigma^2}m_j\), \(w_0=-\frac{1}{2\sigma^2}m_j^Tm_j+\ln{p_j}\). 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 \(N_j\) 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)