KNN分类器的边界决策

3

我想找到边界决策函数以对我的数据进行分类。以下是其中的一个示例。

 "Distance","Dihedral","Categ"
    4.083,82.267,C
    4.132,87.073,C
    4.713,-80.999,C
    3.427,-48.144,NC
    3.663,96.994,C
    3.99,71.919,C
    3.484,78.684,C

到目前为止,我已经拥有了knn模型,但我希望绘制非线性决策边界。在我搜索的示例中,有一些变量我不知道在哪里使用或者它们的含义是什么。我是指我在《统计学习基础》一书中发现的这个例子。
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()

px1和px2是什么?我需要在我的特定情况下使用类似的变量吗?

非常感谢您的帮助!


我认为px1和px2只是描述新数据网格的向量,即您拥有新数据的x和y轴上的点。 - Andrie
1个回答

1
我已经修改并注释了示例,以便清楚地说明发生了什么。
该示例构建了一个测试集,它只是扩展了覆盖整个测试集的网格。 因此,px1是描述测试数据网格的x分量的向量,而px2类似于y。然后,xnewexpand.grid()的结果。
尝试以下代码,这应该相当清晰。 我还修改了k值,并提供了一种使用您选择的间隔构建xnew的简单方法。
library(ElemStatLearn)
require(class)

# Use the training data from mixture.example
x <- mixture.example$x
g <- mixture.example$y

# Construct a test grid using the extent of the training data
xx_range <- round(range(x[, 1]), 1)
xy_range <- round(range(x[, 2]), 1)

nnn <- 0.1
px1 <- seq(xx_range[1], xx_range[2], by = nnn) # vector with x extent
px2 <- seq(xy_range[1], xy_range[2], by = nnn) # vector with y extent
xnew <- as.matrix(expand.grid(px1, px2))       # matrix of new values

# Train a model
k <- 10
mod15 <- knn(x, xnew, g, k=k, prob=TRUE)
prob <- attr(mod15, "prob")
prob <- ifelse(mod15=="1", prob, 1-prob)
prob15 <- matrix(prob, length(px1), length(px2))

# Plot the results
par(mar=rep(2,4))
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main=
          sprintf("%d-nearest neighbour", k), axes=FALSE)
points(x, col=ifelse(g==1, "coral", "cornflowerblue"))
points(xnew, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue"))
box()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接