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é.
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

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 :

  1. Calculer la classification hiérarchique sur les données et couper l’arbre en k regroupements.
  2. Calculer le centre (la moyenne) de chacun de ces k regroupements.
  3. 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 set
df <- scale(USArrests)   # Standardize every variable (mean 0, sd 1)

# View the first 3 rows of the scaled data
head(df, n = 3)
            Murder   Assault   UrbanPop         Rape
Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
Arizona 0.07163341 1.4788032  0.9989801  1.042878388

Pourquoi le k-means classique peut être instable

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 seeds
set.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 differ
c(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)
 [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
 [6] "betweenss"    "size"         "iter"         "ifault"       "data"        
[11] "hclust"      

L’objet porte les composantes familières de k-means — cluster, centers, size, withinss, tot.withinss, betweenssplus 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 cluster
res.hk$size
[1]  8 13 16 13
# Cluster centers (mean of each variable, scaled)
round(res.hk$centers, 3)
  Murder Assault UrbanPop   Rape
1  1.412   0.874   -0.815  0.019
2  0.695   1.039    0.723  1.277
3 -0.489  -0.383    0.576 -0.262
4 -0.962  -1.107   -0.930 -0.967
# Cluster assignment for the first few states
head(res.hk$cluster, 6)
   Alabama     Alaska    Arizona   Arkansas California   Colorado 
         1          2          2          1          2          2 

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-means
fviz_dend(res.hk, cex = 0.6, palette = "jco",
          rect = TRUE, rect_border = "jco", rect_fill = TRUE)

A colored dendrogram of the scaled US Arrests data produced by hierarchical k-means, with a rectangle drawn around each of the four clusters in journal-palette colors.

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 clusters
fviz_cluster(res.hk, palette = "jco", repel = TRUE,
             ggtheme = theme_minimal())

A factoextra cluster plot of the US states grouped into four hierarchical k-means clusters on the first two principal components, with state labels repelled to avoid overlap.

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-means
res.hk <- hkmeans(df, 4)

# Plain k-means with 25 random starts
set.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)
       kmeans
hkmeans  1  2  3  4
      1  0  0  8  0
      2  0 13  0  0
      3 16  0  0  0
      4  0  0  0 13

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

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.

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().

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.

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.

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

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.)

Les colonnes numériques sont iris[, 1:4]. Mettez-les à l’échelle, passez la matrice mise à l’échelle à hkmeans(), puis à fviz_cluster().

library(factoextra)

# Numeric measurements only, scaled
df <- scale(iris[, 1:4])

# Hierarchical k-means with k = 3
res.hk <- hkmeans(df, 3)
res.hk$size

fviz_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 ?

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

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.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

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.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“K-Means hiérarchique en R : des regroupements stables.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/hierarchical-k-means.