Anda di halaman 1dari 8

Optimal Bayes Classifier

Notebook ini merangkum teori dan derivasi dari pengklasifikasi bayes yang optimal. Ini kemudian
memberikan perbandingan batas pengklasifikasi Optimal dan Naif.

Latar belakang dan teori


Pertimbangkan sekarang bahwa alih-alih memiliki variabel output kontinu YY, kami malah memiliki
variabel output kategorikal GG. Model ini diringkas sebagai

 Input : mathbfX in mathbbRp mathbfX in mathbbRp berasal dari pp dimensi ruang


 Klasifikasi output mathbfG in mathcalG mathbfG in mathcalG di
mana mathbfG mathbfG adalah variabel acak yang berhubungan dengan nilai output
diskrit, dan mathcalG mathcalG adalah ruang output diskrit.
 Distribusi bersama pada input dan
output Pr(X,G)=[(x1,g1),(x1,g2)...(xm,gm)]Pr(X,G)=[(x1,g1),(x1,g2)...(xm,gm)]
 Sasarannya adalah mempelajari
fungsi f(x): mathbbRp rightarrow mathcalGf(x): mathbbRp rightarrow mathcalG yang
mengambil input dari ruang input pp dimensi dan memetakannya ke ruang output diskrit

Langkah pertama adalah memutuskan fungsi kerugian yang sesuai, karena \ qq {kuadrat kerugian)
yang biasa tidak sesuai untuk output diskrit. Sebagai gantinya kita akan menggunakan fungsi \ qq {0-
1 loss} sederhana yang didefinisikan sebagai berikut.

Tetapkan kerugian sebagai K kaliKK kaliK matriks, di


mana K=kartu( mathcalG)K=kartu( mathcalG) di mana matriks akan memiliki 0 pada nilai diagonal
dan non-negatif. Jadi kerugian L(k,l)L(k,l) adalah k,lk,l entri dari matriks, dan merupakan biaya untuk
mengklasifikasikan kk sebagai ll. Misalnya, dalam kasus 3 kelas yang bisa kita dapatkan
\ begin {bmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \ end {bmatrix} \ begin {bmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\
1 & 1 & 0 \ end {bmatrix}

Yang berarti kita dapat menulis fungsi kerugian 0 - 1 sebagai:

\ begin {aligned} L (k, l) & \ begin {cases} 0 & \ text {if} \ k = l \\ 1 & \ text {if} \ k \ neq l \ end {cases} \\
L (k, l) & = \ mathcal {I} (k \ neq l) = 1 - \ mathcal {I} (k = l) \ end {aligned}

Karenanya, Perkiraan Kesalahan yang Diharapkan (EPE) adalah:

EPE( hatf(x))=E[L(G, hatf(X))]EPE( hatf(x))=E[L(G, hatf(X))]


Di mana harapan diambil sehubungan dengan distribusi gabungan Pr(X,G)Pr(X,G). Sekali lagi kita
dapat mengkondisikan pada XX untuk mendapatkan $$ EPE (\ hat f (x)) = E_X E_ {G | X} [L (G, \ hat
f (X)) | X]
EPE (\ hat f (x)) = E_X \ sum_ {k = 1} ^ KL [k, \ hat f (X)] Pr (k | X) $$
Di mana k=1,...,Kk=1,...,K adalah semua nilai yang mungkin diambil oleh variabel acak GG, yaitu
set mathcalG mathcalG. Perhatikan bahwa ini adalah versi diskrit yang analog dengan derivasi yang
dibahas pada bagian sebelumnya.
Karena kami ingin meminimalkan kerugian yang diharapkan, kami dapat melakukan hal berikut:

\ begin {aligned} \ hat f (x) & = argmin_g \ sum_ {k = 1} ^ KL [k, g] Pr (k | X) \\ & = argmin_g \ sum_ {k
= 1} ^ K (1 - \ mathcal {I} (k = g)) Pr (k | X) \\ & = argmax_g \ sum_ {k = 1} ^ K \ mathcal {I} (k = g) Pr
(k | X) \ end {sejajar}

Karena fungsi indikator adalah 11 ketika k=gk=g kita dapatkan


hatf(x)=argmaxgPr(g|X=x)=PETA hatf(x)=argmaxgPr(g|X=x)=PETA
Dengan kata lain, aturan keputusan Bayes yang optimal adalah memilih kelas yang menyajikan
probabilitas posterior maksimum, mengingat pengamatan khusus yang ada. Penggolong seperti ini
disebut Bayes Optimal Classifier atau Maximum a Posteriori .

Karena, untuk pengamatan yang diberikan xx, distribusi marginal dari p(x)p(x) adalah konstan dalam
penyebut teorema Bayes, kita dapat menyederhanakan aturan keputusan ini lebih lanjut sebagai:

\ begin {aligned} \ hat f (x) & = argmax_g Pr (g | X = x) \\ & = argmax_g \ frac {Pr (x | g) p (g)} {p (x)} \\
& = argmax_g Pr (x | g) p (g) \\ & = argmax_g \ log Pr (x | g) + \ log p (g) \ end {aligned}
Formulir ini memperjelas bahwa aturan keputusan MAP mencoba untuk mencapai kompromi antara
harapan a priori p(g)p(g) dan bukti yang diberikan oleh data melalui fungsi
kemungkinan p(x|g)p(x|g).

Optimal Bayes Classifier


Optimal Bayes classifier memilih kelas yang memiliki kemungkinan kejadian posteriori terbesar
(disebut maksimum a posteriori estimation, atau MAP ). Dapat ditunjukkan bahwa dari semua
pengklasifikasi, pengklasifikasi Optimal Bayes adalah salah satu yang akan memiliki probabilitas
terendah miss mengklasifikasikan pengamatan, yaitu probabilitas kesalahan terendah. Jadi jika kita
tahu distribusi posterior, maka menggunakan classifier Bayes sama baiknya dengan yang didapat.

Dalam kehidupan nyata, kita biasanya tidak tahu distribusi posterior, tetapi kita
memperkirakannya. Pengklasifikasi Naive Bayes mendekati pengelompokan Bayes optimal
dengan melihat distribusi empiris dan dengan mengasumsikan independensi para prediktor. Jadi
pengklasifikasi Naif Bayes itu sendiri tidak optimal, tetapi mendekati solusi optimal.

Sumber
 https://stats.stackexchange.com/questions/92180/expected-prediction-error-derivation
 Elemen Pembelajaran Statistik ESL
 http://www.lx.it.pt/~mtf/learning/Bayes_lecture_notes.pdf
 https://www.youtube.com/watch?time_continue=28&v=pFtiNSmJuoE

Implementasi
impor numpy sebagai np
impor panda sebagai pd
dari matplotlib import pyplot as plt
impor matplotlib.colors sebagai warna
impor seaborn sebagai sns
impor itertools
dari norma impor scipy.stats
impor scipy.stats
dari sklearn.naive_bayes impor GaussianNB

% matplotlib sebaris
sns . set ()
def predict_Bayes_class ( X , mu_list , sigma_list ):
#Kembalikan kelas prediksi dari pengklasifikasi bayes yang optimal - distribusi
harus diketahui
Score_list = []
kelas = len ( mu_list )

untuk p dalam kisaran ( kelas ):


skor = cipy . statistik . multivariate_normal . pdf ( X , mean = mu_list
[ p ], cov = sigma_list [ p ])
score_list . tambahkan ( skor )

kembali np . argmax ( score_list )

Membandingkan Optimal Bayes dan Naive


Bayes menggunakan data Gaussian yang
disimulasikan
Kovarians yang kuat
np . acak . seed ( seed = 3 )

mu1 = [ 2 , 2 ]
sigma1 = [[ 5 , - 4 ], [ - 4 , 5 ]]
x1 , y1 = np . acak . multivariate_normal ( mu1 , sigma1 , 100 ) . T

mu2 = [ - 2 , - 2 ]
sigma2 = [[ 3.5 , 3 ], [ 3 , 3.5 ]]
x2 , y2 = np . acak . multivariate_normal ( mu2 , sigma2 , 100 ) . T

mu_list = [ mu1 , mu2 ]


sigma_list = [ sigma1 , sigma2 ]
color_list = [ 'darkblue' , 'darkgreen' ]

# Distribusi 2 dimensi kami akan melebihi variabel X dan Y


N = 100
X = np . linspace ( - 8 , 8 , N )
Y = np . linspace ( - 8 , 8 , N )
X , Y = np . meshgrid ( X , Y )

# Pengaturan angka
fig = plt . gambar ( figsize = ( 16 , 7 ))
kapak = ara . add_subplot ( 1 , 2 , 1 )

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #
# Menempatkan kontur Gaussians di plot sebelah kiri
untuk saya dalam kisaran ( 2 ):
zz = np . array ( [ scipy . stats . multivariate_normal . pdf ( np . array ([ x
x , yy ]), mean = mu_list [ i ], cov = sigma_list [ i ])
untuk xx , yy di zip ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 5 , alfa = . 3 , warna = color_list [ i ])

kapak . pencar ( x1 , y1 , alpha = . 7 )


kapak . pencar ( x2 , y2 , alpha = . 7 )
kapak . set_xlabel ( 'x' )
kapak . set_ylabel ( 'y' )
kapak . set_title ( 'Plot sebar dua Gaussians' )

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #

Plot sisi kanan #Right - Penggolong Bayes Optimal


kapak = ara . add_subplot ( 1 , 2 , 2 )

# Menempatkan kontur Gaussians di plot sebelah kiri

zz = np . array ( [ predict_Bayes_class ( np . array ([ xx , yy ]), mu_list , sigma


_list )
untuk xx , yy di zip ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 1 , alfa = . 3 , warna = ( 'darkblue' , 'darkgreen' ))
kapak . contourf ( X , Y , Z , 1 , alpha = . 1 , warna = ( 'darkblue' , 'darkgreen'
))

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #
#Naive Bayes Classifier
dari sklearn.naive_bayes impor GaussianNB

#Menyiapkan data X dan y


X_data = np . asarray ( np . vstack (( np . hstack (( x1 , x2 )), np . hstack (( y1
, y2 )))) . T )
y_labels = np . hstack (( np . nol ( 100 ), np . yang ( 100 )))

Model #Cocok
model_sk = GaussianNB ( prior = Tidak ada )
model_sk . cocok ( X_data , y_labels )

#Prediksi untuk setiap titik di meshgrid


zz = np . array ( [ model_sk . prediksi ( [[ xx , yy ]])] [ 0 ] untuk xx , yy di zi
p ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 1 , alfa = . 3 , warna = ( 'merah' ))

kapak . pencar ( x1 , y1 , alpha = . 7 )


kapak . pencar ( x2 , y2 , alpha = . 7 )
kapak . set_xlabel ( 'x' )
kapak . set_ylabel ( 'y' )
kapak . set_title ( 'Optimal (biru) vs Naif (red) Bayes' )

plt . tampilkan ()

Akurasi
Akurasi #Optimal Bayes
y_pred = np . array ( [ predict_Bayes_class ( np . array ([ xx , yy ]), mu_list , s
igma_list )
untuk xx , yy di zip ( np . ravel ( X_data [:, 0 ]), np . ravel
( X_data [:, 1 ])) ] ))
display ( np . mean ( y_pred == y_labels ))

Akurasi #Naive Bayes


display ( skor model_sk . ( X_data , y_labels ))
0,965
0,95
Membandingkan Optimal Bayes dan Naive Bayes - zero
covariance
np . acak . seed ( seed = 2 )

mu1 = [ 2 , 2 ]
sigma1 = [[ 5 , 0 ], [ 0 , 5 ]]
x1 , y1 = np . acak . multivariate_normal ( mu1 , sigma1 , 100 ) . T

mu2 = [ - 2 , - 2 ]
sigma2 = [[ 3 , 0 ], [ 0 , 3 ]]
x2 , y2 = np . acak . multivariate_normal ( mu2 , sigma2 , 100 ) . T

mu_list = [ mu1 , mu2 ]


sigma_list = [ sigma1 , sigma2 ]
color_list = [ 'darkblue' , 'darkgreen' ]

# Distribusi 2 dimensi kami akan melebihi variabel X dan Y


N = 100
X = np . linspace ( - 8 , 8 , N )
Y = np . linspace ( - 8 , 8 , N )
X , Y = np . meshgrid ( X , Y )

# Pengaturan angka
fig = plt . gambar ( figsize = ( 16 , 7 ))
kapak = ara . add_subplot ( 1 , 2 , 1 )

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #

# Menempatkan kontur Gaussians di plot sebelah kiri


untuk saya dalam kisaran ( 2 ):
zz = np . array ( [ scipy . stats . multivariate_normal . pdf ( np . array ([ x
x , yy ]), mean = mu_list [ i ], cov = sigma_list [ i ])
untuk xx , yy di zip ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 5 , alfa = . 3 , warna = color_list [ i ])

kapak . pencar ( x1 , y1 , alpha = . 7 )


kapak . pencar ( x2 , y2 , alpha = . 7 )
kapak . set_xlabel ( 'x' )
kapak . set_ylabel ( 'y' )
kapak . set_title ( 'Plot sebar dua Gaussians' )

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #

Plot sisi kanan #Right - Penggolong Bayes Optimal


kapak = ara . add_subplot ( 1 , 2 , 2 )
# Menempatkan kontur Gaussians di plot sebelah kiri

zz = np . array ( [ predict_Bayes_class ( np . array ([ xx , yy ]), mu_list , sigma


_list )
untuk xx , yy di zip ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 1 , alfa = . 3 , warna = ( 'darkblue' , 'darkgreen' ))
kapak . contourf ( X , Y , Z , 1 , alpha = . 1 , warna = ( 'darkblue' , 'darkgreen'
))

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. %%%%%%%%%%%%%%%%%%%
%% # #
#Naive Bayes Classifier
dari sklearn.naive_bayes impor GaussianNB

#Menyiapkan data X dan y


X_data = np . asarray ( np . vstack (( np . hstack (( x1 , x2 )), np . hstack (( y1
, y2 )))) . T )
y_labels = np . hstack (( np . nol ( 100 ), np . yang ( 100 )))

Model #Cocok
model_sk = GaussianNB ( prior = Tidak ada )
model_sk . cocok ( X_data , y_labels )

#Prediksi untuk setiap titik di meshgrid


zz = np . array ( [ model_sk . prediksi ( [[ xx , yy ]])] [ 0 ] untuk xx , yy di zi
p ( np . ravel ( X ), np . ravel ( Y )) ] )

#Mengubah kelas yang diprediksi ke dalam bentuk meshgrid


Z = zz . membentuk kembali ( bentuk X )

# Pasang kontur
kapak . kontur ( X , Y , Z , 1 , alfa = . 3 , warna = ( 'merah' ))

kapak . pencar ( x1 , y1 , alpha = . 7 )


kapak . pencar ( x2 , y2 , alpha = . 7 )
kapak . set_xlabel ( 'x' )
kapak . set_ylabel ( 'y' )
kapak . set_title ( 'Optimal (biru) vs Naif (red) Bayes' )

plt . tampilkan ()
Akurasi
Akurasi #Optimal Bayes
y_pred = np . array ( [ predict_Bayes_class ( np . array ([ xx , yy ]), mu_list , s
igma_list )
untuk xx , yy di zip ( np . ravel ( X_data [:, 0 ]), np . ravel
( X_data [:, 1 ])) ] ))
display ( np . mean ( y_pred == y_labels ))

Akurasi #Naive Bayes


display ( skor model_sk . ( X_data , y_labels ))
0,91
0,91

https://xavierbourretsicotte.github.io/Optimal_Bayes_Classifier.html

Anda mungkin juga menyukai