2012-02-26 1 views
6

Мой R программы, как показано ниже:странно ошибка иерархической кластеризации в 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!') 

Мой вход является матрица расстояний (конечно симметричной). Когда я исполняю выше программы с расстоянием матрицы больше, чем около тысячи записей (ничего не произойдет в течение нескольких сотен), он дал мне сообщение об ошибке:

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 

Моя машина имеет около 16 ГБ ОЗУ и 4CPU, поэтому он выиграл» Это проблема ресурсов.

Может кто-нибудь, пожалуйста, дайте мне знать, в чем проблема? Благодаря!!

+0

Наивно реализована иерархическая кластеризация имеет 'O (N^3)' сложность (в самом деле, известно 'O (N^2)' алгоритмы только для некоторых специализированных версий см 'SLINK',' CLINK '). Это может быть связано с проблемой сложности, хотя ошибка не выглядит так. –

+4

Я хотел бы пойти глубже, coud вы публикуете образец dmatrix_file и даете указания, как масштабироваться? –

+0

Согласитесь с Питером - вы не можете сделать dmatrix_file доступным, или фиктивный набор данных того же размера? – geotheory

ответ

1

Глядя на функции cutree здесь 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

Вы можете попробовать добавлять K скейлер для числа групп, это будет перекрывать высоту аргумент. Если нет, вы можете посмотреть, что такое высота hc $, потому что, если это не числовой, сложный, символьный или логический вектор, is.unsorted вернет true и даст вам эту ошибку.

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