445 votes

Analyse par grappes en R : déterminer le nombre optimal de grappes

Étant novice en R, je ne suis pas très sûr de savoir comment choisir le meilleur nombre de clusters pour faire une analyse k-means. Après avoir tracé un sous-ensemble de données ci-dessous, combien de clusters seront appropriés ? Comment puis-je effectuer une analyse dendrologique en grappes ?

n = 1000
kk = 10    
x1 = runif(kk)
y1 = runif(kk)
z1 = runif(kk)    
x4 = sample(x1,length(x1))
y4 = sample(y1,length(y1)) 
randObs <- function()
{
  ix = sample( 1:length(x4), 1 )
  iy = sample( 1:length(y4), 1 )
  rx = rnorm( 1, x4[ix], runif(1)/8 )
  ry = rnorm( 1, y4[ix], runif(1)/8 )
  return( c(rx,ry) )
}  
x = c()
y = c()
for ( k in 1:n )
{
  rPair  =  randObs()
  x  =  c( x, rPair[1] )
  y  =  c( y, rPair[2] )
}
z <- rnorm(n)
d <- data.frame( x, y, z )

4 votes

Si vous n'êtes pas complètement convaincu par les kmeans, vous pouvez essayer l'algorithme de clustering DBSCAN, disponible dans la base de données de l'UE. fpc paquet. C'est vrai, vous devez ensuite définir deux paramètres... mais j'ai trouvé que fpc::dbscan fait ensuite un assez bon travail pour déterminer automatiquement un bon nombre de clusters. De plus, il peut réellement produire un seul cluster si c'est ce que les données vous indiquent - certaines des méthodes dans les excellentes réponses de @Ben ne vous aideront pas à déterminer si k=1 est réellement le meilleur.

0 votes

8voto

RDRR Points 430

Ces méthodes sont excellentes, mais lorsqu'on essaie de trouver k pour des ensembles de données beaucoup plus importants, elles peuvent être extrêmement lentes dans R.

Une bonne solution que j'ai trouvée est le paquet "RWeka", qui a une implémentation efficace de l'algorithme X-Means - une version étendue de K-Means qui s'adapte mieux et détermine le nombre optimal de clusters pour vous.

Tout d'abord, vous devez vous assurer que Weka est installé sur votre système et que XMeans est installé via l'outil de gestion des paquets de Weka.

library(RWeka)

# Print a list of available options for the X-Means algorithm
WOW("XMeans")

# Create a Weka_control object which will specify our parameters
weka_ctrl <- Weka_control(
    I = 1000,                          # max no. of overall iterations
    M = 1000,                          # max no. of iterations in the kMeans loop
    L = 20,                            # min no. of clusters
    H = 150,                           # max no. of clusters
    D = "weka.core.EuclideanDistance", # distance metric Euclidean
    C = 0.4,                           # cutoff factor ???
    S = 12                             # random number seed (for reproducibility)
)

# Run the algorithm on your data, d
x_means <- XMeans(d, control = weka_ctrl)

# Assign cluster IDs to original data set
d$xmeans.cluster <- x_means$class_ids

4voto

boyaronur Points 317

Les réponses sont excellentes. Si vous voulez donner une chance à une autre méthode de clustering, vous pouvez utiliser le clustering hiérarchique et voir comment les données se répartissent.

> set.seed(2)
> x=matrix(rnorm(50*2), ncol=2)
> hc.complete = hclust(dist(x), method="complete")
> plot(hc.complete)

enter image description here

Selon le nombre de classes dont vous avez besoin, vous pouvez couper votre dendrogramme comme ;

> cutree(hc.complete,k = 2)
 [1] 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1
[26] 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 2

Si vous tapez ?cutree vous verrez les définitions. Si votre ensemble de données a trois classes, ce sera simplement cutree(hc.complete, k = 3) . L'équivalent pour cutree(hc.complete,k = 2) es cutree(hc.complete,h = 4.9) .

0 votes

Je préfère Wards au complet.

2voto

yo bar Points 33

Vous devriez regarder NbClust Il met en œuvre plus de trente méthodes pour déterminer le nombre optimal de clusters,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X