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]]))