Étant un débutant en R, je ne sais pas trop 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 dendro de cluster?
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 )
r
cluster-analysis
k-means
user2153893
la source
la source
fpc
package. C'est vrai, vous devez ensuite définir deux paramètres ... mais j'ai trouvé que celafpc::dbscan
fait un très bon travail pour déterminer automatiquement un bon nombre de clusters. De plus, il peut réellement générer un seul cluster si c'est ce que les données vous disent - certaines des méthodes des excellentes réponses de @ Ben ne vous aideront pas à déterminer si k = 1 est réellement le meilleur.Réponses:
Si votre question est
how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, alors voici quelques options. L' article de Wikipédia sur la détermination du nombre de grappes a une bonne revue de certaines de ces méthodes.Tout d'abord, certaines données reproductibles (les données du Q ne sont pas claires pour moi):
Un . Recherchez un coude ou un coude dans la somme des éboulis d'erreurs au carré (SSE). Voir http://www.statmethods.net/advstats/cluster.html et http://www.mattpeeples.net/kmeans.html pour en savoir plus. L'emplacement du coude dans le graphique résultant suggère un nombre approprié de grappes pour les kmeans:
Nous pourrions conclure que 4 clusters seraient indiqués par cette méthode:
Deux . Vous pouvez effectuer un partitionnement autour de medoids pour estimer le nombre de clusters à l'aide de la
pamk
fonction dans le package fpc.Trois . Critère Calinsky: une autre approche pour diagnostiquer le nombre de clusters adaptés aux données. Dans ce cas, nous essayons de 1 à 10 groupes.
Quatre . Déterminer le modèle optimal et le nombre de clusters selon le critère d'information bayésien pour la maximisation des attentes, initialisé par le clustering hiérarchique pour les modèles de mélange gaussiens paramétrés
Cinq . Mise en cluster de la propagation d'affinité (AP), voir http://dx.doi.org/10.1126/science.1136800
Six . Écart statistique pour estimer le nombre de grappes. Voir aussi du code pour une sortie graphique agréable . Essayer 2 à 10 clusters ici:
Voici le résultat de la mise en œuvre par Edwin Chen de la statistique de l'écart:
Sept . Vous pouvez également trouver utile d'explorer vos données avec des clustergrams pour visualiser l'attribution de cluster, voir http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- code / pour plus de détails.
Huit . Le package NbClust fournit 30 indices pour déterminer le nombre de clusters dans un ensemble de données.
Si votre question est
how can I produce a dendrogram to visualize the results of my cluster analysis
, alors vous devriez commencer par celles-ci: http://www.statmethods.net/advstats/cluster.html http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-analysis http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ Et voyez ici pour des méthodes plus exotiques: http://cran.r-project.org/ web / vues / Cluster.htmlVoici quelques exemples:
La
pvclust
bibliothèque qui calcule les valeurs de p pour le clustering hiérarchique via un rééchantillonnage bootstrap à plusieurs échelles est également pour les données de grande dimension . Voici l'exemple de la documentation (ne fonctionnera pas sur des données de dimension aussi faible que dans mon exemple):Est-ce que tout cela aide?
la source
R
packages (c'est sur mon GitHub - vous êtes invités à y jeter un œil); 3) ma solution semble fonctionner assez bien, en plus, ça fait un moment et j'ai déjà finalisé mon logiciel de thèse, rapport de thèse (thèse) et actuellement je prépare la soutenance :-). Quoi qu'il en soit, j'apprécie beaucoup votre commentaire et vos liens. Bonne chance!Il est difficile d'ajouter quelque chose d'une réponse aussi élaborée. Bien que je pense que nous devrions mentionner
identify
ici, en particulier parce que @Ben montre de nombreux exemples de dendrogrammes.identify
vous permet de choisir de manière interactive des clusters dans un dendrogramme et stocke vos choix dans une liste. Appuyez sur Échap pour quitter le mode interactif et revenir à la console R. Notez que la liste contient les indices, pas les noms de domaine (par opposition àcutree
).la source
Afin de déterminer le k-cluster optimal dans les méthodes de clustering. J'utilise généralement la
Elbow
méthode accompagnée d'un traitement parallèle pour éviter de prendre du temps. Ce code peut échantillonner comme ceci:Méthode du coude
Courir le coude en parallèle
Ça marche bien.
la source
Splendide réponse de Ben. Cependant, je suis surpris que la méthode de propagation d'affinité (AP) ait été suggérée ici juste pour trouver le nombre de cluster pour la méthode k-means, où en général AP fait un meilleur travail de clustering des données. Veuillez consulter l'article scientifique soutenant cette méthode dans Science ici:
Frey, Brendan J. et Delbert Dueck. "Clustering en passant des messages entre les points de données." science 315,5814 (2007): 972-976.
Donc, si vous n'êtes pas biaisé vers k-means, je suggère d'utiliser directement AP, qui regroupera les données sans avoir besoin de connaître le nombre de clusters:
Si les distances euclidiennes négatives ne sont pas appropriées, vous pouvez utiliser une autre mesure de similitude fournie dans le même package. Par exemple, pour les similitudes basées sur les corrélations de Spearman, voici ce dont vous avez besoin:
Veuillez noter que ces fonctions de similitudes dans le package AP sont fournies à des fins de simplicité. En fait, la fonction apcluster () dans R acceptera toute matrice de corrélations. La même chose avec corSimMat () peut être effectuée avec ceci:
ou
en fonction de ce que vous souhaitez regrouper sur votre matrice (lignes ou cols).
la source
Ces méthodes sont excellentes, mais lorsque vous essayez de trouver k pour des ensembles de données beaucoup plus grands, celles-ci peuvent être folles et lentes en R.
Une bonne solution que j'ai trouvée est le package "RWeka", qui a une implémentation efficace de l'algorithme X-Means - une version étendue de K-Means qui évolue mieux et déterminera le nombre optimal de clusters pour vous.
Vous devez d'abord vous assurer que Weka est installé sur votre système et que XMeans est installé via l'outil de gestion de paquets de Weka.
la source
Une solution simple est la bibliothèque
factoextra
. Vous pouvez modifier la méthode de clustering et la méthode de calcul du meilleur nombre de groupes. Par exemple, si vous voulez connaître le meilleur nombre de clusters pour un k- signifie:Données: mtcars
Enfin, nous obtenons un graphique comme:
la source
Les réponses sont excellentes. Si vous souhaitez donner une chance à une autre méthode de clustering, vous pouvez utiliser le clustering hiérarchique et voir comment les données sont fractionnées.
Selon le nombre de classes dont vous avez besoin, vous pouvez couper votre dendrogramme comme;
Si vous tapez,
?cutree
vous verrez les définitions. Si votre ensemble de données comprend trois classes, ce sera simplementcutree(hc.complete, k = 3)
. L'équivalent decutree(hc.complete,k = 2)
estcutree(hc.complete,h = 4.9)
.la source