Skip to content

Fix KDTree pruning to test against the splitting node#343

Merged
josevalim merged 1 commit into
elixir-nx:mainfrom
RicardoSantos-99:fix-kd-tree-pruning
Jul 20, 2026
Merged

Fix KDTree pruning to test against the splitting node#343
josevalim merged 1 commit into
elixir-nx:mainfrom
RicardoSantos-99:fix-kd-tree-pruning

Conversation

@RicardoSantos-99

Copy link
Copy Markdown
Contributor

Closes #342.

The backtracking step in predict_n decided whether to visit the sibling subtree by measuring the distance from the query to the child node's point along the split axis, instead of to the splitting hyperplane of the current node. Since the child lies inside the subtree, this overestimates the minimum possible distance and prunes subtrees that still contain closer points. On random 12x2 datasets with k=3, more than half of the queries disagreed with brute-force search.

The fix uses indices[node], the point defining the cut, in both pruning tests.

Checked against BruteKNN across dimensions, k, and metrics (Minkowski p=1,2,3 and Chebyshev), and against scikit-learn's kd_tree. Added two regression tests comparing with brute force.

The backtracking step decided whether to descend into the other subtree
by measuring the distance to the child node point instead of the
splitting hyperplane of the current node. Since the child lies somewhere
inside the subtree, this bound overestimates the true minimum distance
and prunes subtrees that still contain closer points, returning wrong
neighbors. On random 12x2 datasets with k=3, more than half of the
queries disagreed with brute-force search.

Closes elixir-nx#342
@josevalim
josevalim merged commit 1147f0b into elixir-nx:main Jul 20, 2026
2 checks passed
@josevalim

Copy link
Copy Markdown
Contributor

💚 💙 💜 💛 ❤️

@RicardoSantos-99
RicardoSantos-99 deleted the fix-kd-tree-pruning branch July 20, 2026 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

KDTree.predict returns wrong nearest neighbors

2 participants