KMeans ignores example weights in centroid updates and default initialization

Ouverte
#7,876 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

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

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

area-Trainers bug

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

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

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de dotnet/machinelearning

Toutes les issues de dotnet/machinelearning

Issues similaires

Plus d'issues C#

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.