Tous les produits
Search
Centre de documentation

Platform For AI:Clustering K-means

Dernière mise à jour :Aug 09, 2026

Le clustering K-means est un algorithme d'apprentissage non supervisé qui partitionne un jeu de données en K clusters en minimisant la somme des erreurs quadratiques (SSE) au sein de chaque cluster. Il attribue itérativement les points de données au centroïde le plus proche, puis recalcule la position des centroïdes jusqu'à la stabilisation des attributions ou l'atteinte du nombre maximal d'itérations.

Fonctionnement

  1. Sélectionnez les centroïdes initiaux. Échantillonnez aléatoirement K points de données comme centroïdes initiaux, ou utilisez l'une des méthodes d'initialisation prises en charge (aléatoire, topk, k-means++, uniforme ou une table de centroïdes externe).

  2. Attribuez les points de données aux clusters. Calculez la distance entre chaque point de données et chaque centroïde, puis attribuez chaque point à son centroïde le plus proche.

  3. Mettez à jour les centroïdes. Recalculez la position de chaque centroïde en faisant la moyenne de tous les points attribués à ce cluster.

  4. Répétez jusqu'à convergence. Répétez les étapes 2 et 3 jusqu'à ce que la valeur de la fonction objectif varie de moins que le seuil de convergence entre deux itérations, ou jusqu'à l'atteinte du nombre maximal d'itérations.

Remarque

Le clustering K-means traite les points de données comme des vecteurs spatiaux. Les colonnes de type INT ou DOUBLE sont prises en charge. Lorsque l'entrée est au format creux (sparse), les colonnes de type STRING sont également prises en charge.

Configuration du composant

Méthode 1 : Configurer dans Machine Learning Designer

Sur la page des détails du pipeline dans Machine Learning Designer, ajoutez le composant K-means Clustering au pipeline, puis configurez les paramètres suivants.

Onglet Paramètre Description
Fields Setting Feature Columns Colonnes de la table d'entrée utilisées pour l'entraînement. Séparez les noms de colonnes par des virgules (,). Les types INT et DOUBLE sont pris en charge. Pour les entrées creuses, le type STRING est également pris en charge.
Appended Columns Colonnes d'entrée à ajouter à la table de résultats du clustering. Séparez les noms de colonnes par des virgules (,).
Input Sparse Matrix Indique si les données d'entrée sont au format creux. Les données creuses sont représentées sous forme de paires clé-valeur.
KV Pair Delimiter Délimiteur entre les paires clé-valeur. Par défaut : virgule (,).
KV Delimiter Délimiteur entre les clés et les valeurs au sein d'une paire. Par défaut : deux-points (:).
Parameters Setting Clusters Nombre de centroïdes de cluster. Valeurs valides : 1–1000.
Distance Measurement Method Métrique de distance. Valeurs valides : Euclidean, Cosine, Cityblock.
Centroid Initialization Method Méthode d'initialisation des centroïdes. Valeurs valides : Random, First K, Uniform, K-means++, Use Initial Centroid Table.
Maximum Iterations Nombre maximal d'itérations. Valeurs valides : 1–1000.
Convergence Criteria Seuil d'arrêt des itérations. L'algorithme s'arrête lorsque la différence de la fonction objectif entre deux itérations consécutives est inférieure à cette valeur.
Initial Random Seed Graine pour l'initialisation aléatoire. Par défaut : heure actuelle. Définissez une valeur fixe pour obtenir des résultats stables et reproductibles.
Tuning Cores Nombre de cœurs de calcul. Par défaut : déterminé par le système.
Memory Size per Core Mémoire par cœur. Unité : Mo.

Méthode 2 : Utiliser les commandes PAI

Transmettez les paramètres à l'aide des commandes PAI. Utilisez le composant SQL Script pour exécuter les commandes PAI. Pour plus d'informations, consultez la rubrique Scénario 4 : Exécuter des commandes PAI dans le composant SQL script.

pai -name kmeans
    -project algo_public
    -DinputTableName=pai_kmeans_test_input
    -DselectedColNames=f0,f1
    -DappendColNames=f0,f1
    -DcenterCount=3
    -Dloop=10
    -Daccuracy=0.01
    -DdistanceType=euclidean
    -DinitCenterMethod=random
    -Dseed=1
    -DmodelName=pai_kmeans_test_output_model_
    -DidxTableName=pai_kmeans_test_output_idx
    -DclusterCountTableName=pai_kmeans_test_output_couter
    -DcenterTableName=pai_kmeans_test_output_center;
**Paramètre** **Obligatoire** **Valeur par défaut** **Description**
inputTableName Oui — Nom de la table d'entrée.
selectedColNames Non Toutes les colonnes Colonnes de la table d'entrée utilisées pour l'entraînement. Séparez les noms de colonnes par des virgules (,). Les types INT et DOUBLE sont pris en charge. Pour les entrées creuses, le type STRING est également pris en charge.
inputTablePartitions Non Toutes les partitions Partitions de la table d'entrée utilisées pour l'entraînement. Formats pris en charge : partition_name=value ou name1=value1/name2=value2 pour les partitions multiniveaux. Séparez plusieurs partitions par des virgules (,).
appendColNames Non — Colonnes d'entrée à ajouter à la table de résultats du clustering. Séparez les noms de colonnes par des virgules (,).
enableSparse Non false Indique si les données d'entrée sont au format creux. Valeurs valides : true, false.
itemDelimiter Non , Délimiteur entre les paires clé-valeur.
kvDelimiter Non : Délimiteur entre les clés et les valeurs au sein d'une paire.
centerCount Oui 10 Nombre de centroïdes de cluster. Valeurs valides : 1–1000.
distanceType Non euclidean Métrique de distance. Valeurs valides : euclidean, cosine, cityblock. Formules :- Euclidean : d(x - c) = (x - c)(x - c)'- Cosine : cosine- Cityblock (distance de Manhattan) : `d(x - c) =

x - c

`

initCenterMethod Non random Méthode d'initialisation des centroïdes. Valeurs valides :- random : Échantillonne aléatoirement K centroïdes à partir des données d'entrée. Le paramètre seed contrôle la graine aléatoire.- topk : Utilise les K premières lignes des données d'entrée comme centroïdes initiaux.- uniform : Répartit uniformément K centroïdes initiaux entre les valeurs minimales et maximales.- kmpp : Utilise l'algorithme k-means++ pour sélectionner les centroïdes initiaux.- external : Charge les centroïdes initiaux depuis une table externe (nécessite initCenterTableName).
initCenterTableName Non — Nom de la table contenant les centroïdes initiaux. Prend effet uniquement lorsque initCenterMethod=external.
loop Non 100 Nombre maximal d'itérations. Valeurs valides : 1–1000.
accuracy Non 0,1 Seuil de convergence. L'algorithme s'arrête lorsque la différence de la fonction objectif entre deux itérations consécutives est inférieure à cette valeur.
seed Non Heure actuelle Graine aléatoire initiale. Définissez une valeur fixe pour obtenir des résultats stables et reproductibles.
modelName Non — Nom du modèle hors ligne de sortie.
idxTableName Oui — Nom de la table de résultats du clustering, qui contient l'affectation de cluster pour chaque enregistrement.
idxTablePartition Non — Partition dans la table de résultats du clustering.
clusterCountTableName Non — Nom de la table de statistiques de clustering, qui contient le nombre de points de données dans chaque cluster.
centerTableName Non — Nom de la table des centroïdes de clustering.
coreNum Non Valeur par défaut du système Nombre de cœurs de calcul. Valeurs valides : 1–9999. Doit être spécifié conjointement avec memSizePerCore.
memSizePerCore Non Valeur par défaut du système Mémoire par cœur. Valeurs valides : 1024–65536. Unité : Mo.
lifecycle Non — Cycle de vie de la table de sortie. Unité : jours.

Sortie

Le composant génère trois tables de sortie.

Table de résultats du clustering (idxTableName)

Colonne Description
appendColNames Colonnes ajoutées depuis la table d'entrée.
cluster_index ID du cluster attribué à chaque point de données.
distance Distance entre chaque point de données et son centroïde de cluster attribué.

Table de statistiques de clustering (clusterCountTableName)

Colonne Description
cluster_index ID du cluster.
cluster_count Nombre de points de données dans le cluster.

Table des centroïdes de clustering (centerTableName)

Colonne Description
cluster_index ID du cluster.
selectedColNames Coordonnées du centroïde pour chaque colonne de caractéristique sélectionnée lors de l'entraînement.

Exemples

Entrée dense

Étape 1 : Créez les données de test.

Créez une table de centroïdes initiaux facultative :

create table pai_kmeans_test_init_center as
select * from
(
  select 1 as f0, 2 as f1
  union all
  select 1 as f0, 3 as f1
  union all
  select 1 as f0, 4 as f1
) tmp;

Créez la table d'entrée :

create table pai_kmeans_test_input as
select * from
(
  select 'id1' as id, 1 as f0, 2 as f1
  union all
  select 'id2' as id, 1 as f0, 3 as f1
  union all
  select 'id3' as id, 1 as f0, 4 as f1
  union all
  select 'id4' as id, 0 as f0, 3 as f1
  union all
  select 'id5' as id, 0 as f0, 4 as f1
) tmp;

Étape 2 : Soumettez la tâche de clustering.

Utilisation d'une table de centroïdes externe :

drop table if exists pai_kmeans_test_output_idx;
yes
drop table if exists pai_kmeans_test_output_couter;
yes
drop table if exists pai_kmeans_test_output_center;
yes
drop offlinemodel if exists pai_kmeans_test_output_model_;
yes
pai -name kmeans
    -project algo_public
    -DinputTableName=pai_kmeans_test_input
    -DinitCenterTableName=pai_kmeans_test_init_center
    -DselectedColNames=f0,f1
    -DappendColNames=f0,f1
    -DcenterCount=3
    -Dloop=10
    -Daccuracy=0.01
    -DdistanceType=euclidean
    -DinitCenterMethod=external
    -Dseed=1
    -DmodelName=pai_kmeans_test_output_model_
    -DidxTableName=pai_kmeans_test_output_idx
    -DclusterCountTableName=pai_kmeans_test_output_couter
    -DcenterTableName=pai_kmeans_test_output_center;

Utilisation de centroïdes initiaux sélectionnés aléatoirement :

drop table if exists pai_kmeans_test_output_idx;
yes
drop table if exists pai_kmeans_test_output_couter;
yes
drop table if exists pai_kmeans_test_output_center;
yes
drop offlinemodel if exists pai_kmeans_test_output_model_;
yes
pai -name kmeans
    -project algo_public
    -DinputTableName=pai_kmeans_test_input
    -DselectedColNames=f0,f1
    -DappendColNames=f0,f1
    -DcenterCount=3
    -Dloop=10
    -Daccuracy=0.01
    -DdistanceType=euclidean
    -DinitCenterMethod=random
    -Dseed=1
    -DmodelName=pai_kmeans_test_output_model_
    -DidxTableName=pai_kmeans_test_output_idx
    -DclusterCountTableName=pai_kmeans_test_output_couter
    -DcenterTableName=pai_kmeans_test_output_center;

Étape 3 : Consultez les résultats.

Table de résultats du clustering (idxTableName) :

+------------+------------+---------------+------------+
| f0         | f1         | cluster_index | distance   |
+------------+------------+---------------+------------+
| 1          | 2          | 0             | 0.0        |
| 1          | 3          | 1             | 0.5        |
| 1          | 4          | 2             | 0.5        |
| 0          | 3          | 1             | 0.5        |
| 0          | 4          | 2             | 0.5        |
+------------+------------+---------------+------------+

Table de statistiques de clustering (clusterCountTableName) :

+---------------+---------------+
| cluster_index | cluster_count |
+---------------+---------------+
| 0             | 1             |
| 1             | 2             |
| 2             | 2             |
+---------------+---------------+

Table des centroïdes de clustering (centerTableName) :

+---------------+------------+------------+
| cluster_index | f0         | f1         |
+---------------+------------+------------+
| 0             | 1.0        | 2.0        |
| 1             | 0.5        | 3.0        |
| 2             | 0.5        | 4.0        |
+---------------+------------+------------+

Entrée creuse

Étape 1 : Créez les données de test.

create table pai_kmeans_test_sparse_input as
select * from
(
  select 1 as id, "s1" as id_s, "0:0.1,1:0.2" as kvs0, "2:0.3,3:0.4" as kvs1
  union all
  select 2 as id, "s2" as id_s, "0:1.1,2:1.2" as kvs0, "4:1.3,5:1.4" as kvs1
  union all
  select 3 as id, "s3" as id_s, "0:2.1,3:2.2" as kvs0, "6:2.3,7:2.4" as kvs1
  union all
  select 4 as id, "s4" as id_s, "0:3.1,4:3.2" as kvs0, "8:3.3,9:3.4" as kvs1
  union all
  select 5 as id, "s5" as id_s, "0:5.1,5:5.2" as kvs0, "10:5.3,6:5.4" as kvs1
) tmp;

Lorsque plusieurs colonnes creuses sont utilisées en entrée, elles sont fusionnées. Par exemple, lorsque kvs0 et kvs1 sont toutes deux sélectionnées, la première ligne est développée comme suit :

0:0.1,1:0.2,2:0.3,3:0.4,4:0,5:0,6:0,7:0,8:0,9:0,10:0

Les valeurs manquantes sont remplacées par 0. La matrice creuse résultante comporte 5 lignes et 11 colonnes (indexées de 0 à 10). Si un ID de colonne est élevé (par exemple, 123456789:0.1), les dimensions de la matrice augmentent proportionnellement, consommant ainsi beaucoup de CPU et de mémoire. Renumérotez les colonnes séquentiellement à partir de 0 ou 1 pour réduire la taille de la matrice.

Étape 2 : Soumettez la tâche de clustering.

pai -name kmeans
    -project algo_public
    -DinputTableName=pai_kmeans_test_sparse_input
    -DenableSparse=true
    -DselectedColNames=kvs0,kvs1
    -DappendColNames=id,id_s
    -DitemDelimiter=,
    -DkvDelimiter=:
    -DcenterCount=3
    -Dloop=100
    -Daccuracy=0.01
    -DdistanceType=euclidean
    -DinitCenterMethod=topk
    -Dseed=1
    -DmodelName=pai_kmeans_test_input_sparse_output_model
    -DidxTableName=pai_kmeans_test_sparse_output_idx
    -DclusterCountTableName=pai_kmeans_test_sparse_output_couter
    -DcenterTableName=pai_kmeans_test_sparse_output_center;

Étape 3 : Consultez les résultats.

Table de résultats du clustering (idxTableName) :

+------------+------------+---------------+---------------------------+
| id         | id_s       | cluster_index | distance                  |
+------------+------------+---------------+---------------------------+
| 4          | s4         | 0             | 2.90215437218629          |
| 5          | s5         | 1             | 0.0                       |
| 1          | s1         | 2             | 0.7088723439378913        |
| 2          | s2         | 2             | 1.1683321445547923        |
| 3          | s3         | 0             | 2.0548722588034516        |
+------------+------------+---------------+---------------------------+

Table de statistiques de clustering (clusterCountTableName) :

+---------------+---------------+
| cluster_index | cluster_count |
+---------------+---------------+
| 0             | 2             |
| 1             | 1             |
| 2             | 2             |
+---------------+---------------+

Table des centroïdes de clustering (centerTableName) :

+---------------+----------------------------------------+----------------------------------+
| cluster_index | kvs0                                   | kvs1                             |
+---------------+----------------------------------------+----------------------------------+
| 0             | 0:2.6,1:0,2:0,3:1.1,4:1.6,5:0         | 6:1.15,7:1.2,8:1.65,9:1.7,10:0  |
| 1             | 0:5.1,1:0,2:0,3:0,4:0,5:5.2           | 6:5.4,7:0,8:0,9:0,10:5.3        |
| 2             | 0:0.6,1:0.1,2:0.75,3:0.2,4:0.65,5:0.7 | 6:0,7:0,8:0,9:0,10:0            |
+---------------+----------------------------------------+----------------------------------+

Dépannage

Algo Job Failed-System Error-Null feature value found

La table d'entrée contient des valeurs NULL ou vides. Remplissez les valeurs manquantes à l'aide des valeurs d'imputation par défaut avant d'exécuter la tâche.

Algo Job Failed-System Error-Feature count can't be more than 2000000

L'entrée creuse possède un ID de colonne supérieur à 2 000 000. Renumérotez les colonnes séquentiellement à partir de 0 ou 1.

Algo Job Failed-System Error-kIOError:Write failed for message: comparison_measure

Le modèle de centroïde est trop volumineux pour être écrit. Renumérotez les colonnes creuses à partir de 0 ou 1 pour réduire la taille du modèle. Si la valeur de col * centerCount dépasse 270 000 000, supprimez le paramètre modelName de la commande et exécutez à nouveau la tâche.

FAILED: Failed Task createCenterTable:kOtherError:ODPS-0130161:[1,558] Parse exception - invalid token ',', expect ")"

Un nom de colonne dans la table d'entrée est un mot clé réservé SQL. Renommez la colonne pour éviter les conflits avec les mots clés SQL.

La distance cosinus produit moins de K clusters

Lors de l'utilisation de la distance cosinus, certains clusters peuvent être vides car les K centroïdes initiaux peuvent inclure des vecteurs parallèles. Les vecteurs parallèles sont traités comme le même centroïde, de sorte que certains points de données ne leur sont jamais attribués. Pour éviter cela, fournissez des centroïdes initiaux explicites à l'aide d'une table de centroïdes externe (initCenterMethod=external) afin de garantir K points de départ distincts.