Я делаю генетический алгоритм для нахождения весов, чтобы применить их к евклидову расстоянию в sklearn KNN, пытаясь улучшить скорость классификации и удаляя некоторые характеристики в наборе данных (я сделал это с изменением веса на 0 ).
Я использую Python и KNN от sklearn.
Вот как я это использую:
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, чтобы использовать веса на расстоянии (я должен использовать евклидово расстояние, но я убираю квадратный корень).
Спасибо!