sklearn example algoritmo python knn

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



knn algorithm example (2)

Actualmente estoy haciendo un proyecto que puede requerir el uso de un algoritmo kNN para encontrar los k primeros 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 esas opciones predeterminadas métrica. así que tengo que usar la métrica definida por el usuario, de los documentos de sklearn, que se pueden encontrar here y here .

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


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((x-y)**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=<function mydist at 0x7fd259c9cf50>, 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]]))


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

>>> def mydist(x, y): ... return np.sum((x-y)**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]]))