关于"如何从统计学习要素中绘制k-最近邻分类器的决策边界?"的变化.

Raf*_*tos 8 visualization r cluster-analysis nearest-neighbor

这是一个与https://stats.stackexchange.com/questions/21572/how-to-plot-decision-boundary-of-ak-nearest-neighbor-classifier-from-elements-o相关的问题

为了完整起见,这是该链接的原始示例:

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()
Run Code Online (Sandbox Code Playgroud)

我一直在玩这个例子,并希望尝试使用三个类.我可以用类似的东西改变g的某些值

g[8:16] <- 2
Run Code Online (Sandbox Code Playgroud)

只是假装有一些来自第三类的样本.但是,我不能让情节有效.我想我需要改变处理获胜类别投票比例的线:

prob <- attr(mod15, "prob")
prob <- ifelse(mod15=="1", prob, 1-prob)
Run Code Online (Sandbox Code Playgroud)

以及轮廓上的水平:

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

我也不确定轮廓是否是正确的工具.一种可行的方法是创建一个覆盖我感兴趣的区域的数据矩阵,对该矩阵的每个点进行分类,并绘制具有大标记和不同颜色的那些点,类似于点(gd ... .)位.

最终目的是能够显示由不同分类器生成的不同决策边界.有人能指出我正确的方向吗?

谢谢拉斐尔

lga*_*ier 17

分离代码中的主要部分将有助于概述如何实现此目的:

测试数据有3个类

 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)))
Run Code Online (Sandbox Code Playgroud)

覆盖网格的测试数据

 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))
Run Code Online (Sandbox Code Playgroud)

该网格的分类

显然有3个班级

 require(class)
 classif <- knn(train, test, cl, k = 3, prob=TRUE)
 prob <- attr(classif, "prob")
Run Code Online (Sandbox Code Playgroud)

绘图的数据结构

 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)))
Run Code Online (Sandbox Code Playgroud)

情节

 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))
Run Code Online (Sandbox Code Playgroud)

情节

我们也可以是一个小小的发烧友,并将阶级成员资格的概率作为"信心"的指示.

 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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述