2010-06-13 27 views
5

mi sono imbattuto in this interesting website, con l'idea di un modo per visualizzare un algoritmo di clustering chiamato "Clustergram":Come creare un grafico "Clustergram"? (In R)

alt text http://www.schonlau.net/images/clustergramexample.gif

io non sono sicuro di come utile questo è davvero, ma al fine di gioca con esso Mi piacerebbe riprodurlo con R, ma non sono sicuro di come farlo.

Come creeresti una linea per ogni articolo in modo che rimanga coerente per il diverso numero di cluster?

Ecco un esempio di codice/dati con cui giocare per la potenziale risposta:

hc <- hclust(dist(USArrests), "ave") 
plot(hc) 

risposta

8

Aggiornamento: ho postato una soluzione con una lunga esempio e la discussione here. (è basato sul codice che ho dato sotto). Inoltre, Hadley è stato molto gentile e ha offerto un'implementazione ggplot2 del codice.

Ecco una soluzione di base (per uno migliore, guardare il "aggiornamento" di cui sopra):

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

+0

Interessante ... solo un paio di cose nel codice: avevo per cambiare 'colnames (x)' con 'colnames (data)' e la chiamata 'points (y ~ x)' nel loop è inutilizzata :) A parte questo sembra funzionare bene – nico

+0

Ciao Nico, Ho pulito carica il codice con i tuoi suggerimenti (e con altri buoni supplementi). Sono contento che ti piaccia :) Best, Tal –

+0

Ciao Nico, penso che potresti essere interessato a sapere che ho scritto una funzione più dettagliata e un esempio per l'utilizzo di clustergram sul mio blog qui: http: //www.r-statistics. com/2010/06/clustergram-a-grafico-per-visualizzazione-cluster-analisi-r-code / –

Problemi correlati