2012-02-26 6 views
6

mio programma R è come qui sotto:strano errore di Hierarchical Clustering in R

hcluster <- function(dmatrix) { 
    imatrix <- NULL 
    hc <- hclust(dist(dmatrix), method="average") 
    for(h in sort(unique(hc$height))) { 
     hc.index <- c(h,as.vector(cutree(hc,h=h))) 
     imatrix <- cbind(imatrix, hc.index) 
    } 
    return(imatrix) 
} 

dmatrix_file = commandArgs(trailingOnly = TRUE)[1] 
print(paste('Reading distance matrix from', dmatrix_file)) 
dmatrix <- as.matrix(read.csv(dmatrix_file,header=FALSE)) 

imatrix <- hcluster(dmatrix) 
imatrix_file = paste("results",dmatrix_file,sep="-") 
print(paste('Wrinting results to', imatrix_file)) 
write.table(imatrix, file=imatrix_file, sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE) 
print('done!') 

mio input è una matrice di distanza (ovviamente simmetrica). Quando eseguo sopra programma con una matrice di distanza maggiore di circa mille record (accadere nulla per diverse centinaia), mi ha dato il messaggio di errore:

Error in cutree(hc, h = h) : 
    the 'height' component of 'tree' is not sorted 
(increasingly); consider applying as.hclust() first 
Calls: hcluster -> as.vector -> cutree 
Execution halted 

La mia macchina ha circa 16 GB di RAM e 4CPU, quindi ha vinto' essere il problema delle risorse

Qualcuno può per favore fatemi sapere qual è il problema? Grazie!!

+0

Ingenuamente implementato, il clustering gerarchico ha 'O (n^3)' complessità (infatti, il noto 'O (n^2)' algoritmi sono solo per alcune versioni specializzate, vedere 'SLINK',' CLINK '). Potrebbe effettivamente da un problema di complessità, sebbene l'errore non assomigli a questo. –

+4

Mi piacerebbe approfondire, coud pubblichi l'esempio di dmatrix_file e diamo indicazioni su come scalare? –

+0

Accetto con Peter: non è possibile rendere disponibile dmatrix_file o un dataset fittizio con le stesse dimensioni? – geotheory

risposta

1

Guardando la funzione cutree qui http://code.ohloh.net/file?fid=QM4q0tWQlv2VywAoSr2MfgcNjnA&cid=ki3UJjFJ8jA&s=cutree%20component%20of%20is%20not%20sorted&mp=1&ml=1&me=1&md=1&browser=Default#L1

Si può provare ad aggiungere lo scaler k per il numero di gruppi, questo avrà la precedenza l'altezza discussione. In caso contrario, è possibile vedere quale altezza hc $ è perché se non è un vettore numerico, complesso, logico o logico, is.unsorted restituirà true e vi darà questo errore.

if(is.null(k)) { 
    if(is.unsorted(tree$height)) 
     stop("the 'height' component of 'tree' is not sorted (increasingly)") 
    ## h |--> k 
    ## S+6 help(cutree) says k(h) = k(h+), but does k(h-) [continuity] 
    ## h < min() should give k = n; 
    k <- n+1L - apply(outer(c(tree$height,Inf), h, ">"), 2, which.max) 
    if(getOption("verbose")) message("cutree(): k(h) = ", k, domain = NA) 
}