从R中的邻近矩阵逐行获得k阶统计量

时间:2016-01-23 17:25:12

标签: r matrix random-forest proximity

在从randomForest获得接近矩阵后,对于数据集中的每一行/观察,我想找到k-最近点(不包括观测本身,或等效地,邻近矩阵的对角元素)然后他们真正的班级标签。我知道如何找到矩阵中每行的最大值或最小值的索引,但我不知道如何编程R以排除对角线元素并按行识别k个最大的条目。

> set.seed(1234)
> d <- iris[sample(nrow(iris), 6, replace = FALSE),]
> iris.rf <- randomForest(Species ~ ., data=d, ntree=2000, proximity=TRUE, oob.prox=TRUE)
> m <- iris.rf$proximity
> m
           18        93        91        92       126       149
18  1.0000000 0.7486911 0.7653631 0.7500000 0.2620690 0.4723926
93  0.7486911 1.0000000 0.7836257 0.7329545 0.5497076 0.2763819
91  0.7653631 0.7836257 1.0000000 0.6795580 0.5371429 0.2289157
92  0.7500000 0.7329545 0.6795580 1.0000000 0.3107345 0.4535519
126 0.2620690 0.5497076 0.5371429 0.3107345 1.0000000 0.8115942
149 0.4723926 0.2763819 0.2289157 0.4535519 0.8115942 1.0000000

> which(m[1,] == max(m[1,]), arr.ind = TRUE)
18 
 1 

1 个答案:

答案 0 :(得分:0)

我能够自己解决它,虽然如果有办法改进代码(或者如果有错误),我会很感激反馈。

f = function(d,k){
m <- randomForest(y ~ ., data=d, ntree=2000, proximity=TRUE, oob.prox=TRUE)$proximity
diag(m) <-0
tmp <- lapply(as.list(as.data.frame(m)),order,decreasing = TRUE)
tmp1 <- t(as.data.frame(tmp))[,c(1:k)]
class.mat <- matrix(data=NA,nrow(d), k, byrow=TRUE)

for(i in 1:nrow(d)){

    class.mat[i,] = d$y[tmp1[i,]]
}
return(class.mat)
}