#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 groupby2. Спасибо, чувак! Я попробую это сделать! Хорошая штука!
3. поправка: argmax по
(count, -distance)
расстоянию следует отрицать, чтобы сначала получить более короткую сумму