Describe the bug
cuml.neighbors.kneighbors_graph silently ignores the Minkowski feature-weight vector supplied through metric_params={"w": ...}.
For points [0,0] and [1,2], with p=2 and feature weights [1,2], the weighted Minkowski distance is:
(1 * |1|^2 + 2 * |2|^2)^(1/2) = sqrt(9) = 3
Scikit-learn returns 3.0, while cuML returns 2.236068, which is sqrt(5) and exactly matches the unweighted Euclidean distance. No warning or unsupported-parameter error is raised.
Steps/Code to reproduce bug
cuML reproducer:
import numpy as np
from cuml.neighbors import kneighbors_graph
X = np.array([
[0., 0.],
[1., 2.],
])
kwargs = dict(
n_neighbors=2,
mode="distance",
metric="minkowski",
p=2,
metric_params={"w": np.array([1.0, 2.0])},
include_self=True,
)
a = kneighbors_graph(X, **kwargs).toarray()
print(a)
Output:
[[0. 2.236068]
[2.236068 0. ]]
For comparison, the equivalent scikit-learn code:
import numpy as np
from sklearn.neighbors import kneighbors_graph
X = np.array([
[0., 0.],
[1., 2.],
])
kwargs = dict(
n_neighbors=2,
mode="distance",
metric="minkowski",
p=2,
metric_params={"w": np.array([1.0, 2.0])},
include_self=True,
)
a = kneighbors_graph(X, **kwargs).toarray()
print(a)
Output:
Expected behavior
metric_params={"w": np.array([1.0, 2.0])} should affect the Minkowski distance calculation, producing 3.0 for the off-diagonal entries:
If weighted Minkowski distance is intentionally unsupported, cuML should reject the w parameter with a clear error instead of silently returning an unweighted result.
Environment details (please complete the following information):
- Environment location: Docker
- Linux Distro/Architecture: Ubuntu 24.04 / x86_64
- GPU Model/Driver: NVIDIA GeForce RTX 4090 / 595.71.05
- CUDA: 13.2
- Method of cuDF & cuML install: conda
conda list:
conda list
# packages in environment at /opt/conda/envs/rapids-26.08:
#
# Name Version Build Channel
# Name Version Build Channel
python 3.14.6 h242f9ac_102_cp314 conda-forge
numpy 2.4.6 py314h2b28147_0 conda-forge
scipy 1.16.3 py314hf07bd8e_2 conda-forge
scikit-learn 1.9.0 np2py314hf09ca88_0 conda-forge
rapids 26.08.00 cuda13_260806_c2656556 rapidsai
cuml 26.08.00 cuda13_cp311_abi3_260805_265b9da6 rapidsai
libcuml 26.08.00 cuda13_260805_265b9da6 rapidsai
cudf 26.08.00 cuda13_cp311_abi3_260805_ff5b362d rapidsai
libraft 26.08.00 cuda13_260805_ebf92684 rapidsai
libraft-headers 26.08.00 cuda13_260805_ebf92684 rapidsai
pylibraft 26.08.00 cuda13_cp311_abi3_260805_ebf92684 rapidsai
cuvs 26.08.01 cuda13_cp311_abi3_260806_25b1be43 rapidsai
libcuvs 26.08.01 cuda13_260806_25b1be43 rapidsai
cupy 14.1.1 py314hdea9c46_0 conda-forge
cupy-core 14.1.1 py314hcd3b49b_0 conda-forge
numba 0.64.0 py314h8169c2f_0 conda-forge
numba-cuda 0.30.4 py314h42812f9_0 conda-forge
rmm 26.08.00 cuda13_cp311_abi3_260805_42d059f1 rapidsai
librmm 26.08.00 cuda13_260805_42d059f1 rapidsai
cuda-version 13.3 hcbadf70_3 conda-forge
cuda-bindings 13.3.1 py314h42812f9_1 conda-forge
cuda-cudart 13.3.29 hecca717_0 conda-forge
cuda-nvrtc 13.3.33 hecca717_0 conda-forge
libcublas 13.6.0.2 h676940d_0 conda-forge
libcusolver 12.2.6.9 h676940d_0 conda-forge
libcusparse 12.8.2.51 hecca717_0 conda-forge
libcurand 10.4.3.29 h676940d_0 conda-forge
Additional context
The only difference between the weighted and unweighted calculations is the second feature's weight:
unweighted: sqrt(1^2 + 2^2) = sqrt(5) = 2.2360679...
weighted: sqrt(1*1^2 + 2*2^2) = sqrt(9) = 3.0
The cuML result therefore demonstrates that metric_params["w"] is not applied.
The scikit-learn kneighbors_graph documentation defines metric_params as additional keyword arguments for the metric. Silently ignoring an accepted metric parameter can produce plausible-looking but incorrect graph weights in downstream manifold-learning and clustering algorithms.
Describe the bug
cuml.neighbors.kneighbors_graphsilently ignores the Minkowski feature-weight vector supplied throughmetric_params={"w": ...}.For points
[0,0]and[1,2], withp=2and feature weights[1,2], the weighted Minkowski distance is:Scikit-learn returns
3.0, while cuML returns2.236068, which issqrt(5)and exactly matches the unweighted Euclidean distance. No warning or unsupported-parameter error is raised.Steps/Code to reproduce bug
cuML reproducer:
Output:
For comparison, the equivalent scikit-learn code:
Output:
Expected behavior
metric_params={"w": np.array([1.0, 2.0])}should affect the Minkowski distance calculation, producing3.0for the off-diagonal entries:If weighted Minkowski distance is intentionally unsupported, cuML should reject the
wparameter with a clear error instead of silently returning an unweighted result.Environment details (please complete the following information):
conda list:Additional context
The only difference between the weighted and unweighted calculations is the second feature's weight:
The cuML result therefore demonstrates that
metric_params["w"]is not applied.The scikit-learn kneighbors_graph documentation defines
metric_paramsas additional keyword arguments for the metric. Silently ignoring an accepted metric parameter can produce plausible-looking but incorrect graph weights in downstream manifold-learning and clustering algorithms.