2015-07-05 30 views
5

Jest to kwestia związana z https://stats.stackexchange.com/questions/21572/how-to-plot-decision-boundary-of-a-k-nearest-neighbor-classifier-from-elements-oWariacja na temat "Jak wykreślić granicę decyzyjną k-najbliższego sąsiada klasyfikatora z elementów nauki statystycznej?"

pod względem kompletności, oto oryginalny przykład z tego linku:

library(ElemStatLearn) 
require(class) 
x <- mixture.example$x 
g <- mixture.example$y 
xnew <- mixture.example$xnew 
mod15 <- knn(x, xnew, g, k=15, prob=TRUE) 
prob <- attr(mod15, "prob") 
prob <- ifelse(mod15=="1", prob, 1-prob) 
px1 <- mixture.example$px1 
px2 <- mixture.example$px2 
prob15 <- matrix(prob, length(px1), length(px2)) 
par(mar=rep(2,4)) 
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main= 
     "15-nearest neighbour", axes=FALSE) 
points(x, col=ifelse(g==1, "coral", "cornflowerblue")) 
gd <- expand.grid(x=px1, y=px2) 
points(gd, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue")) 
box() 

Grałem z tego przykładu, a chcieliby spróbować, aby pracować z trzy klasy. Mogę zmienić niektóre wartości gz czymś podobnym do tego, co z pewną próbką, która udaje, że istnieją próbki z trzeciej klasy. Nie mogę jednak poprowadzić fabuły. Chyba muszę zmienić linie, które zajmują się proporcji głosów za wygranie klasy:

prob <- attr(mod15, "prob") 
prob <- ifelse(mod15=="1", prob, 1-prob) 

a także poziomy na konturze:

contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main= 
"15-nearest neighbour", axes=FALSE) 

Ja również nie jestem pewien kontur jest prawo narzędzie do tego. Jedną z alternatyw, która działa, jest stworzenie macierzy danych obejmujących region, który mnie interesuje, zaklasyfikowanie każdego punktu tej macierzy i narysowanie tych z dużym znacznikiem i różnymi kolorami, podobnymi do tego, co robi się z punktami (gd .. .) Bit.

Ostatnim celem jest przedstawienie różnych granic decyzyjnych generowanych przez różne klasyfikatory. Czy ktoś może wskazać mi właściwy kierunek?

dzięki Rafael

Odpowiedz

11

Oddzielenie główne części w kodzie pomoże przedstawiający jak to osiągnąć:

danych testowych z 3 klas

train <- rbind(iris3[1:25,1:2,1], 
       iris3[1:25,1:2,2], 
       iris3[1:25,1:2,3]) 
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25))) 

danych testowych obejmujących siatkę

require(MASS) 

test <- expand.grid(x=seq(min(train[,1]-1), max(train[,1]+1), 
          by=0.1), 
        y=seq(min(train[,2]-1), max(train[,2]+1), 
          by=0.1)) 

klasyfikacji tej siatki

3 klasy oczywiście

require(class) 
classif <- knn(train, test, cl, k = 3, prob=TRUE) 
prob <- attr(classif, "prob") 

struktury danych do kreślenia

require(dplyr) 

dataf <- bind_rows(mutate(test, 
          prob=prob, 
          cls="c", 
          prob_cls=ifelse(classif==cls, 
              1, 0)), 
        mutate(test, 
          prob=prob, 
          cls="v", 
          prob_cls=ifelse(classif==cls, 
              1, 0)), 
        mutate(test, 
          prob=prob, 
          cls="s", 
          prob_cls=ifelse(classif==cls, 
              1, 0))) 

Działka

require(ggplot2) 
ggplot(dataf) + 
    geom_point(aes(x=x, y=y, col=cls), 
       data = mutate(test, cls=classif), 
       size=1.2) + 
    geom_contour(aes(x=x, y=y, z=prob_cls, group=cls, color=cls), 
       bins=2, 
       data=dataf) + 
    geom_point(aes(x=x, y=y, col=cls), 
       size=3, 
       data=data.frame(x=train[,1], y=train[,2], cls=cl)) 

plot

Możemy być również nieco bardziej wyszukane i wykreślić prawdopodobieństwo przynależności klasowej jako wskazanie „zaufania”.

ggplot(dataf) + 
    geom_point(aes(x=x, y=y, col=cls, size=prob), 
       data = mutate(test, cls=classif)) + 
    scale_size(range=c(0.8, 2)) + 
    geom_contour(aes(x=x, y=y, z=prob_cls, group=cls, color=cls), 
       bins=2, 
       data=dataf) + 
    geom_point(aes(x=x, y=y, col=cls), 
       size=3, 
       data=data.frame(x=train[,1], y=train[,2], cls=cl)) + 
    geom_point(aes(x=x, y=y), 
       size=3, shape=1, 
       data=data.frame(x=train[,1], y=train[,2], cls=cl)) 

enter image description here

+0

Znakomity, ostatnia działka jest ogromny postęp na to, co chciałem robić! –