KMeans ignores example weights in centroid updates and default initialization
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
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.
- Linguagem predominante
- C#
- Estrelas
- 9.4k
- Forks
- 2k
- Merge médio
- 2d 18h
- PRs com merge (30d)
- 64
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de dotnet/machinelearning
-
area-Native untriaged
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
dotnet/machinelearning#7837 ·
Mantenedores costumam responder em até 1 dia
-
area-TensorFlow untriaged
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
dotnet/machinelearning#7836 ·
Mantenedores costumam responder em até 1 dia
-
ToArrowRecordBatches accumulates arrays from previous batches, producing invalid record batchesAbertaarea-DataFrame bug untriaged
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
dotnet/machinelearning#7799 ·
Mantenedores costumam responder em até 1 dia
-
LlamaTokenizer encodes some runs of repeated characters differently from SentencePieceTalvez já em andamento @Laurianti assumiu há 42 dias. Abertaarea-Tokenizers untriaged
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
dotnet/machinelearning#7751 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
BertTokenizer merges words separated only by `\n`, `\t` or `\r`Talvez já em andamento @Laurianti assumiu há 23 dias. Abertaarea-Tokenizers green
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
dotnet/machinelearning#7724 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de dotnet/machinelearning
Issues semelhantes
-
bug emitter:client:csharp
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
microsoft/typespec#12572 · 1 comentário · 1 reação ·
Mantenedores costumam responder em até 1 dia
-
needs-area-label
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 2 dias
-
AWS Lambda: KeyNotFoundException drops HTTP-triggered transactions when allowAllHeaders is disabledAbertabug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
newrelic/newrelic-dotnet-agent#3949 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
area-networking
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
dotnet/aspnetcore#70545 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 87/100
Mantenedores costumam responder em até 1 dia