K-Means hiérarchique en R : des regroupements stables
Initialisez k-means avec les centres d’une classification hiérarchique à l’aide de hkmeans() pour obtenir une partition stable et reproductible, au lieu d’une partition qui dérive à chaque démarrage aléatoire
Un guide pratique du k-means hiérarchique en R. Découvrez pourquoi le k-means classique est sensible à ses centres de départ aléatoires, comment la fonction hybride hkmeans() de factoextra initialise k-means avec les centres issus d’un arbre hiérarchique pour corriger ce problème, et comment visualiser le résultat avec fviz_dend() et fviz_cluster() sur un exemple détaillé USArrests.
Date de publication
24 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Le k-means hiérarchique (hkmeans) est une méthode hybride : il utilise la classification hiérarchique pour choisir des centres de départ judicieux, puis lance k-means à partir de ceux-ci — ce qui corrige la sensibilité de k-means à l’initialisation aléatoire.
Le kmeans() classique part de centres aléatoires, si bien que différentes exécutions peuvent aboutir à des solutions différentes. L’initialiser avec des centres hiérarchiques rend le résultat stable et reproductible.
Tout le flux de travail tient en un seul appel : hkmeans(df, k) depuis factoextra.
L’objet renvoyé se comporte comme un résultat k-means normal (cluster, centers, size) plus un arbre hclust intégré, ce qui vous permet de tracer à la fois le dendrogramme (fviz_dend()) et le graphique de regroupements (fviz_cluster()).
Mettez d’abord vos variables à l’échelle (scale()) — comme k-means, hkmeans travaille sur des distances.
Utilisez-le quand vous voulez la rapidité et les centroïdes de k-means mais un résultat qui ne dérive pas ; sur de très grandes données, l’étape hiérarchique devient coûteuse, alors revenez au k-means classique avec un nstart élevé.
Le k-means est l’un des algorithmes de partitionnement les plus populaires, mais il présente une faiblesse bien connue : il vous oblige à spécifier le nombre de regroupements à l’avance, et il choisit ses centres de regroupement initiaux au hasard. Comme la solution finale dépend de l’endroit où ces centres démarrent, le résultat peut être légèrement différent à chaque exécution — k-means n’atteint qu’un optimum local, et lequel il trouve est un coup de dés.
Le k-means hiérarchique (hkmeans) est une méthode hybride qui corrige cela. Au lieu de centres de départ aléatoires, il utilise les centres issus d’une classification hiérarchique de vos données pour initialiser k-means. Ces centres constituent déjà une partition sensée, si bien que k-means démarre d’un bon point de départ et converge vers un résultat stable et reproductible.
Utilisez-le quand vous voulez la rapidité et les centroïdes interprétables de k-means mais que vous en avez assez d’une solution qui bouge à chaque nouvelle exécution — une frustration courante quand vous partagez une analyse et qu’un collègue obtient un regroupement différent.
Cette leçon fait partie de la série Analyse de regroupements en R et s’appuie directement sur deux méthodes antérieures : le k-means (l’étape de partitionnement) et la classification hiérarchique (l’arbre qui l’initialise). Si vous ne les avez pas encore rencontrées, parcourez-les d’abord — hkmeans est la combinaison des deux.
L’algorithme
L’idée est simple. Le k-means hiérarchique procède en trois étapes :
Calculer la classification hiérarchique sur les données et couper l’arbre en k regroupements.
Calculer le centre (la moyenne) de chacun de ces k regroupements.
Lancer k-means, en utilisant l’ensemble des centres de regroupement de l’étape 2 comme centres initiaux.
C’est cette troisième étape qui paie : k-means affine toujours la partition (de sorte que les groupes finaux peuvent différer légèrement de la coupe hiérarchique), mais il part désormais d’un ensemble de centres non aléatoire, guidé par les données, au lieu d’un tirage aléatoire chanceux ou malchanceux. Le même algorithme, mais un meilleur point de départ.
NotePourquoi cela améliore k-means
k-means affine toute partition à partir de laquelle il démarre. Donnez-lui une partition hiérarchique sensée et il la peaufine en un optimum stable ; donnez-lui des centres aléatoires et l’optimum qu’il atteint est une question de hasard. La partition finale peut être légèrement différente de la coupe hiérarchique initiale — c’est k-means qui fait son travail — mais elle ne dérive plus d’une exécution à l’autre.
Les données
Nous utiliserons le jeu de données intégré USArrests : les arrestations pour 100 000 habitants pour Murder, Assault et Rape dans chacun des 50 États américains en 1973, ainsi que le pourcentage de la population vivant en zones urbaines (UrbanPop). Ce ne sont que des variables continues — exactement ce dont une méthode basée sur les moyennes a besoin.
Comme k-means, hkmeans travaille sur des distances, c’est pourquoi nous mettons à l’échelle les variables d’abord avec scale() (moyenne 0, écart-type 1) afin que Assault (en centaines) ne domine pas Murder (en chiffres simples) :
data("USArrests") # Load the built-in data setdf <-scale(USArrests) # Standardize every variable (mean 0, sd 1)# View the first 3 rows of the scaled datahead(df, n =3)
Avant de recourir à l’hybride, il est utile de voir le problème qu’il résout. Le kmeans() classique avec la valeur par défaut nstart = 1 part d’un unique démarrage aléatoire. Lancez-le deux fois à partir de graines différentes et la somme des carrés intra-regroupement — le score de compacité que k-means minimise — peut différer, parce que les deux exécutions ont trouvé des optima locaux différents :
data("USArrests")df <-scale(USArrests)# Two single-start runs from different random seedsset.seed(1)a <-kmeans(df, centers =4, nstart =1)set.seed(2)b <-kmeans(df, centers =4, nstart =1)# Compactness score (lower is tighter) — note they can differc(run1 = a$tot.withinss, run2 = b$tot.withinss)
run1 run2
69.86858 56.40317
Le remède habituel de k-means est nstart = 25 — essayer 25 démarrages aléatoires et garder le meilleur. Le k-means hiérarchique emprunte une voie différente vers le même objectif : plutôt que de parier de nombreuses fois, il démarre une seule fois à partir de centres qui sont déjà bons.
Calculer le k-means hiérarchique avec hkmeans()
La fonction hkmeans() de factoextra regroupe tout le flux de travail en trois étapes en un seul appel. Vous lui passez les données mises à l’échelle et le nombre de regroupements k ; elle lance la classification hiérarchique, en déduit les centres et les transmet à k-means pour vous. Le résultat a le même format qu’un objet kmeans() standard, avec quelques extras.
Installez factoextra si vous ne l’avez pas :
install.packages("factoextra")
Calculez ensuite le k-means hiérarchique et inspectez ce qu’il renvoie :
library(factoextra)data("USArrests")df <-scale(USArrests)# Compute hierarchical k-means clustering (k = 4)res.hk <-hkmeans(df, 4)# Elements returned by hkmeans()names(res.hk)
L’objet porte les composantes familières de k-means — cluster, centers, size, withinss, tot.withinss, betweenss — plus deux extras hiérarchiques : un emplacement data et, surtout, un arbre hclust intégré. C’est cet arbre qui vous permet de tracer le dendrogramme ci-dessous. Pour tout afficher d’un coup, vous taperiez simplement res.hk (omis ici — c’est long).
Lisez les trois choses que vous utiliserez le plus — les tailles des regroupements, les centres des regroupements (le profil moyen de chaque groupe en unités mises à l’échelle) et l’affectation de chaque État :
library(factoextra)data("USArrests")df <-scale(USArrests)res.hk <-hkmeans(df, 4)# How many states in each clusterres.hk$size
[1] 8 13 16 13
# Cluster centers (mean of each variable, scaled)round(res.hk$centers, 3)
Le vecteur size montre que les quatre groupes sont bien équilibrés (aucun minuscule regroupement à un seul membre qui laisserait deviner une valeur aberrante). Lire une ligne de centers raconte l’histoire du regroupement : une ligne avec des valeurs élevées de Murder, Assault et Rape est le groupe à forte criminalité ; une ligne négative sur les trois est le groupe sûr.
Visualiser le résultat
Parce que hkmeans() conserve l’arbre hiérarchique, vous obtenez deux vues complémentaires gratuitement.
Le dendrogramme montre la structure hiérarchique qui a initialisé k-means — l’arbre qu’il a coupé pour trouver les centres de départ. fviz_dend() le trace et délimite les quatre regroupements par des rectangles colorés :
library(factoextra)data("USArrests")df <-scale(USArrests)res.hk <-hkmeans(df, 4)# Visualize the hierarchical tree that seeded k-meansfviz_dend(res.hk, cex =0.6, palette ="jco",rect =TRUE, rect_border ="jco", rect_fill =TRUE)
Le graphique de regroupements montre la partition finale de k-means. Comme pour le k-means classique, les données comportent quatre variables, si bien que fviz_cluster() les réduit aux deux premières composantes principales et y trace les États, colorés par regroupement :
library(factoextra)data("USArrests")df <-scale(USArrests)res.hk <-hkmeans(df, 4)# Visualize the final hkmeans clustersfviz_cluster(res.hk, palette ="jco", repel =TRUE,ggtheme =theme_minimal())
Chaque point est un État, positionné par ses deux premières composantes principales et coloré par son regroupement. Les groupes se séparent nettement — le signe rassurant que k = 4 décrit bien ces données. Les étiquettes des axes indiquent quelle part de variation chaque composante capture (Dim1, Dim2).
Comparer au k-means classique
L’hybride vous apporte-t-il réellement quelque chose ici ? Lancez le k-means classique avec un bon nstart et comparez les deux partitions côte à côte. Un tableau croisé des étiquettes de regroupement vous indique dans quelle mesure elles concordent :
library(factoextra)data("USArrests")df <-scale(USArrests)# Hierarchical k-meansres.hk <-hkmeans(df, 4)# Plain k-means with 25 random startsset.seed(123)km.res <-kmeans(df, centers =4, nstart =25)# How the two partitions line up (cluster labels are arbitrary)table(hkmeans = res.hk$cluster, kmeans = km.res$cluster)
Les deux méthodes aboutissent essentiellement au même regroupement — chaque regroupement hkmeans correspond presque entièrement à un regroupement k-means (les étiquettes de ligne/colonne sont arbitraires, alors cherchez une cellule dominante par ligne). C’est tout l’intérêt : sur des données propres et bien séparées, l’hybride et un k-means classique bien réglé concordent. L’avantage de l’hybride apparaît là où ça compte — vous n’avez pas eu besoin de nstart = 25 et d’une graine pour obtenir une réponse stable ; l’initialisation hiérarchique vous en a donné une directement.
Quand l’utiliser
Recourez au k-means hiérarchique quand :
Vous voulez la rapidité et les centroïdes interprétables de k-means mais un résultat qui ne dérive pas entre les exécutions.
Vous seriez sinon en train de bidouiller set.seed() et un grand nstart pour fixer une solution — hkmeans supprime ce rituel.
Vos données sont de taille petite à modérée (l’étape hiérarchique calcule une matrice de distances complète, qui est en O(n²) en mémoire).
Préférez le k-means classique avec un nstart élevé quand vos données sont volumineuses (des dizaines de milliers de lignes et plus), où l’étape hiérarchique devient trop coûteuse. Si vous ne voulez pas fixer k du tout, ou si vos regroupements ne sont pas à peu près sphériques, utilisez directement la classification hiérarchique et coupez l’arbre là où cela a du sens.
Essayez en direct
Modifiez et exécutez le code ci-dessous dans votre navigateur — aucune installation nécessaire. Essayez de changer k de 4 à un autre nombre, ou de remplacer par un autre jeu de données numérique, puis relancez et observez les deux graphiques se mettre à jour.
🟢 Avec un agent IA
Vous ne savez pas si vos données nécessitent l’hybride ou le k-means classique ? Demandez à Prova« ma solution k-means est-elle stable, et le k-means hiérarchique aiderait-il ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre jeu de données, puis vous aide à lire le résultat. The runtime is the judge.Demander à Prova →
Problèmes courants
« Pourquoi mon résultat k-means est-il différent à chaque fois ? » C’est l’initialisation aléatoire qu’utilise le k-means classique. Soit augmentez nstart (par ex. nstart = 25) et fixez une graine, soit utilisez hkmeans(), qui initialise k-means à partir de centres hiérarchiques et donne donc une réponse stable sans la loterie du démarrage aléatoire.
hkmeans() est lent ou manque de mémoire sur de grandes données. L’étape hiérarchique construit une matrice de distances complète, qui croît comme le carré du nombre de lignes. Pour de grandes données (des dizaines de milliers de lignes), abandonnez l’hybride et utilisez le k-means classique avec un nstart élevé, ou CLARA pour un partitionnement robuste sur de grandes données.
Vous n’êtes pas sûr que k = 4 soit le bon choix. Le k-means hiérarchique vous oblige encore à choisir k. Choisissez-le de la même manière que pour k-means — les méthodes du coude, de la silhouette et du gap dans la leçon sur le nombre optimal de regroupements — puis passez ce k à hkmeans().
Vous avez oublié de mettre à l’échelle et une variable domine. Comme toute méthode basée sur les distances, hkmeans est piloté par la variable de plus grande magnitude si vous sautez la standardisation. Faites toujours df <- scale(...) d’abord.
Questions fréquentes
NoteQu’est-ce que le k-means hiérarchique ?
Le k-means hiérarchique (hkmeans) est une méthode de regroupement hybride. Il lance d’abord une classification hiérarchique et coupe l’arbre en k groupes, calcule le centre (la moyenne) de chaque groupe, puis lance k-means en utilisant ces centres comme points de départ au lieu de points aléatoires. L’étape hiérarchique donne à k-means une initialisation judicieuse et non aléatoire, ce qui produit un résultat plus stable et reproductible.
NoteEn quoi hkmeans diffère-t-il de kmeans en R ?
kmeans() part de centres de regroupement aléatoires, si bien que sa solution peut changer d’une exécution à l’autre à moins que vous ne fixiez une graine et n’augmentiez nstart. hkmeans() (de factoextra) part de centres issus d’une classification hiérarchique, si bien qu’il converge directement vers une solution stable. La sortie a par ailleurs la même forme — cluster, centers, size — plus un arbre hclust intégré que vous pouvez tracer avec fviz_dend().
NoteQu’est-ce qu’une méthode de regroupement hybride en R ?
Un hybride combine deux approches de regroupement pour tirer le meilleur de chacune. Le k-means hiérarchique en est l’exemple classique : il emprunte la partition de départ guidée par les données de la classification hiérarchique pour corriger la faiblesse de l’initialisation aléatoire du k-means, tout en conservant la rapidité et les centroïdes interprétables de k-means. En R, c’est un seul appel, hkmeans(df, k), depuis le package factoextra.
NoteDois-je encore choisir le nombre de regroupements pour hkmeans ?
Oui. Le k-means hiérarchique corrige le problème d’initialisation, pas le problème du combien-de-regroupements — vous passez toujours k à hkmeans(df, k). Choisissez-le avec les méthodes du coude, de la silhouette ou de la statistique du gap ; voyez la leçon sur le nombre optimal de regroupements.
NoteDois-je utiliser le k-means hiérarchique sur de grandes données ?
Généralement non. L’étape hiérarchique calcule une matrice de distances complète qui croît avec le carré du nombre d’observations, si bien qu’elle devient lente et gourmande en mémoire sur de grandes données. Pour des dizaines de milliers de lignes, utilisez le k-means classique avec un nstart élevé, ou CLARA pour le partitionnement sur de grandes données.
Testez vos connaissances
ImportantExercice : k-means hiérarchique sur les mesures iris
Utilisez les quatre mesures numériques du jeu de données intégré iris. Mettez-les à l’échelle, lancez un k-means hiérarchique avec k = 3, affichez les tailles des regroupements et tracez le graphique de regroupements. (Supprimez d’abord la colonne non numérique Species.)
AstuceIndice
Les colonnes numériques sont iris[, 1:4]. Mettez-les à l’échelle, passez la matrice mise à l’échelle à hkmeans(), puis à fviz_cluster().
AstuceSolution
library(factoextra)# Numeric measurements only, scaleddf <-scale(iris[, 1:4])# Hierarchical k-means with k = 3res.hk <-hkmeans(df, 3)res.hk$sizefviz_cluster(res.hk, palette ="jco", repel =TRUE,ggtheme =theme_minimal())
Les trois regroupements retrouvent assez bien les espèces d’iris — setosa se sépare nettement, tandis que versicolor et virginica se chevauchent un peu.
Vérification rapide. En une phrase : qu’est-ce que le k-means hiérarchique change à l’algorithme k-means standard, et quel problème cela corrige-t-il ?
NoteAfficher la réponse
Il remplace les centres de départ aléatoires de k-means par des centres issus d’une classification hiérarchique des données, ce qui corrige la sensibilité de k-means à l’initialisation et donne une partition stable et reproductible au lieu d’une partition qui peut dériver d’une exécution à l’autre.
Conclusion
Vous avez mis les données à l’échelle, vu pourquoi le k-means classique peut dériver entre les exécutions, et utilisé hkmeans() pour initialiser k-means avec les centres d’une classification hiérarchique pour une partition stable et reproductible. Vous avez lu les tailles des regroupements et les centres, tracé à la fois le dendrogramme d’initialisation (fviz_dend()) et le graphique de regroupements final (fviz_cluster()), et confirmé que l’hybride concorde avec un k-means classique bien réglé. Recourez à hkmeans quand vous voulez les centroïdes de k-means sans la loterie du démarrage aléatoire ; revenez au k-means classique avec un nstart élevé sur de grandes données, et fixez k avec la leçon sur le nombre optimal de regroupements.
Leçons connexes
K-means — l’étape de partitionnement que hkmeans affine, avec nstart et fviz_cluster(). · Classification hiérarchique — l’arbre qui initialise l’hybride, avec les méthodes de liaison et les dendrogrammes. · Nombre optimal de regroupements — choisissez k avec les méthodes du coude, de la silhouette et du gap. · CLARA — partitionnement robuste pour les grandes données quand l’étape hiérarchique est trop coûteuse.
Vous préférez un livre ? Practical Guide to Cluster Analysis in R est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.
Prouvez que vous savez le faire. Maîtrisez toute la série Analyse de clustering en R — suivez votre parcours, construisez des projets et obtenez un certificat.
Cette leçon est reproductible : chaque figure a été produite par le code montré — modifiez n’importe quel bloc et cliquez sur Run, et le bac à sable + le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.
@online{2026,
author = {},
title = {K-Means hiérarchique en R : des regroupements stables},
date = {2026-06-24},
url = {https://www.datanovia.com/learn/machine-learning/clustering/hierarchical-k-means},
langid = {fr}
}