使用 knn 分类器进行边界决策
Posted
技术标签:
【中文标题】使用 knn 分类器进行边界决策【英文标题】:Boundary decision with knn-classifier 【发布时间】:2017-04-12 19:59:58 【问题描述】:我想找到边界决策函数以便对我的数据进行分类。这是他们的一个例子。
"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 轴有新数据的点。 【参考方案1】:我已经对示例进行了修改和注释,以明确发生了什么。
该示例构建了一个测试集,该测试集只是一个扩展的网格,用于转换整个测试集。因此 px1 是一个向量,描述了测试数据网格的 x 分量,而 px2 是相似的,但是对于 y。那么xnew
就是expand.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()
【讨论】:
以上是关于使用 knn 分类器进行边界决策的主要内容,如果未能解决你的问题,请参考以下文章
KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践