R中层次聚类的奇怪错误
Posted
技术标签:
【中文标题】R中层次聚类的奇怪错误【英文标题】:Strange error of Hierarchical Clustering in R 【发布时间】:2012-03-16 11:32:00 【问题描述】:我的 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
我的机器有大约 16GB 的 RAM 和 4CPU,所以不会是资源问题。
谁能告诉我有什么问题?谢谢!!
【问题讨论】:
天真的实现,层次聚类有O(n^3)
的复杂度(实际上,已知的O(n^2)
算法只针对一些专门的版本,见SLINK
,CLINK
)。它可能确实是一个复杂性问题,尽管错误看起来不像这样。
我想更深入一点,您能否发布 dmatrix_file 的示例并指导如何扩大规模?
同意 Peter 的观点 - 你不能提供 dmatrix_file 或相同尺寸的虚拟数据集吗?
【参考方案1】:
我不是一个 R 向导 - 但我遇到了这个问题。
这里描述了一个可能的答案:
https://stat.ethz.ch/pipermail/r-help/2008-May/163409.html
【讨论】:
TL;DR hc$height 【参考方案2】:看这里的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$height 是什么,因为如果它不是数字、复数、字符或逻辑向量,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)
【讨论】:
以上是关于R中层次聚类的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章
R语言Kmeans聚类抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值并与层次聚类的最优K值进行比较