python - Sklearn kNN 使用用户定义的指标(再次)

标签 python scikit-learn knn

有人在这里发布了类似的问题,但我无法完成我的工作

参见

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

作为一个额外的问题,我想传递 gamma 作为参数

非常感谢

最佳答案

来自KNeighborsClassifier documentation :metric 参数必须是字符串或 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 - Sklearn kNN 使用用户定义的指标(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37626043/

相关文章:

python - 如何告诉 HTTP 服务器不发送分块编码

python - 如何在Python(相当于R)中打印SVM的摘要?

python - 如何识别 kmeans scikit 学习中的集群标签

opencv - 在opencv中获取knn中所有样本的距离

python - KNN 模型返回与任意 k 相同的距离

python - 如何在 Tensorflow 中使用 tf.layers.dense 和 tf.data.Dataset 开发神经网络?

Python多处理大量数据

python - 我在为 python 安装 xlrd 0.9.2 时遇到了很多麻烦

python - 使用 GridSearchCV 调整随机森林超参数 scikit-learn

r - KNNCAT错误 "some classes have only one member"