2016-01-23 60 views
1

在從randomForest獲得接近矩陣後,對於數據集中的每一行/觀測,我想找到k個最近點(不包括觀測本身,或,等價地,接近矩陣的對角線元素),然後是它們的真實類別標籤。我知道如何找到矩陣中每行的最大值或最小值的索引,但我不知道如何對R進行編程以排除對角線元素,並按行確定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 
+0

SO是關於幫助。請寫一個可重現的例子,其中包括您的數據集的子集和您一直在處理的代碼。 – MLavoie

回答

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) 
}