Это 3-й день моего участия в ноябрьском испытании обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.
Алгоритм KNN больше подходит для автоматической классификации домена класса с относительно большим размером выборки. Основная идея алгоритма KNN заключается в том, что если большинство из K ближайших соседей выборки в пространстве признаков принадлежат к определенной категории, то выборка также принадлежит к этой категории и имеет характеристики выборок этой категории.
Во-первых, реализация идеи
1. Рассчитайте расстояние между неизвестным экземпляром класса и всеми известными экземплярами класса.
2. Установите параметр k и выберите ближайший известный экземпляр класса среди k неизвестных экземпляров класса.
3. Подсчитайте количество каждой категории в k экземплярах известной категории, и категория с наибольшим числом является категорией текущего экземпляра неизвестной категории.
(1) Формула расчета расстояния
Важной проблемой в алгоритме KNN является вычисление расстояния между образцами.Расстояние между двумя точками экземпляра выражает степень сходства между ними. В практических приложениях нам необходимо выбрать метод измерения подобия в соответствии с реальным сценарием приложения и характеристиками самих данных.
Расчет расстояния здесь моя предыдущая статьяОбычно используемые методы измерения подобия
(2) Выбор значения k
Вообще говоря, k будет установлено как количество элементов (чтобы k экземпляров не имели одинаковое количество различных категорий), начиная с k = 1, с постепенным увеличением k эффект классификации алгоритма K ближайших соседей будет постепенно улучшаться. ; После определенного значения классификационный эффект алгоритма K-ближайших соседей будет постепенно уменьшаться при дальнейшем увеличении.
Во-вторых, реализация алгоритма KNN (евклидово расстояние)
(1) Вход
- Характеристики неизвестных образцов
- Характеристики известных образцов
- Этикетки для известных образцов
- значение k
def knn(x_test, x_data, y_data, k):
# TO DO
return sortedClassCount[0][0]
(2) Выход
- Вывод: этикетки неизвестных образцов
(3) Процесс алгоритма
1. Рассчитайте расстояние между неизвестным образцом и каждым известным образцом (евклидово расстояние).
x_data_size = x_data.shape[0]
np.tile(x_test, (x_data_size,1))
diffMat = np.tile(x_test, (x_data_size,1)) - x_data
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
2. Отсортировать расстояния и отобрать известные образцы с k наименьшими расстояниями.
sortedDistances = distances.argsort()
3. Подсчитайте количество меток k образцов
for i in range(k):
# 获取标签
votelabel = y_data[sortedDistances[i]]
# 统计标签数量
classCount[votelabel] = classCount.get(votelabel,0) + 1
4. Вернуть наибольшее количество тегов
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]