Пример 1. Вычисление евклидова расстояния

Алгоритм kNN определяет ближайшие объекты на основе расстояния между признаками.

Евклидово расстояние вычисляется по формуле:

d(x, a) = √Σ(xⱼ − aⱼ)².

Рассмотрим новый объект X = (2, 2) и два обучающих объекта: A = (2, 3), B = (5, 6).

import numpy as np

 

X = np.array([2, 2])

A = np.array([2, 3])

B = np.array([5, 6])

 

distance_A = np.linalg.norm(X - A)

distance_B = np.linalg.norm(X - B)

 

print("Расстояние до A:", distance_A)

print("Расстояние до B:", distance_B)

 

if distance_A < distance_B:

    print("Ближайший сосед: A")

else:

    print("Ближайший сосед: B")

Результат:

Расстояние до A: 1.0

Расстояние до B: 5.0

Ближайший сосед: A.

При k = 1 решение определяется ближайшим объектом A.

Пример 2. Классификация методом kNN

В задаче классификации алгоритм kNN определяет класс нового объекта по голосованию ближайших соседей.

import numpy as np

from sklearn.neighbors import KNeighborsClassifier

 

X_train = np.array([

    [1, 1],

    [2, 3],

    [3, 2],

    [6, 6],

    [7, 7]

])

 

y_train = np.array([0, 0, 0, 1, 1])

 

model = KNeighborsClassifier(n_neighbors=3)

model.fit(X_train, y_train)

 

new_object = np.array([[2, 2]])

 

prediction = model.predict(new_object)

 

distances, indices = model.kneighbors(new_object)

 

print("Ближайшие соседи:", indices[0])

print("Расстояния:", distances[0])

print("Прогнозируемый класс:", prediction[0])

Результат:

Три ближайших объекта относятся к классу 0.

Прогнозируемый класс: 0.

Алгоритм вычисляет расстояния, выбирает трёх ближайших соседей и определяет класс большинством голосов.

Пример 3. kNN-регрессия и масштабирование признаков

В задаче регрессии алгоритм kNN прогнозирует числовое значение по ближайшим соседям.

Рассмотрим три наблюдения с целевыми значениями 20, 25 и 30.

import numpy as np

from sklearn.neighbors import KNeighborsRegressor

 

X_train = np.array([

    [1],

    [2],

    [3]

])

 

y_train = np.array([20, 25, 30])

 

model = KNeighborsRegressor(

    n_neighbors=3,

    weights="uniform"

)

 

model.fit(X_train, y_train)

 

prediction = model.predict([[2.5]])

 

print("Прогноз:", prediction[0])

Результат:

Прогноз: 25.0.

При использовании обычного среднего прогноз равен:

ŷ = (20 + 25 + 30) / 3 = 25.

Для признаков с разными масштабами рекомендуется использовать Pipeline со стандартизацией:

from sklearn.pipeline import make_pipeline

from sklearn.preprocessing import StandardScaler

from sklearn.neighbors import KNeighborsRegressor

 

model = make_pipeline(

    StandardScaler(),

    KNeighborsRegressor(n_neighbors=3)

)

 

model.fit(X_train, y_train)

 

print("Прогноз:", model.predict([[2.5]])[0])

Масштабирование включается в Pipeline, чтобы статистики преобразования вычислялись только по данным, используемым для обучения.