2012-02-26 17 views
6

chương trình R của tôi là như sau:lỗi Strange của Hierarchical Clustering trong 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!') 

đầu vào của tôi là một ma trận khoảng cách (tất nhiên đối xứng). Khi tôi thực hiện trên chương trình với một ma trận khoảng cách lớn hơn về hàng ngàn hồ sơ (Không có gì xảy ra cho vài trăm), nó đã cho tôi thông báo lỗi:

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 

máy của tôi có khoảng 16GB RAMS và 4CPU, vì vậy nó đã giành' t là vấn đề tài nguyên.

Có ai vui lòng cho tôi biết vấn đề là gì không? Cảm ơn!!

+0

Thực hiện phân cấp theo cấp bậc có độ phức tạp 'O (n^3)' (trên thực tế, thuật toán 'O (n^2)' chỉ dành cho một số phiên bản chuyên biệt, xem 'SLINK',' CLINK '). Nó thực sự có thể do một vấn đề phức tạp, mặc dù lỗi không giống như thế này. –

+4

Tôi muốn đi sâu hơn, coud bạn đăng mẫu dmatrix_file và đưa ra hướng dẫn cách mở rộng quy mô? –

+0

Đồng ý với Peter - bạn không thể tạo dmatrix_file, hoặc tập dữ liệu giả cùng kích thước? – geotheory

Trả lời

1

Nhìn vào chức năng cutree đây 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

Bạn có thể thử thêm k scaler cho số lượng các nhóm, điều này sẽ ghi đè lên chiều cao tranh luận. Nếu không, bạn có thể xem xét chiều cao $ h là vì nếu nó không phải là một số, ký tự phức tạp hoặc ký tự logic, is.unsorted sẽ trả về true và cung cấp cho bạn lỗi này.

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