Как получить метку с наименьшей суммой расстояний, если два класса связаны при классификации с помощью KNN только с использованием python?

#python #numpy #knn

Вопрос:

Действительно ли кто-нибудь может мне в этом помочь? Я создаю классификатор KNN с нуля, и мне интересно, можно ли получить метку класса с наименьшими суммарными расстояниями, когда две метки классов связаны при классификации. Например, если k=7, я получу массив меток NumPy: [1, 0, 0, 0, 1, 1, 2]. В этих случаях сумма меток четна, три 1 и три 0. Как я могу получить наименьшие суммарные расстояния между этими двумя классами, чтобы узнать, какая метка класса выбрана лучше? Есть какие-нибудь идеи? Я добрался сюда без всякого успеха!

 def k_neighbours(X_, y_, x, k=7):  lengths = [euclidean_length(x, x2) for x2 in X_]  k_index = np.argsort(lengths)[: k]  k_nearest_classes = [y_[i] for i in k_index]  k_lengths = [lengths[i] for i in k_index]  counts = np.bincount(k_nearest_classes)  most_common_class = np.argmax(counts)  for i in conuts:  even_result[]  get_numbers[]  if i == sum(counts-1)/2:  even_result.append(i)   elif len(even_result) == 2:  get_numbers = [y_[i] for j in enumerate(k_nearest_classes)]   if j ==   sum(lengths[i])   

Любые предложения будут оценены по достоинству!

Комментарии:

1. np.argpartition здесь больше подходит, чем argsort . Что касается самого вопроса, создайте 2d-массив с классом, расстоянием и фиктивной переменной для подсчета. Сгруппируйте по классам и сумме, затем argmax по (количество, расстояние). Это было бы еще более лаконично с pandas for groupby

2. Спасибо, чувак! Я попробую это сделать! Хорошая штука!

3. поправка: argmax по (count, -distance) расстоянию следует отрицать, чтобы сначала получить более короткую сумму