[repo-assist] feat: add Imputation.kNearestWeightedImpute for distance-weighted KNN#372
Conversation
Adds Imputation.kNearestWeightedImpute to FSharp.Stats.ML, addressing the weighted KNN imputation request in #318. The new function accepts a pluggable distance metric and a distanceToWeight converter, allowing both inverse-Euclidean and similarity-based (e.g. Pearson correlation) weighting strategies. Changes: - src/FSharp.Stats/ML/Imputation.fs: new kNearestWeightedImpute function - tests/FSharp.Stats.Tests/Imputation.fs: 6 new tests (1200/1200 pass) - tests/.../FSharp.Stats.Tests.fsproj: register new test file Closes #318 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/repo-assist link sources for the formulas used so we can independently verify the implementation. |
|
✓ Repo Assist completed successfully, see workflow run. |
|
🤖 This is an automated response from Repo Assist. Here are reference sources for the two key formulas used in this PR, so you can independently verify the implementation: 1. Standard (unweighted) KNN imputation —
|
🤖 This PR was created by Repo Assist, an automated AI assistant.
Summary
Implements the distance-weighted KNN imputation variant requested in #318, adding
Imputation.kNearestWeightedImputetoFSharp.Stats.ML.Motivation
The existing
kNearestImputetreats all k neighbours equally (simple mean). Issue #318 asks for:euclideanNaNSquared)Changes
src/FSharp.Stats/ML/Imputation.fsNew function:
Parameters
distanceMetricfloat[] → float[] → floatdistance; useDistanceMetrics.Array.euclideanNaNSquaredto skip NaN positionsdistanceToWeightfun d → 1.0 / (d + epsilon); for a correlation similarity measure passidor its reciprocalkBehaviour
knearest complete rows bydistanceMetric.distanceToWeight(distance).totalWeight = 0(all weights zero), falls back to an unweighted mean (graceful degradation).nanif the complete-rows pool is empty.Typical usage
Notes & Trade-offs
kNearestImputeis unchanged.Impute→ already deprecated), missing-value encoding parameterisation, and documentation examples. These could be tackled in follow-up PRs or directly by the maintainer.euclideanNaNSquaredreturns 0. Callers using1/(d+epsilon)still get numerically stable results becauseepsilonprevents true division-by-zero and the equal-weight case degrades to the arithmetic mean.Closes #318