• Nie Znaleziono Wyników

Zakładamy, że Y = {1, 0}, f 1(~ x) = f (~ x|Y = 1), f 0(~ x) = f (~ x|Y = 0) są gęstościami p-wymiarowego rozkładu normalnego (gaussowskiego)

N/A
N/A
Protected

Academic year: 2021

Share "Zakładamy, że Y = {1, 0}, f 1(~ x) = f (~ x|Y = 1), f 0(~ x) = f (~ x|Y = 0) są gęstościami p-wymiarowego rozkładu normalnego (gaussowskiego)"

Copied!
9
0
0

Pełen tekst

(1)

Klasyfikatory Gaussowskie

Marcin Orchel

1 Wstęp

Wykorzystanie strategii estymacji funkcji gęstości i przyjęcie modelu parametrycznego dla gęstości, tj. znana jest postać gęstości z wyjątkiem tkwiących w niej parametrów.

Zakładamy, że Y = {1, 0}, f 1 (~ x) = f (~ x|Y = 1), f 0 (~ x) = f (~ x|Y = 0) są gęstościami p-wymiarowego rozkładu normalnego (gaussowskiego)

f k (~ x) = 1

(2π) p/2k | 1/2 exp



− 1

2 (~ x − ~ µ k ) T Σ −1 k (~ x − ~ µ k )



(1) Wtedy

X|Y = 1 ∼ N p 1 , Σ 1 ) (2)

X|Y = 0 ∼ N p 0 , Σ 0 ) (3)

Twierdzenie 1.1. Jeżeli X|Y = 1 ∼ N p 1 , Σ 1 ) i X|Y = 0 ∼ N p 0 , Σ 0 ) to klasyfika- tora bayesowski ma postać

d B (~ x) =

1 jeśli r 1 2 < r 2 0 + 2 ln  π π

1

0

 + ln 

0

|

1

|



0 poza tym (4)

gdzie

r i 2 = (~ x − ~ µ i ) 0 Σ −1 i (~ x − ~ µ i ) (5) dla i = 0, 1. r i to odległość Mahalanobisa.

W równoważnej postaci można go zapisać jako d B (~ x) = arg max

k δ k (~ x) (6)

gdzie

δ k (~ x) = − 1

2 ln |Σ k | − 1

2 (~ x − ~ µ k ) 0 Σ −1 k (~ x − ~ µ k ) + ln π k (7) Funkcja δ k nazywa się kwadratową funkcją klasyfikującą grupy k. Procedura klasyfikacji to kwadratowa analiza dyskryminacyjna (QDA).

Nie znamy parametrów π 1 , π 0 , µ 1 , µ 0 , Σ 1 , Σ 0 . Zastępujemy je estymatorami π ˆ 1 = 1

n

n

X

i=1

Y i (8)

(2)

π ˆ 0 = 1 n

n

X

i=1

(1 − Y i ) (9)

µ ˆ 1 = 1 n 1

X

Y

i=1

X ~ i (10)

µ ˆ 0 = 1 n 0

X

Y

i

=0

X ~ i (11)

Σ ˆ 1 = S 1 = 1 n 1 − 1

X

Y

i

=1

 X ~ i − ~ µ i   X ~ i − ~ µ 1  0 (12)

Σ ˆ 0 = S 0 = 1 n 0 − 1

X

Y

i

=1

 X ~ i − ~ µ 0   X ~ i − ~ µ 0  0 (13)

gdzie

n 1 =

n

X

i=1

Y i (14)

n 0 =

n

X

i=1

1 − Y i (15)

Przy założeniu równości macierzy kowariancji w dwóch grupach, tzn jeśli założymy Σ 0 = Σ 1 = Σ klasyfikator bayesowski ma postać

d B (~ x) = arg max

k δ k (~ x) (16)

gdzie

δ k (~ x) = ~ x 0 Σ −1 µ ~ k − 1 2

µ ~ 0 k Σ −1 µ ~ k + ln π k (17) gdzie k = 1, 0. Funkcja δ k (~ x) jest funkcją liniową i nosi nazwę liniowej funkcji klasyfiku- jącej grupy k. Powierzchnia rozdzielająca

{~ x : δ 1 (~ x) = δ 0 (~ x)} (18) δ 10 (~ x) = {~ x : δ 1 (~ x) − δ 0 (~ x)} = 0 (19) jest hiperpłaszczyzną. Jest to liniowa funkcja dyskryminacyjna. Jest ona postaci

σ 10 (~ x) =



~ x − 1

2 1 + µ 0 )

 0

Σ −1 1 − µ 0 ) + ln

 π 1 π 0



(20) Obserwację ~ x klasyfikujemy do 1, gdy δ 10 (x) > 0. Procedura klasyfikacji za pomocą liniowej funkcji klasyfikującej nosi nazwę liniowej analizy dyskryminacyjnej (LDA). Nie- znane parametry estymujemy podobnie jak wyżej, z tym, że

Σ = S = ˆ 1

n 1 + n 0 − 2 ((n 1 − 1) S 1 + (n 1 − 1) S 0 ) (21)

(3)

1.1 Klasyfikator Bayesa dla rozkładów normalnych przy założeniu ta- kich samych macierzy kowariancji

Mamy dane dwa wielowymiarowe rozkłady normalne.

f (~ x|k) = 1

(2π) p/2 |Σ| 1/2 exp



− 1

2 (x − ~ m k ) T Σ −1 (x − ~ m k )



(22) dla k = −1 lub k = 1. Klasyfikator Bayesa maksymalizuje wartość f po obu klasach.

Zobaczmy jak wygląda granica decyzyjna

ln π 2 f (~ x|Y = 1)

π 1 f (~ x|Y = −1) = 0 (23)

gdzie π 2 = P (Y = 1), zaś π 1 = P (Y = −1). A zatem ln π 2

π 1

− 1

2 ( ~ m 2 − ~ m 1 ) T Σ −1 ( ~ m 1 + ~ m 2 ) + ( ~ m 2 − ~ m 1 ) T Σ −1 ~ x = 0 (24) Widzimy, że jest to funkcja liniowa. Zauważmy, że współczynnik kierunkowy oraz wyraz wolny jest identyczny jak w klasyfikatorze Fishera (przy założeniu, że π 2 = π 1 ).

Zwróćmy uwagę na to, że metoda ta estymuje gęstości prawd. P (X|Y = 1), zaś metoda regresji logistycznej estymowała P (Y = 1|X).

1.2 Klasyfikator Bayesa dla rozkładów normalnych przy założeniu róż- nych macierzy kowariancji

Reguła klasyfikacyjna ma postać ln π 2

π 1

+ 1

2 ln |Σ 1 |

2 | +x T  Σ −1 2 m ~ 2 − Σ −1 1 m ~ 1  − 1

2 x T  Σ −1 2 − Σ −1 1  x− 1

2 m ~ 2 T Σ −1 2 m ~ 2 + 1

2 m T 1 Σ −1 m ~ 1 = 0 (25)

2 Zadania

2.1 Zadania na 3.0

Napisać skrypt w R. W skrypcie

• dla wygenerowanych danych dwuwymiarowych dwóch klas z rozkładów normalnych wykonać klasyfikację lda i qda (macierz kowariancji i wartości średnie obliczone na podstawie danych)

• przetestować klasyfikację dla różnych wartości macierzy kowariancji

• wyświetlić na jednym wykresie punkty, granicę decyzyjną

• wyświetlać na konsoli szybkość wyszukania rozwiązania i jakość mierzoną za po-

mocą średniego błędu klasyfikacji na zbiorze testowym

(4)

• wyświetlić punkty, granicę decyzyjną oraz dwie funkcje gęstości prawdopodobień- stwa na wykresie trójwymiarowym

• Dodać komentarz do skryptu opisujący krótko na czym polegają użyte metody oraz wnioski z badań.

Wskazówki do R:

• dane możemy wygenerować za pomocą https://stat.ethz.ch/R-manual/R-devel/

library/MASS/html/mvrnorm.html

• https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/lda.html

• https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/predict.lda.

html

• http://www.statmethods.net/advstats/discriminant.html

• wyraz wolny b nie jest zwracany przez polecenie lda, więc należy go obliczyć, np.

w ten sposób, aby znalezione rozwiązanie przechodziło przez punkt średni.

• polecenie lda działa niepoprawnie dla współliniowych cech

• https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/qda.html

• https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/predict.qda.

html

• http://www.statmethods.net/advstats/discriminant.html

• do rysowania polecenie contour Wskazówki do Matlaba

• https://www.mathworks.com/help/stats/discriminant-analysis.html

• https://www.mathworks.com/help/stats/fitcdiscr.html, deprecated https:

//www.mathworks.com/help/stats/classificationdiscriminant.fit.html, https:

//www.mathworks.com/help/stats/classify.html Przykłady

• uruchomienie lda require("MASS")

sigma <- matrix(c(10,3,3,2),2,2) sigma2 <- matrix(c(10,1,1,5),2,2)

points1<-mvrnorm(n = 1000, c(-1, -1), sigma)

points2<-mvrnorm(n = 1000, c(2, 1), sigma2)

points1b<-cbind(points1, rep(1, 1000))

(5)

points2b<-cbind(points2, rep(-1, 1000)) rbind(points1b, points2b)

allPoints<-rbind(points1b, points2b) as.data.frame(allPoints)

allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V3

w <- allPointsDataFrame$V1 l <- allPointsDataFrame$V2

lda.allPointsDataFrame <- lda(c~w+l, data=allPointsDataFrame)

• uruchomienie lda z wyświetleniem granicy require("MASS")

sigma <- matrix(c(10,3,3,2),2,2) sigma2 <- matrix(c(10,1,1,5),2,2)

points1<-mvrnorm(n = 1000, c(-1, -1), sigma) points2<-mvrnorm(n = 1000, c(2, 1), sigma2) points1b<-cbind(points1, rep(1, 1000)) points2b<-cbind(points2, rep(-1, 1000)) rbind(points1b, points2b)

allPoints<-rbind(points1b, points2b) as.data.frame(allPoints)

allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V3

w <- allPointsDataFrame$V1 l <- allPointsDataFrame$V2

lda.allPointsDataFrame <- lda(c~w+l, data=allPointsDataFrame) myallPointsDataFrame<- matrix(nrow=2000, ncol=2)

myallPointsDataFrame[,1] <- w myallPointsDataFrame[,2] <- l class<- c

min.w <- min(w) max.w <- max(w) min.l <- min(l) max.l <- max(l)

x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)

myallPointsDataFrameT<-expand.grid(w=x, l=y) n <- length(x)

y.pred <- predict(lda.allPointsDataFrame, as.data.frame(myallPointsDataFrame))

error <- 1 - sum(y.pred$class==class)/length(class)

y.pred <- predict(lda.allPointsDataFrame, myallPointsDataFrameT)

plot(w, l, type="n", xlim=c(min.w, max.w), ylim=c(min.l, max.l))

(6)

text(w, l, substr(c, 1, 1))

z <- y.pred$posterior[,1] - y.pred$posterior[,2]

contour(x, y, matrix(z, n), add=TRUE, levels=0.5, labcex = 0, drawlabels = FALSE)

• obliczanie błędu na zbiorze testowym require("MASS")

sigma <- matrix(c(1000,1,3,2),2,2) sigma2 <- matrix(c(1000,1,1,5),2,2)

allPoints1<-mvrnorm(n = 30, c(-2, -1), sigma) allPoints2<-mvrnorm(n = 30, c(2, 1), sigma2) points1b<-cbind(points1, rep(1, 10))

points2b<-cbind(points2, rep(-1, 10)) points1 <- allPoints1[1:10,]

points2 <- allPoints2[1:10,]

points1Testing <- allPoints1[11:30,]

points2Testing <- allPoints2[11:30,]

allTestingPoints<-rbind(points1Testing, points2Testing) points1b<-cbind(points1, rep(1, 10))

points2b<-cbind(points2, rep(-1, 10)) rbind(points1b, points2b)

allPoints<-rbind(points1b, points2b) as.data.frame(allPoints)

allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V3

classTesting<-append(rep(1, 20), rep(-1, 20)) w <- allPointsDataFrame$V1

l <- allPointsDataFrame$V2

lda.allPointsDataFrame <- lda(c~w+l, data=allPointsDataFrame) allTestingPointsDateFrame <- as.data.frame(allTestingPoints) colnames(allTestingPointsDateFrame) <- c("w", "l")

y.pred <- predict(lda.allPointsDataFrame, allTestingPointsDateFrame) errorTesting <- 1 -

sum(y.pred$class==classTesting)/length(classTesting) myallPointsDataFrame<- matrix(nrow=20, ncol=2)

myallPointsDataFrame[,1] <- w myallPointsDataFrame[,2] <- l class<- c

min.w <- min(w)

max.w <- max(w)

min.l <- min(l)

max.l <- max(l)

(7)

x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)

myallPointsDataFrameT<-expand.grid(w=x, l=y) n <- length(x)

y.pred <- predict(lda.allPointsDataFrame,

as.data.frame(myallPointsDataFrame)) error <- 1 - sum(y.pred$class==class)/length(class)

y.pred <- predict(lda.allPointsDataFrame, myallPointsDataFrameT) plot(w, l, type="n", xlim=c(min.w, max.w), ylim=c(min.l, max.l)) text(w, l, substr(c, 1, 1))

z <- y.pred$posterior[,1] - y.pred$posterior[,2]

contour(x, y, matrix(z, n), add=TRUE, levels=0.5, labcex = 0, drawlabels = FALSE)

• rysowanie funkcji 3d różnicy prawdopodobieństw, do poprzedniego przykładu do- dać

persp(x, y, matrix(z, n), theta=150, phi=30, col="lightblue", xlab="x", ylab="y", zlab="z")

• wyświetlanie gęstości prawdopodobieństwa

par(mfrow=c(2,2), pty="m", mar=c(4,2,2,1))

kde2dResult1 <- kde2d(points1[,1], points1[,2], n=25, h=c(3,3), lims=c(-6, 8, -4, 6))

kde2dResult2 <- kde2d(points2[,1], points2[,2], n=25, h=c(3,3), lims=c(-6, 8, -4, 6))

persp(kde2dResult1, phi=20, theta=10, d=5, xlab=c("X1"), ylab=c("X2"))

persp(kde2dResult2, phi=20, theta=10, d=5, xlab=c("X1"), ylab=c("X2"))

• wyświetlanie konturów gęstości prawdopodobieństwa contour(kde2dResult1, nlevels=15, col="red")

contour(kde2dResult2, nlevels=15, col="blue", add=TRUE)

• przykład dla lda, wyświetlanie granicy decyzyjnej names(iris) <- c("d", "sd", "w", "l", "c") c <- iris$c

w <- iris$w l <- iris$l

lda.iris <- lda(c~w+l, data=iris)

myiris<- matrix(nrow=150, ncol=2)

(8)

myiris[,1] <- w myiris[,2] <- l class <- c min.w <- min(w) max.w <- max(w) min.l <- min(l) max.l <- max(l)

x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100) myirisT<-expand.grid(w=x, l=y) n <- length(x)

y.pred <- predict(lda.iris, as.data.frame(myiris)) error <- 1 - sum(y.pred$class==class)/length(class) y.pred <- predict(lda.iris, myirisT)

plot(w, l, type="n", xlim=c(min.w, max.w), ylim=c(min.l, max.l)) text(w, l, substr(c, 1, 1))

z <- y.pred$posterior[,1] - pmax(y.pred$posterior[,3], y.pred$posterior[,2])

contour(x, y, matrix(z, n), add=TRUE, levels=0.5, labcex = 0, drawlabels = FALSE)

• przykład dla qda, wyświetlanie granicy decyzyjnej names(iris) <- c("d", "sd", "w", "l", "c") c <- iris$c

w <- iris$w l <- iris$l

qda.iris <- qda(c~w+l, data=iris) print(qda.iris)

myiris<- matrix(nrow=150, ncol=2) myiris[,1] <- w

myiris[,2] <- l class <- c min.w <- min(w) max.w <- max(w) min.l <- min(l) max.l <- max(l)

x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100) myirisT<-expand.grid(w=x, l=y) n <- length(x)

y.pred <- predict(qda.iris, as.data.frame(myiris))

error <- 1 - sum(y.pred$class==class)/length(class)

print("Error is")

(9)

print(error)

y.pred <- predict(qda.iris, myirisT)

plot(w, l, type="n", xlim=c(min.w, max.w), ylim=c(min.l, max.l)) text(w, l, substr(c, 1, 1))

z <- y.pred$posterior[,1] - pmax(y.pred$posterior[,3], y.pred$posterior[,2])

contour(x, y, matrix(z, n), add=TRUE, levels=0.5, labcex = 0, drawlabels = FALSE)

2.2 Zadania na 4.0

• na wykresie trójwymiarowym zaznacz funkcje gęstości dla danych z zadania na 3.0 (macierz kowariancji i wartości średnie obliczone z danych), dane treningowe i klasyfikator qda

• dla wygenerowanych danych trójwymiarowych dwóch klas z rozkładów normal- nych zaznacz na wykresie trójwymiarowym dane treningowe i klasyfikator qda (z macierzą kowariancji i wartościami średnimi obliczonymi z danych)

• oblicz błąd klasyfikacji na zbiorze testowym dla tego klasyfikatora 2.3 Zadania na 5.0

• wykonać klasyfikację qda dla wybranych danych wielowymiarowych ze strony uci,

porównać jakość klasyfikacji z klasyfikatorem Fishera i opartym na regresji logi-

stycznej na danych testowych

Cytaty