KNeighborsRegressor 用户定义的指标重塑

KNeighborsRegressor User-Defined Metric Reshaped

我正在定义一个自定义距离度量,用于 Scikit-Learn 的 KNearestRegressor。

我的距离度量采用两张图像并根据视觉特征计算它们的相似性:

def imageMatchingMetric(x,y): 
      # the RGB images have size 480x640
      x = x.reshape(480,640,3)
      y = y.reshape(480,640,3)
      (...)

因此,我的 X 矩阵是一个图像矩阵。然后我打电话给

metricObject = sklearn.neighbors.DistanceMetric.get_metric('pyfunc', func=imageMatchingMetric)
clf = KNeighborsRegressor(n_neighbors=d['kneighbours'], metric=metricObject)
clf.fit(X, y)

并且我收到来自 imageMatchingMetric 的错误消息,即在重塑时,我必须保持尺寸相同。

我通过调试发现 x imageMatchingMetric 接收到的是一个长度为 10 的向量,它不是来自 X 的一行。

这是为什么?我该如何解决?

谢谢!

您无需将指标包装在 DistanceMetric 对象中,只需将其作为参数传递给 KNeighborsRegressor。

然后因为你正在做一个重塑,它会失败,因为 sklearn 试图通过尝试用两个形状为 10 左右的向量调用它来检查你的度量是否是一个有效的函数 [1]。您可以只检测这种情况和 return 0(这是一个有效的距离度量)。

[1] https://github.com/scikit-learn/scikit-learn/blob/969337c905bc4b83d43105fd807576bc2efea536/sklearn/neighbors/dist_metrics.pyx#L1091