Пример 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, чтобы статистики
преобразования вычислялись только по данным, используемым для обучения.