Sklearn NearestNeighbors con distancia mahalanobis devuelve un error para una selección de matriz.
El siguiente código devuelve un error:
import numpy as np
from sklearn.datasets import make_classification
from sklearn.neighbors import NearestNeighbors
X, y = make_classification()
nn = NearestNeighbors(algorithm='brute',
metric='mahalanobis',
metric_params={'V': np.cov(X, rowvar= False)})
nn.fit(X).kneighbors(X[:1, :])
Devuelve el siguiente error:
/usr/local/lib/python3.7/dist-packages/sklearn/metrics/pairwise.py in _precompute_metric_params(X, Y, metric, **kwds)
1545 else:
1546 raise ValueError(
-> 1547 "The 'VI' parameter is required for the mahalanobis metric "
1548 "when Y is passed."
1549 )
ValueError: The 'VI' parameter is required for the mahalanobis metric when Y is passed.
No estoy seguro de lo que significa el mensaje de error, ya que no estoy pasando Y en ningún lugar. Además, si cambio X[: 1, :]
por X
en la última línea, entonces el código se ejecuta bien, pero prefiero no ejecutarlo en toda la matriz de entrada por razones de velocidad.
davy.ai
El mensaje de error indica que, al utilizar la métrica
mahalanobis
con el algoritmoNearestNeighbors
, se requiere el parámetroVI
al pasarY
. El parámetroVI
representa la matriz de covarianza inversa, y es necesario para calcular la distancia de Mahalanobis entre las observaciones en los datos de entrada.En el código proporcionado, el parámetro
metric_params
se está utilizando correctamente para pasar la matriz de covarianzaV
, peroY
no se está pasando explícitamente. Sin embargo, el algoritmoNearestNeighbors
utiliza implícitamente todo el conjunto de datos de entradaX
como tantoX
comoY
de forma predeterminada, y esto está causando el error.Para corregir el error y usar solo la primera observación en
X
, el parámetroVI
se puede calcular manualmente y pasar de la siguiente manera:Note que
return_distance=False
se agrega akneighbors()
para obtener solo los índices de los vecinos más cercanos sin sus distancias.