\(P(A\cap B)=P(A\mid B)\cdot P(B)\); jeżeli \(A\) i \(B\) są niezależne, to \(P(A\cap B)=P(A)\cdot P(B)\)
\(P(A\cap B)=P(B\mid A)\cdot P(A) \rightarrow P(A\mid B)\cdot P(B)=P(B\mid A)\cdot P(A)\)
\(x=(x_1, \ldots, x_n)\) – wektor wartości niezależnych predyktorów
\(C_k\) – klasa, wartość zmiennej zależnej
\(p(C_k\mid {x_1, \ldots, x_n})\) – prawdopodobieństwo, że obserwacja \(x\) należy do klasy \(C_k\)
Z twierdzenie Bayesa: \(p(C_k\mid x)=\frac{p(C_k)\cdot p(x\mid C_k)}{p(x)}\)
\(posteriori=\frac{priori\cdot wiarogodność}{dowód}\); ang. \(posterior=\frac{prior\cdot likelihood}{evidence}\)
licznik: \(p(C_k)\cdot p(x\mid C_k)=p(x_1, \ldots, x_n, C_k)=\)1
\(\begin{aligned} =p(x_1\mid x_2, \ldots, x_n, C_k)\cdot p(x_2\mid x_3, \ldots, C_k)\cdot\ldots\cdot p(x_{n-1}\mid x_n, C_k)\cdot p(x_n\mid C_k)\cdot p(C_k) \end{aligned}\)
Naiwność – założenie niezależności wszystkich predyktorów pod warunkiem \(C_k\)
\(\begin{aligned} p(x_i\mid x_{i+1}, \ldots, x_n, C_k)=p(x_i\mid C_k) \end{aligned}\)
licznik: \(p(C_k)\cdot\prod_{i=1}^n{p(x_i\mid C_k)}\)
mianownik: \(p(x)=\sum_k{p(C_k)\cdotp(x\mid C_k)}\) jest stały dla \(x\) i dlatego pomijany w poniższej formule
\[\hat{y}=\underset{k}{\operatorname{arg\,max}}\left(p(C_k)\cdot\prod_{i=1}^n {p(x_i\mid C_k)}\right)\]
Dla nowej obserwacji \(\nu\): \(p(x=\nu\mid C_k)=\frac{1}{\sqrt{2\pi \sigma_k^2}}e^{-\frac{(\nu-\mu_k)^2}{2\sigma_k^2}}\)
Wczytanie niezbędnych pakietów.
library(e1071)
library(caret)
Ustawienie ziarna generatora liczb pseudolosowych.
set.seed(NULL)
Wczytanie zbioru danych.
Wszystkie kolumny przyjmują wartości nominalne. Opis zbioru w pliku /usr/miswdm/house-votes-84.names
oraz pod adresem Congressional Voting Records Data Set.
data<-read.table('/usr/miswdm/house-votes-84.data', sep=',', header=F, na.strings='?')
colnames(data)<-c(
'Class',
'handicapped.infants',
'water.project.cost.sharing',
'adoption.of.the.budget.resolution',
'physician.fee.freeze',
'el.salvador.aid',
'religious.groups.in.schools',
'anti.satellite.test.ban',
'aid.to.nicaraguan.contras',
'mx.missile',
'immigration',
'synfuels.corporation.cutback',
'education.spending',
'superfund.right.to.sue',
'crime',
'duty.free.exports',
'export.administration.act.south.africa')
Usunięcie rekordów niezawierających danych w przynajmniej jednej kolumnie (wartość NA
).
data<-data[complete.cases(data),]
Podział na zbiór uczący i walidujący.
partition<-createDataPartition(data$Class, p=.75, list=F)
data.train<-data[partition,]
data.test<-data[-partition,]
model<-naiveBayes(Class~., data=data.train)
Tabele prawdopodobieństw warunkowych (ang. Conditional Probability Tables).
head(model$tables, 3)
$handicapped.infants
handicapped.infants
Y n y
democrat 0.4193548 0.5806452
republican 0.7530864 0.2469136
$water.project.cost.sharing
water.project.cost.sharing
Y n y
democrat 0.5591398 0.4408602
republican 0.5185185 0.4814815
$adoption.of.the.budget.resolution
adoption.of.the.budget.resolution
Y n y
democrat 0.1505376 0.8494624
republican 0.8271605 0.1728395
Macierz pomyłek.
data.pred <- predict(model, data.test, type = "class")
cm <- table(data.pred, data.test$Class, dnn = c("Predicted", "Actual"))
Actual
Predicted democrat republican
democrat 27 2
republican 4 25
democrat
:republican
:democrat
:republican
:democrat
:republican
:Dokładny opis dostępny pod adresem Vertebral Column Data Set.
vertebral<-read.table('/usr/miswdm/column_3C.dat')
colnames(vertebral)<-c(
'pelvic incidence',
'pelvic tilt',
'lumbar lordosis angle',
'sacral slope',
'pelvic radius',
'grade of spondylolisthesis',
'class')
Klasy (kolumna class
):
Podział na zbiór trenujący i walidujący.
partition<-createDataPartition(vertebral$class, p=.75, list=FALSE)
vertebral.train<-vertebral[partition,]
vertebral.test<-vertebral[-partition,]
Wytrenowanie modelu.
model<-naiveBayes(vertebral.train[,-7], vertebral.train$class)
Alternatywnie.
model<-naiveBayes(class~., data=vertebral.train)
$`pelvic incidence`
pelvic incidence
vertebral.train$class [,1] [,2]
DH 48.56933 10.96031
NO 52.21853 13.03602
SL 71.60097 15.37070
$`pelvic tilt`
pelvic tilt
vertebral.train$class [,1] [,2]
DH 17.82356 6.632966
NO 12.79120 7.070293
SL 20.97053 12.073815
$`lumbar lordosis angle`
lumbar lordosis angle
vertebral.train$class [,1] [,2]
DH 36.08911 9.897192
NO 44.45800 12.985196
SL 63.52186 16.421478
vertebral.pred<-predict(model, vertebral.test, type='class')
tt<-table(Predicted=vertebral.pred, Actual=vertebral.test$class)
Actual
Predicted DH NO SL
DH 13 7 0
NO 2 18 2
SL 0 0 35
Obliczenia pomocnicze.
diag<-diag(tt)
rowsums<-apply(tt, 1, sum)
colsums<-apply(tt, 2, sum)
Rozpisanie łącznego / wspólnego (ang. joint) rozkładu prawdopodobieństwa zmiennych losowych przy użyciu reguły łańcuchowej (ang. chain rule)↩