Python skknn中的加权距离

Python skknn中的加权距离,python,scikit-learn,Python,Scikit Learn,我正在做一个遗传算法来寻找权重,以便将它们应用于SKKNN中的欧几里德距离,试图提高分类率并删除数据集中的一些特征(我通过将权重更改为0来实现)。 我正在使用Python和sklearn的KNN。 我就是这样使用它的: def w_dist(x, y, **kwargs): return sum(kwargs["weights"]*((x-y)*(x-y))) KNN = KNeighborsClassifier(n_neighbors=1,metric=w_dist,metric_pa

我正在做一个遗传算法来寻找权重,以便将它们应用于SKKNN中的欧几里德距离,试图提高分类率并删除数据集中的一些特征(我通过将权重更改为0来实现)。 我正在使用Python和sklearn的KNN。 我就是这样使用它的:

def w_dist(x, y, **kwargs):
   return sum(kwargs["weights"]*((x-y)*(x-y)))

KNN = KNeighborsClassifier(n_neighbors=1,metric=w_dist,metric_params={"weights": w})
KNN.fit(X_train,Y_train)
neighbors=KNN.kneighbors(n_neighbors=1,return_distance=False)
Y_n=Y_train[neighbors]
tot=0
for (a,b)in zip(Y_train,Y_vecinos):
    if a==b:
        tot+=1

reduc_rate=X_train.shape[1]-np.count_nonzero(w)/tamaño
class_rate=tot/X_train.shape[0]
它工作得很好,但速度很慢。我一直在分析我的代码,最慢的部分是计算距离

我想问一下,是否有其他方法告诉KNN使用距离中的权重(我必须使用欧几里德距离,但我去掉了平方根)


谢谢

确实还有另一种方法,它内置于scikit学习中(因此应该更快)。您可以使用带有权重的
wminkowski
度量。下面是训练集中特征的随机权重示例

knn = KNeighborsClassifier(metric='wminkowski', p=2, 
                           metric_params={'w': np.random.random(X_train.shape[1])})

谢谢你抽出时间。我也在研究这个问题,但问题是我必须使用欧几里德度量(这是一个大学项目,所以我必须遵循一些规则)。如果你看一下,那么你可以通过在Minkowski度量中设置
p=2
,它相当于欧几里德距离。我已经更新了我的答案,所以这就是你需要它的方式。谢谢你,伙计!!