目前我正在做一个项目,可能需要使用 kNN 算法来找到给定点的前 k 个最近邻居,比如 P.im 使用 python、sklearn 包来完成这项工作,但我们的预定义指标不是一个这些默认指标。所以我必须使用用户定义的指标,来自 sklearn 的文档,可以找到 here和 here .
似乎最新版的sklearn kNN支持用户定义的度量,但我找不到如何使用它:
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
假设我定义了一个名为 mydist=max(x-y) 的度量,然后使用 DistanceMetric.get_metric 使其成为 DistanceMetric 对象:
dt=DistanceMetric.get_metric('pyfunc',func=mydist)
从文档中,该行应该是这样的
nbrs = NearestNeighbors(n_neighbors=4, algorithm='auto',metric='pyfunc').fit(A)
distances, indices = nbrs.kneighbors(A)
但是我可以把 dt
放在哪里呢?谢谢
最佳答案
您将度量作为 metric
参数传递,并将其他度量参数作为关键字参数传递给 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]]))
关于python - Sklearn kNN 使用用户定义的指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052509/