Sklearn kNN uso con una métrica definida por el usuario

Actualmente estoy haciendo un proyecto que puede requerir el uso de un algoritmo kNN para encontrar los k vecinos más cercanos para un punto determinado, por ejemplo, P. im usando Python, el paquete sklearn para hacer el trabajo, pero nuestra métrica predefinida no es una de las predeterminadas métrica. así que tengo que usar la métrica definida por el usuario, de los documentos de sklearn, que se pueden encontrar aquí y aquí .

Parece que la última versión de sklearn kNN es compatible con la métrica definida por el usuario, pero no encuentro cómo usarla:

import sklearn from sklearn.neighbors import NearestNeighbors import numpy as np from sklearn.neighbors import DistanceMetric from sklearn.neighbors.ball_tree import BallTree BallTree.valid_metrics 

digamos que he definido una métrica llamada mydist = max (xy), luego use DistanceMetric.get_metric para convertirlo en un objeto DistanceMetric:

 dt=DistanceMetric.get_metric('pyfunc',func=mydist) 

Desde el documento, la línea debería verse así.

 nbrs = NearestNeighbors(n_neighbors=4, algorithm='auto',metric='pyfunc').fit(A) distances, indices = nbrs.kneighbors(A) 

pero donde puedo poner el dt ? Gracias

    Se pasa una métrica como parámetro de metric y argumentos de métrica adicionales como parámetros de palabras clave al constructor NN:

     >>> def mydist(x, y): ... return np.sum((xy)**2) ... >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) >>> nbrs = NearestNeighbors(n_neighbors=4, algorithm='ball_tree', ... metric='pyfunc', func=mydist) >>> nbrs.fit(X) NearestNeighbors(algorithm='ball_tree', leaf_size=30, metric='pyfunc', n_neighbors=4, radius=1.0) >>> nbrs.kneighbors(X) (array([[ 0., 1., 5., 8.], [ 0., 1., 2., 13.], [ 0., 2., 5., 25.], [ 0., 1., 5., 8.], [ 0., 1., 2., 13.], [ 0., 2., 5., 25.]]), array([[0, 1, 2, 3], [1, 0, 2, 3], [2, 1, 0, 3], [3, 4, 5, 0], [4, 3, 5, 0], [5, 4, 3, 0]])) 

    Una pequeña adición a la respuesta anterior. Cómo usar una métrica definida por el usuario que toma argumentos adicionales .

     >>> def mydist(x, y, **kwargs): ... return np.sum((xy)**kwargs["metric_params"]["power"]) ... >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) >>> Y = np.array([-1, -1, -2, 1, 1, 2]) >>> nbrs = KNeighborsClassifier(n_neighbors=4, algorithm='ball_tree', ... metric=mydist, metric_params={"power": 2}) >>> nbrs.fit(X, Y) KNeighborsClassifier(algorithm='ball_tree', leaf_size=30, metric=, n_neighbors=4, p=2, weights='uniform') >>> nbrs.kneighbors(X) (array([[ 0., 1., 5., 8.], [ 0., 1., 2., 13.], [ 0., 2., 5., 25.], [ 0., 1., 5., 8.], [ 0., 1., 2., 13.], [ 0., 2., 5., 25.]]), array([[0, 1, 2, 3], [1, 0, 2, 3], [2, 1, 0, 3], [3, 4, 5, 0], [4, 3, 5, 0], [5, 4, 3, 0]]))