Sklearn kNN用法与用户定义的指标

发布于 2021-01-29 18:40:30

目前,我正在做一个项目,可能需要使用kNN算法查找给定点的前k个最近的邻居,例如P.
im使用python,sklearn包来完成这项工作,但我们的预定义指标不是默认指标之一指标。因此我必须使用sklearn文档中的用户定义指标,可以在此处此处找到。

看来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(xy)的度量,然后使用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?谢谢

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您将指标作为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]]))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看