2013-04-08 68 views
0

我在使用k-medoids算法的r Package pfc中使用函數prediction.strength。 這裏是我的代碼prediction.strength in Package fpc

prediction.strength(data,2,6,M=10,clustermethod=pamkCBI,DIST,krange=2:6,diss=TRUE,usepam=TRUE) 

不知何故,我得到錯誤信息

Error in switch(method, kmeans = kmeans(xdata[indvec[[l]][[i]], ], k, : 
EXPR must be a length 1 vector 

是否有人有這個R指令的經驗嗎?有喜歡

iriss <- iris[sample(150,20),-5] 
prediction.strength(iriss,2,3,M=3,method="pam") 

簡單的例子,但我的問題是,我使用的相似矩陣,而不是數據本身的K-中心點劃分算法。在這種情況下,我不知道該如何糾正我的代碼。

+0

我在編輯問題後運行了我的臺式計算機上的問題的示例代碼,它仍在運行。這個軟件包總是需要這麼長時間嗎? – Stedy 2013-04-10 20:53:31

回答

0

請注意,在包幫助的prediction.strength陳述如下:

xdats - 數據(一些可以強制轉換爲矩陣)。 請注意,目前這個 不是一個不相似的矩陣。

恐怕你將不得不破解函數來處理距離矩陣。我使用以下內容:

pred <- function (distance, Gmin = 2, Gmax = 10, M = 50, 
classification = "centroid", cutoff = 0.8, nnk = 1, ...) 
{ 
require(cluster) 
require(class) 
xdata <- as.matrix(distance) 
n <- nrow(xdata) 
nf <- c(floor(n/2), n - floor(n/2)) 
indvec <- clcenters <- clusterings <- jclusterings <- classifications <- list() 
prederr <- list() 
dist <- as.matrix(distance) 
for (k in Gmin:Gmax) { 
    prederr[[k]] <- numeric(0) 
    for (l in 1:M) { 
     nperm <- sample(n, n) 
     indvec[[l]] <- list() 
     indvec[[l]][[1]] <- nperm[1:nf[1]] 
     indvec[[l]][[2]] <- nperm[(nf[1] + 1):n] 
     for (i in 1:2) { 
      clusterings[[i]] <- as.vector(pam(as.dist(dist[indvec[[l]][[i]],indvec[[l]][[i]]]), k, diss=TRUE)) 
      jclusterings[[i]] <- rep(-1, n) 
      jclusterings[[i]][indvec[[l]][[i]]] <- clusterings[[i]]$clustering 
    centroids <- clusterings[[i]]$medoids 
      j <- 3 - i 
      classifications[[j]] <- classifdist(as.dist(dist), jclusterings[[i]], 
       method = classification, centroids = centroids, 
       nnk = nnk)[indvec[[l]][[j]]] 
     } 
     ps <- matrix(0, nrow = 2, ncol = k) 
     for (i in 1:2) { 
      for (kk in 1:k) { 
       nik <- sum(clusterings[[i]]$clustering == kk) 
       if (nik > 1) { 
       for (j1 in (1:(nf[i] - 1))[clusterings[[i]]$clustering[1:(nf[i] - 
        1)] == kk]) { 
        for (j2 in (j1 + 1):nf[i]) if (clusterings[[i]]$clustering[j2] == 
        kk) 
        ps[i, kk] <- ps[i, kk] + (classifications[[i]][j1] == 
         classifications[[i]][j2]) 
       } 
       ps[i, kk] <- 2 * ps[i, kk]/(nik * (nik - 
        1)) 
       } 
      } 
     } 
     prederr[[k]][l] <- mean(c(min(ps[1, ]), min(ps[2, 
      ]))) 
    } 
} 
mean.pred <- numeric(0) 
if (Gmin > 1) 
    mean.pred <- c(1) 
if (Gmin > 2) 
    mean.pred <- c(mean.pred, rep(NA, Gmin - 2)) 
for (k in Gmin:Gmax) mean.pred <- c(mean.pred, mean(prederr[[k]])) 
optimalk <- max(which(mean.pred > cutoff)) 
out <- list(predcorr = prederr, mean.pred = mean.pred, optimalk = optimalk, 
    cutoff = cutoff, method = clusterings[[1]]$clustermethod, 
    Gmax = Gmax, M = M) 
class(out) <- "predstr" 
out 
}