如何创建一个“Clustergram”图?(在R中)

7
我发现了这个有趣的网站,其中提出了一种可视化聚类算法“Clustergram”的方法: alt text (来源:schonlau.net) 我不确定这是否真的有用,但为了尝试一下,我想用R来复现它,但不确定如何做。
你将如何为每个项目创建一条线,以便在不同数量的簇中保持一致?
以下是一个可以用于潜在答案的示例代码/数据:
hc <- hclust(dist(USArrests), "ave")
plot(hc)
1个回答

9
更新: 我在此处发布了一个详细的解决方案和讨论(它基于我下面给出的代码)。另外,Hadley非常友好地提供了ggplot2实现的代码。

以下是一个基本解决方案(更好的方法请查看上述“更新”):

set.seed(100)
Data <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
              matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(Data) <- c("x", "y")

# noise <- runif(100,0,.05)
line.width <- rep(.004, dim(Data)[1])
Y <- NULL
X <- NULL
k.range <- 2:10

plot(0, 0, col = "white", xlim = c(1,10), ylim = c(-.5,1.6),
     xlab = "Number of clusters", ylab = "Clusters means", 
     main = "(Basic) Clustergram")
axis(side =1, at = k.range)
abline(v = k.range, col = "grey")

centers.points <- list()

for(k in k.range){
    cl <- kmeans(Data, k)

    clusters.vec <- cl$cluster
    the.centers  <- apply(cl$centers,1, mean)

    noise <- unlist(tapply(line.width, clusters.vec, 
                           cumsum))[order(seq_along(clusters.vec)[order(clusters.vec)])]
    noise <- noise - mean(range(noise))
    y <- the.centers[clusters.vec] + noise
    Y <- cbind(Y, y)
    x <- rep(k, length(y))
    X <- cbind(X, x)

    centers.points[[k]] <- data.frame(y = the.centers , x = rep(k , k)) 
#   points(the.centers ~ rep(k , k), pch = 19, col = "red", cex = 1.5)
}

require(colorspace)
COL <- rainbow_hcl(100)
matlines(t(X), t(Y), pch = 19, col = COL, lty = 1, lwd = 1.5)

# add points
lapply(centers.points, 
       function(xx){ with(xx,points(y~x, pch = 19, col = "red", cex = 1.3)) })

enter image description here


有趣...你的代码中只有几个小问题:我不得不将colnames(x)更改为colnames(data),而循环中的points(y~x)调用未被使用 :)除此之外,它似乎工作得很好。 - nico
嗨Nico, 我按照你的建议(以及其他一些不错的补充)清理了代码。很高兴你喜欢它 :) 最好的祝福,Tal - Tal Galili
嗨,Nico,我想你可能会对我的博客上关于使用clustergram的更详细的函数和示例感兴趣:http://www.r-statistics.com/2010/06/clustergram-a-graph-for-visualizing-cluster-analyses-r-code/ - Tal Galili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接