目前,我正在做一个项目,它可能需要使用kNN算法来查找给定点的前k个最近邻居,比如P.。我使用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(x-y)的指标,然后使用DistanceMetric.get_
指标使其成为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在哪里?谢谢
发布于 2014-01-11 03:45:20
您可以将度量传递为metric param和其他度量参数作为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]]))
发布于 2015-07-24 17:05:14
这是对之前答案的一个小补充。如何使用用户定义的指标其他参数..。
>>> 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=, 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]]))
发布于 2021-02-21 07:23:00
在尝试使用用户定义的度量时,使用KNeighborsRegressor()只能通过设置algorithm='brute‘来工作。
否则fit()可以工作,但是当使用JupyterLab时,predict()会失败,错误为‘return NULL with set an error’,或者当使用Google Colab时,错误为'SystemError: error return without exception set‘
https://stackoverflow.com/questions/21052509
复制相似问题