[英]Weighted distance in sklearn KNN
我正在制作一個遺傳算法來尋找權重,以便將它們應用於 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 在距離中使用權重(我必須使用歐幾里德距離,但我刪除了平方根)。
謝謝!
確實還有另一種方法,它內置於 scikit-learn 中(所以應該更快)。 您可以將wminkowski
指標與權重一起使用。 以下是訓練集中特征的隨機權重示例。
knn = KNeighborsClassifier(metric='wminkowski', p=2,
metric_params={'w': np.random.random(X_train.shape[1])})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.