1

我正在尝试使用 Mahalanobis 作为距离度量来实现 KNN 模型,但是当我执行代码时出现错误:

值错误:“V 的大小不匹配

其中 V 是特征的协方差矩阵。

我的代码的相关部分如下:

X_train, X_test, y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=10,stratify=y)

knn2=KNeighborsClassifier(n_neighbors=20, metric='mahalanobis', metric_params={'V': np.cov(X_train)})

knn2.fit(X_train,y_train) # this is the line that causes the error. 

我在 github 上查看了 sklearn 的距离度量代码的 repo (从第 628 行开始是 Mahalanobis),并且可以看到错误来自以下原因:

cdef inline DTYPE_t rdist(self, DTYPE_t* x1, DTYPE_t* x2,
                              ITYPE_t size) nogil except -1:
        if size != self.size:
            with gil:
                raise ValueError('Mahalanobis dist: size of V does not match')

我已经弄清楚了self.size我的情况,但无法弄清楚size是什么。

任何人都可以帮助解决这个错误吗?

谢谢

4

2 回答 2

1

将参数 rowvar=False 传递给 np.cov 它应该可以工作。您的 knn 构造函数应如下所示:

knn2=KNeighborsClassifier(n_neighbors=20, metric='mahalanobis', metric_params={'V': np.cov(X_train, rowvar=False)})
于 2021-05-10T09:24:11.060 回答
-2

这里。我认为它要求的是特征而不是样本之间的协方差。

于 2020-05-12T18:49:19.037 回答