首页 文章

sklearn KNN中的加权距离

提问于
浏览
1

我正在制作遗传算法以找到权重,以便将它们应用于sklearn KNN中的欧氏距离,尝试提高分类率并删除数据集中的某些特征(我将此权重改为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在距离内使用权重(我必须使用欧氏距离,但我删除了平方根) .

谢谢!

1 回答

  • 2

    确实有另一种方式,它内置于scikit-learn(所以应该更快) . 您可以将 wminkowski 指标与权重一起使用 . 下面是一个示例,其中包含训练集中功能的随机权重 .

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

相关问题