es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que, al utilizar la métrica mahalanobis con el algoritmo NearestNeighbors, se requiere el parámetro VI al pasar Y. El parámetro VI 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 covarianza V, pero Y no se está pasando explícitamente. Sin embargo, el algoritmo NearestNeighbors utiliza implícitamente todo el conjunto de datos de entrada X como tanto X como Y de forma predeterminada, y esto está causando el error.

    Para corregir el error y usar solo la primera observación en X, el parámetro VI se puede calcular manualmente y pasar de la siguiente manera:

    import numpy as np
    from sklearn.datasets import make_classification
    from sklearn.neighbors import NearestNeighbors
    
    X, y = make_classification()
    
    # Calcular la matriz de covarianza inversa
    V_inv = np.linalg.inv(np.cov(X, rowvar=False))
    
    # Especificar algoritmo y métrica con parámetros métricos
    nn = NearestNeighbors(algorithm='brute', metric='mahalanobis', metric_params={'VI': V_inv}) 
    
    # Encontrar los k vecinos más cercanos de la primera observación en X
    nn.fit(X).kneighbors(X[:1, :], return_distance=False)
    

    Note que return_distance=False se agrega a kneighbors() para obtener solo los índices de los vecinos más cercanos sin sus distancias.

Comments are closed.