Sklearn kNN使用用户定义的度量(再次)

2024-10-04 07:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

有人在这里贴了一个类似的问题,但我没能完成我的工作

看到了吗

Sklearn kNN usage with a user defined metric

我想定义我的用户度量并在KNN中使用它 我好像有签名问题,但我不明白。谢谢

gamma=2


def mydist2 (x,y):
    z=(x-y)
    return (z[0]^2+gamma*z[1]^2) 
neigh = KNeighborsClassifier(n_neighbors=3,metric=mydist2)

neigh.fit(traindata,train_labels)
neigh.score(testdata,test_labels)

def mydist2 (x,y):ValueError Traceback (most recent call last) in () ----> 1 neigh.fit(traindata,train_labels) 2 neigh.score(testdata,test_labels)

C:\Users\Fagui\Anaconda2\lib\site-packages\sklearn\neighbors\base.pyc in fit(self, X, y) 801 self._y = self._y.ravel() 802 --> 803 return self._fit(X) 804 805

C:\Users\Fagui\Anaconda2\lib\site-packages\sklearn\neighbors\base.pyc

in _fit(self, X) 256 self._tree = BallTree(X, self.leaf_size, 257 metric=self.effective_metric_, --> 258 **self.effective_metric_params_) 259 elif self._fit_method == 'kd_tree': 260 self._tree = KDTree(X, self.leaf_size,

sklearn/neighbors/binary_tree.pxi in sklearn.neighbors.ball_tree.BinaryTree.__init__

(sklearn\neighbors\ball_tree.c:8381)()

sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.DistanceMetric.get_metric

(sklearn\neighbors\dist_metrics.c:4032)()

sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.PyFuncDistance.__init__

(sklearn\neighbors\dist_metrics.c:10628)()

ValueError: func must be a callable taking two arrays

作为一个额外的问题,我想把gamma作为一个论点

非常感谢


Tags: inselftreelabelsreturndistdefneighbors
3条回答

Define a metric in Cython, build the module to create the library and call it from your main code.

Sklearn经过优化,使用cython和多个进程来尽可能快地运行。编写纯python代码,特别是当它被多次调用时,会减慢代码的速度。我建议您使用cython编写自定义度量。您有一个教程,您可以遵循right here

我的问题很愚蠢

语法是正确的

问题是python中的求幂不是用^而是用**

因此16=2**4而不是2^4

FromKNeighborsClassifier documentationmetric参数必须是字符串或DistanceMetric Object,并且您给出了一个函数。在

为了传递自己的度量,必须指定:metric='pyfunc'并添加关键字参数func=mydist2。在

the similar question:他们解释说,只有在设置了algorithm='ball_tree'并且保留了默认值“auto”时,才能使用自定义度量。在

我认为以下几点应该有效:

neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2)

当把gamma作为参数时,我会尝试:

^{pr2}$

并添加参数metric_params={'gamma':2}

neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2, metric_params={'gamma':2} )

但我不确定,医生没有明确的例子。在

相关问题 更多 >