【问题标题】:Weighted distance in sklearn KNNsklearn KNN中的加权距离
【发布时间】:2018-10-08 10:20:31
【问题描述】:

我正在制作一种遗传算法来查找权重,以便将它们应用于 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 在距离中使用权重(我必须使用欧几里德距离,但我删除了平方根)。

谢谢!

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    确实有另一种方法,它内置在 scikit-learn 中(所以 应该 更快)。您可以将wminkowski 指标与权重一起使用。以下是训练集中特征的随机权重示例。

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

    【讨论】:

    • 感谢您的宝贵时间。我也在看,但问题是我必须使用欧几里得度量(是一个大学项目,所以我必须遵守一些规则)。
    • 如果您查看KNeighborsClassifier docs,那么您可以通过在 Minkowski 度量中设置p=2 来看到它相当于欧几里得距离。我已经更新了我的答案,所以这就是你需要的。
    • Guau 的改进是巨大的。谢谢老哥!!
    猜你喜欢
    • 2019-02-12
    • 2016-10-18
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多