KMeans ignores example weights in centroid updates and default initialization
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 40/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- csharp
- Domaine
- machine-learning
Piste de recherche
Start with src/Microsoft.ML.KMeansClustering/KMeansPlusPlusTrainer.cs: the centroid accumulation around lines 1114-1142, the division by cluster size near 1213-1214, and the K-means|| sampling and candidate weighting near 843-888 and 918-928. First run the one-cluster repro to confirm the centroid is 5 rather than the expected 9. Done means centroids are weighted means and the K-means|| path uses example weights, with tests covering both.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
KMeans accepts an ExampleWeightColumnName, but appears to ignore weight magnitudes during the main training loop and the default K-means|| initialization.
Expected behavior
Centroids should be weighted means of their assigned examples:
centroid = sum(weight * features) / sum(weight)
Initialization should also account for example weights where appropriate.
Actual behavior
Source inspection shows:
- Centroid updates accumulate unweighted feature vectors and divide by the number of assigned rows.
- Default K-means|| initialization samples using distance-based weights without incorporating example weights. Its candidate-reduction step also counts rows rather than summing their weights.
- Explicit K-means++ initialization does use example weights, but the subsequent training loop still computes unweighted centroids.
Consequently, a weight column can affect initialization differently depending on the selected algorithm, without producing weighted centroid updates.
Minimal repro
The following example isolates the centroid calculation by requesting one cluster:
using System;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers;
var mlContext = new MLContext(seed: 1);
var data = mlContext.Data.LoadFromEnumerable(new[]
{
new Input { Features = new[] { 0f }, Weight = 1f },
new Input { Features = new[] { 10f }, Weight = 9f }
});
var model = mlContext.Clustering.Trainers.KMeans(
new KMeansTrainer.Options
{
NumberOfClusters = 1,
ExampleWeightColumnName = nameof(Input.Weight),
InitializationAlgorithm =
KMeansTrainer.InitializationAlgorithm.KMeansPlusPlus,
NumberOfThreads = 1
}).Fit(data);
VBuffer<float>[] centroids = default;
model.Model.GetClusterCentroids(ref centroids, out _);
Console.WriteLine(centroids[0].GetValues()[0]);
public class Input
{
[VectorType(1)]
public float[] Features { get; set; } = new float[1];
public float Weight { get; set; }
}
Expected centroid: 9, from (1 * 0 + 9 * 10) / (1 + 9).
Source inspection predicts 5, the unweighted mean. This repro has not yet been executed.
Relevant source
- Unweighted centroid accumulation
- Division by cluster size
- K-means|| sampling
- Candidate weights calculated as row counts
Found while improving the weight-column documentation for #6746 in #7875.
[!NOTE]
This report was drafted with GitHub Copilot assistance.
- Langage dominant
- C#
- Étoiles
- 9.4k
- Forks
- 2k
- Merge moyen
- 2 j 18 h
- PR mergées (30 j)
- 64
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de dotnet/machinelearning
-
area-Native untriaged
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
dotnet/machinelearning#7837 ·
Les mainteneurs répondent en général sous 1 jour
-
area-TensorFlow untriaged
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
dotnet/machinelearning#7836 ·
Les mainteneurs répondent en général sous 1 jour
-
ToArrowRecordBatches accumulates arrays from previous batches, producing invalid record batchesOuvertearea-DataFrame bug untriaged
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
dotnet/machinelearning#7799 ·
Les mainteneurs répondent en général sous 1 jour
-
LlamaTokenizer encodes some runs of repeated characters differently from SentencePiecePeut-être pris @Laurianti l’a pris il y a 42 jours. Ouvertearea-Tokenizers untriaged
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
dotnet/machinelearning#7751 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
BertTokenizer merges words separated only by `\n`, `\t` or `\r`Peut-être pris @Laurianti l’a pris il y a 23 jours. Ouvertearea-Tokenizers green
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
dotnet/machinelearning#7724 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de dotnet/machinelearning
Issues similaires
-
bug emitter:client:csharp
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
microsoft/typespec#12572 · 1 commentaire · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
needs-area-label
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 2 jours
-
AWS Lambda: KeyNotFoundException drops HTTP-triggered transactions when allowAllHeaders is disabledOuvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
newrelic/newrelic-dotnet-agent#3949 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
area-networking
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
dotnet/aspnetcore#70545 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 87/100
Les mainteneurs répondent en général sous 1 jour