有人在这里发布了类似的问题,但我无法完成我的工作
见
Sklearn kNN usage with a user defined metric
我想定义我的user_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 (最近的呼叫最后)in() ----> 1 neigh.fit(traindata,train_labels) 2 neigh.score(testdata,test_labels)
C:\用户\法吉\ Anaconda2 \ lib中\站点包\ sklearn \邻居\ base.pyc 适合(自我,X,y) 801 self._y = self._y.ravel() 802 - > 803返回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 \邻居\ ball_tree.c:8381)()
sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.DistanceMetric.get_metric
(sklearn \邻居\ dist_metrics.c:4032)()
sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.PyFuncDistance.__init__
(sklearn \邻居\ dist_metrics.c:10628)()
ValueError: func must be a callable taking two arrays
作为奖励问题,我想将伽玛作为参数传递
非常感谢
答案 0 :(得分:1)
我的问题非常愚蠢
语法正确
问题是python中的取幂不是用^而是用**
因此16 = 2 ** 4而不是2 ^ 4
答案 1 :(得分:0)
来自KNeighborsClassifier documentation:metric
参数必须是字符串或DistanceMetric Object,并且您提供了一个函数。
要传递自己的指标,您必须指定:metric='pyfunc'
并添加关键字参数func=mydist2
。
在the similar question中:他们解释说,只有在设置algorithm='ball_tree'
时才能使用自定义指标,并保留默认值“自动”。
我认为以下内容应该有效:
neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2)
当谈到将gamma作为参数传递时,我会尝试:
def mydist2 (x,y, gamma=2):
z=(x-y)
return (z[0]^2+gamma*z[1]^2)
并添加参数metric_params={'gamma':2}
neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2, metric_params={'gamma':2} )
但我不确定,文档中没有明确的例子。
答案 2 :(得分:-1)
在Cython中定义一个指标,构建模块以创建库并从主代码中调用它。
Sklearn经过优化,使用cython和几个进程尽可能快地运行。编写纯Python代码,尤其是在多次调用它时,会降低代码的速度。我建议您使用cython编写自定义指标。您有一个教程,可以关注right here