K-ближайшие соседи (K-NN) — это контролируемый алгоритм машинного обучения, который можно использовать как для задач классификации, так и для задач регрессии. Основная идея K-NN состоит в том, чтобы классифицировать или прогнозировать значение новой точки данных, сравнивая ее с k ближайшими соседями в обучающем наборе данных.

В классификации K-NN выходная переменная является категориальной. Алгоритм работает, находя k ближайших соседей к новой точке данных в обучающем наборе данных, а затем назначая класс, наиболее распространенный среди k соседей, в качестве прогнозируемого класса новой точки данных. В регрессии K-NN выходная переменная непрерывна. Алгоритм работает, находя k ближайших соседей, а затем беря среднее (для простого K-NN) или взвешенное среднее (для взвешенного K-NN) их выходных переменных в качестве прогнозируемого значения новой точки данных.

K-NN может быть реализован с помощью следующих шагов:

  1. Выберите значение k (количество соседей для рассмотрения).
  2. Рассчитайте расстояние между новой точкой данных и всеми точками в обучающем наборе данных.
  3. Расположите расстояния в порядке возрастания.
  4. Выберите k ближайших соседей.
  5. Назначьте класс или прогнозируемое значение на основе класса большинства или среднего значения k соседей.

Взвешенный K-NN присваивает разные веса каждому из k ближайших соседей в зависимости от их расстояния до новой точки данных. Чем ближе сосед, тем выше его вес. Прогнозируемое значение затем вычисляется как взвешенное среднее выходных переменных k соседей.

Существуют различные меры расстояния, которые можно использовать в K-NN, включая евклидово расстояние, манхэттенское расстояние и расстояние Минковского. Евклидово расстояние является наиболее часто используемой мерой расстояния в K-NN. Он рассчитывается как квадратный корень из суммы квадратов разностей между координатами двух точек.

Определение подходящего значения k является важным фактором в K-NN. Небольшое значение k может привести к переоснащению, а большое значение k может привести к недообучению. Обычно оптимальное значение k выбирается с помощью перекрестной проверки.

В бинарной классификации K-NN работает хорошо, когда между двумя классами существует четкая граница. В многоклассовой классификации K-NN можно использовать с различными стратегиями, такими как «один против всех» или «один против одного». В режиме «один против всех» каждый класс рассматривается как положительный класс, а остальные — как отрицательные классы. В режиме «один против одного» учитываются все пары классов, и для каждой пары обучается отдельный классификатор K-NN.

В Python K-NN можно реализовать с помощью библиотеки scikit-learn. Вот пример того, как реализовать K-NN в Python для классификации:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# Load the dataset
dataset = load_data()
# Split the dataset into training and test sets
X_train, X_test, y_train, y_test = train_test_split(dataset.data, dataset.target, test_size=0.3, random_state=42)
# Create a K-NN classifier with k=5
knn = KNeighborsClassifier(n_neighbors=5)
# Train the classifier on the training set
knn.fit(X_train, y_train)
# Predict the classes of the test set
y_pred = knn.predict(X_test)
# Print the accuracy score
print("Accuracy:", knn.score(X_test, y_test))

В этом примере загружается набор данных, разбивается на обучающий и тестовый наборы, создается классификатор K-NN с k = 5, обучается классификатор на обучающем наборе и прогнозируются классы тестового набора. Наконец, он печатает оценку точности классификатора.

Ниже приведены изображения k = 1, 5 и 15 для игрушечного набора данных.