当我想在KNeighborsClassifier中使用标准欧几里得度量时。
knn = KNeighborsRegressor(n_neighbors=k,metric='seuclidean' )knn.fit(newx,y)
出现了以下类型错误:
C:\Anaconda3\lib\site-packages\sklearn\neighbors\base.py in fit(self, X, y) 741 X, y = check_X_y(X, y, "csr", multi_output=True) 742 self._y = y--> 743 return self._fit(X) 744 745 C:\Anaconda3\lib\site-packages\sklearn\neighbors\base.py in _fit(self, X) 238 self._tree = BallTree(X, self.leaf_size, 239 metric=self.effective_metric_,--> 240 **self.effective_metric_params_) 241 elif self._fit_method == 'kd_tree': 242 self._tree = KDTree(X, self.leaf_size,sklearn\neighbors\binary_tree.pxi in sklearn.neighbors.ball_tree.BinaryTree.__init__ (sklearn\neighbors\ball_tree.c:9220)()sklearn\neighbors\dist_metrics.pyx in sklearn.neighbors.dist_metrics.DistanceMetric.get_metric (sklearn\neighbors\dist_metrics.c:4821)()sklearn\neighbors\dist_metrics.pyx in sklearn.neighbors.dist_metrics.SEuclideanDistance.__init__ (sklearn\neighbors\dist_metrics.c:6399)()TypeError: __init__() takes exactly 1 positional argument (0 given)
我自己编写了一个函数来实现knn,如下所示:
而sklearn的代码如下:
for k in range(1,8): knn = KNeighborsRegressor(n_neighbors=k,metric='seuclidean' , metric_params={'V':x.std(axis=0)}) knn.fit(x ,y) print(knn.predict(testx)[0], '%'*10, k)
以上两个结果不一致,为什么?
回答:
seuclidean
距离度量需要一个 V
参数来满足以下计算:
sqrt(sum((x - y)^2 / V))
如在 sklearn
的距离度量文档中所定义。
您可以在 KNeighborsRegressor
初始化时使用 metric_params
参数传入 V
(见KNR文档)。