2015-07-05 14 views
5

Đây là một câu hỏi liên quan đến https://stats.stackexchange.com/questions/21572/how-to-plot-decision-boundary-of-a-k-nearest-neighbor-classifier-from-elements-oBiến thể về "Làm thế nào để lô ranh giới quyết định của một phân loại hàng xóm gần nhất k từ các yếu tố của học thống kê?"

Để hoàn chỉnh, đây là ví dụ gốc từ liên kết đó:

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() 

Tôi đã chơi với ví dụ đó, và muốn cố gắng làm cho nó hoạt động với ba lớp. Tôi có thể thay đổi một số giá trị của g với một cái gì đó giống như

g[8:16] <- 2 

chỉ để giả vờ rằng có một số mẫu mà là từ một lớp thứ ba. Tôi không thể làm cho cốt truyện làm việc, mặc dù. Tôi đoán tôi cần phải thay đổi dòng mà đối phó với tỷ lệ phiếu bầu cho lớp chiến thắng:

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

và cũng là mức trên đường viền:

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

Tôi cũng không chắc chắn đường viền là quyền công cụ này. Một phương án thay thế hoạt động là tạo một ma trận dữ liệu bao trùm vùng tôi quan tâm, phân loại từng điểm của ma trận này và vẽ các điểm có điểm đánh dấu lớn và các màu khác nhau, tương tự như những gì đang được thực hiện với các điểm (gd .. .) bit.

Mục đích cuối cùng là có thể hiển thị các ranh giới quyết định khác nhau được tạo bởi các trình phân loại khác nhau. Ai đó có thể chỉ cho tôi hướng đi đúng không?

nhờ Rafael

Trả lời

11

Tách các bộ phận chính trong các mã sẽ giúp phác thảo làm thế nào để đạt được điều này:

dữ liệu thử nghiệm với 3 lớp

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))) 

dữ liệu thử nghiệm bao gồm một mạng lưới

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)) 

Phân loại cho lưới mà

3 lớp rõ ràng

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

cấu trúc dữ liệu cho âm mưu

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))) 

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

Chúng tôi cũng có thể là một chút fancier và cốt truyện xác suất thành viên lớp như một dấu hiệu của sự "tự tin".

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

Fantastic, âm mưu cuối cùng là một bước tiến khổng lồ trên những gì tôi muốn làm! –

Các vấn đề liên quan