在R中使用k-NN算法处理分类变量值

7

我希望对大部分特征为分类的数据进行分类。为此,欧几里得距离(或任何其他假定距离的数值)并不适合。

我正在寻找一个[R]中的kNN实现,可以选择不同的距离方法,如汉明距离。

是否有一种方法可以使用常见的kNN实现(如{class}中的实现)来使用不同的距离度量函数?

我正在使用R 2.15


2
你是否查看了 knnkknnMTSKNN 这些程序包? - Carl Witthoft
1个回答

8
只要您能够计算出距离/相异性矩阵(无论使用何种方式),就可以轻松地执行kNN分类,而不需要任何特殊的软件包。
# Generate dummy data
y <- rep(1:2, each=50)                          # True class memberships
x <- y %*% t(rep(1, 20)) + rnorm(100*20) < 1.5  # Dataset with 20 variables
design.set <- sample(length(y), 50)
test.set <- setdiff(1:100, design.set)

# Calculate distance and nearest neighbors
library(e1071)
d <- hamming.distance(x)
NN <- apply(d[test.set, design.set], 1, order)

# Predict class membership of the test set
k <- 5
pred <- apply(NN[, 1:k, drop=FALSE], 1, function(nn){
    tab <- table(y[design.set][nn])
    as.integer(names(tab)[which.max(tab)])      # This is a pretty dirty line
}

# Inspect the results
table(pred, y[test.set])

如果有比上面那段代码更好的方法来查找向量中最常见的值,我很乐意知道。

drop=FALSE参数需要在k=1的情况下保留NN子集作为矩阵。否则它将被转换为向量,并且apply会抛出错误。


2
关于“更好的方法”,这个很可爱,但可能并没有更好的方法: Rgames> foo <- c(1,1,2,3,4,5,5,5,5,6,4,4,3,3,3) Rgames> bar<-rle(foo) Rgames> bar$values[which.max(bar$lengths)] [1] 5 - Carl Witthoft
这更好。由于这是一个琐碎的任务,我希望有一种基本、快速和直接的方法来完成它,例如 most.common.value(foo) - Backlin
1
翻译后的文本:错误:应该是rle(sort(foo)) - Carl Witthoft

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