Sklearn kNN 使用用户定义的指标(再次)
Sklearn kNN usage with a user defined metric (again)
有人在这里发布了类似的问题,但我无法完成我的工作
见
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
(most recent call last) <ipython-input-81-f934c7b5c9b3> in <module>()
→ 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
作为奖励问题,我想将伽玛作为参数传递
非常感谢
来自KNeighborsClassifier documentation : the metric
argument must be a string or 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 作为参数时,我会尝试:
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} )
但我不确定,文档中没有明确的示例。
我的问题很愚蠢
语法正确
问题是 python 中的求幂不是用 ^ 而是用 **
因此 16=2**4 而不是 2^4
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
有人在这里发布了类似的问题,但我无法完成我的工作
见
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 (most recent call last) <ipython-input-81-f934c7b5c9b3> in <module>()
→ 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
805C:\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
作为奖励问题,我想将伽玛作为参数传递
非常感谢
来自KNeighborsClassifier documentation : the metric
argument must be a string or 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 作为参数时,我会尝试:
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} )
但我不确定,文档中没有明确的示例。
我的问题很愚蠢
语法正确
问题是 python 中的求幂不是用 ^ 而是用 **
因此 16=2**4 而不是 2^4
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