R:层次聚类分析-dist、hclust、heatmap等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R:层次聚类分析-dist、hclust、heatmap等相关的知识,希望对你有一定的参考价值。

参考技术A 1、常规聚类过程:

(2)首先用dist()函数计算变量间距离

dist.r = dist(data, method=" ") 

其中method包括6种方法,表示不同的距离测度:"euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski"。相应的意义自行查找。

(2)再用hclust()进行聚类

hc.r = hclust(dist.r, method = “ ”) 

其中method包括7种方法,表示聚类的方法:"ward", "single", "complete","average", "mcquitty", "median" or "centroid"。相应的意义自行查找。

(3)画图

plot(hc.r, hang = -1,labels=NULL) 或者plot(hc.r, hang = 0.1,labels=F)

hang 等于数值,表示标签与末端树杈之间的距离,

若是负数,则表示末端树杈长度是0,即标签对齐。

labels 表示标签,默认是NULL,表示变量原有名称。labels=F :表示不显示标签。

2、热图聚类过程:

(1)首先用dist()函数计算变量间距离

dist.r = dist(data, method=" ")

(2)用heatmap()函数进行热点图聚类

对于heatmap中具体参数,这里不做过多介绍,可在帮助文档中找说明。除此heatmap函数之外,gplots包中的heatmap.2()函数,也可以做热点图聚类。

heatmap(as.matrix(dist.r))

3、多维标度和聚类的结果:

MDS方法对距离矩阵进行降维,用不同的颜色来表示聚类的结果。

dist.r = dist(data, method=" ")

hc.r = hclust(dist.r)

#cutree函数提取每个样本所属的类别

result = cutree(hc.r,k=4)

#cmdscale数据降维

temp = cmdscale(dist.r, k=2)

x = temp[,1]

y = temp[,2]

#作图

library(ggplot2)

p = ggplot(data.frame(x,y),aes(x,y))

p+geom_point(size=3,alpha=0.8,aes(colour = factor(result)))

R中层次聚类的奇怪错误

【中文标题】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)算法只针对一些专门的版本,见SLINKCLINK)。它可能确实是一个复杂性问题,尽管错误看起来不像这样。 我想更深入一点,您能否发布 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:层次聚类分析-dist、hclust、heatmap等的主要内容,如果未能解决你的问题,请参考以下文章

大型数据集上的 R 中的 hclust()

大数据学习笔记:聚类分析

r:使用 hclust() 时在表/数据框中获取最终集群结果

R中层次聚类的奇怪错误

R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放hclust包层次聚类(创建距离矩阵聚类绘制树状图dendrogram,在树状图上绘制红色矩形框)

R语言层次聚类(hierarchical clustering):数据缩放PCA聚类结果可视化fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性