KMeans ignores example weights in centroid updates and default initialization

Aberta
#7,876 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
40/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
csharp
Domínio
machine-learning

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
C#
Estrelas
9.4k
Forks
2k
Merge médio
2d 18h
PRs com merge (30d)
64

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de dotnet/machinelearning

Todas as issues de dotnet/machinelearning

Issues semelhantes

Mais issues de C#

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.