KMeans ignores example weights in centroid updates and default initialization
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 40/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- csharp
- Bereich
- machine-learning
Rechercherichtung
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.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
- Vorherrschende Sprache
- C#
- Sterne
- 9.4k
- Forks
- 2k
- Ø Merge
- 2 T. 18 Std.
- Gemergte PRs (30 T.)
- 64
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus dotnet/machinelearning
-
area-Native untriaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
dotnet/machinelearning#7837 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area-TensorFlow untriaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
dotnet/machinelearning#7836 ·
Maintainer antworten meist innerhalb von 1 Tag
-
ToArrowRecordBatches accumulates arrays from previous batches, producing invalid record batchesOffenarea-DataFrame bug untriaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
dotnet/machinelearning#7799 ·
Maintainer antworten meist innerhalb von 1 Tag
-
LlamaTokenizer encodes some runs of repeated characters differently from SentencePieceEvtl. vergeben @Laurianti hat das vor 42 Tagen übernommen. Offenarea-Tokenizers untriaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
dotnet/machinelearning#7751 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
BertTokenizer merges words separated only by `\n`, `\t` or `\r`Evtl. vergeben @Laurianti hat das vor 23 Tagen übernommen. Offenarea-Tokenizers green
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
dotnet/machinelearning#7724 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in dotnet/machinelearning
Ähnliche Issues
-
bug emitter:client:csharp
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
microsoft/typespec#12572 · 1 Kommentar · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
needs-area-label
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 2 Tagen
-
AWS Lambda: KeyNotFoundException drops HTTP-triggered transactions when allowAllHeaders is disabledOffenbug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
newrelic/newrelic-dotnet-agent#3949 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
area-networking
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
dotnet/aspnetcore#70545 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 87/100
Maintainer antworten meist innerhalb von 1 Tag