Взвешенное расстояние в склеарне КНН - PullRequest
0 голосов
/ 27 апреля 2018

Я делаю генетический алгоритм для нахождения весов, чтобы применить их к евклидову расстоянию в 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, чтобы использовать веса на расстоянии (я должен использовать евклидово расстояние, но я убираю квадратный корень).

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Действительно, есть другой способ, и он встроен в scikit-learn (поэтому должно быть быстрее). Вы можете использовать метрику wminkowski с весами. Ниже приведен пример со случайными весами для функций в вашем тренировочном наборе.

knn = KNeighborsClassifier(metric='wminkowski', p=2, 
                           metric_params={'w': np.random.random(X_train.shape[1])})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...