← Назад к вопросам

В чем разница между K-Means и KNN моделями?

2.3 Middle🔥 232 комментариев
#Машинное обучение

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

K-Means vs KNN: кластеризация и классификация

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

K-Means — алгоритм кластеризации

K-Means — это алгоритм неконтролируемого обучения, который разбивает данные на k предопределённых кластеров на основе сходства признаков. Цель — минимизировать внутрикластерное расстояние.

Как работает:

  1. Выбирается количество кластеров (k)
  2. Случайно инициализируются k центроидов (центров кластеров)
  3. Каждая точка данных назначается ближайшему центроиду
  4. Центроиды пересчитываются как среднее значение всех точек в кластере
  5. Повторяются шаги 3-4 до сходимости
from sklearn.cluster import KMeans
import numpy as np

# Неразмеченные данные
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

# K-Means требует только количество кластеров
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans.fit(X)

# Получаем метки кластеров
labels = kmeans.labels_
print(f"Метки кластеров: {labels}")
print(f"Центроиды: {kmeans.cluster_centers_}")

Характеристики:

  • Неконтролируемое обучение — нет меток в обучающих данных
  • Этап обучения — требуется обучение на данных перед использованием
  • Скорость предсказания — быстро (просто расчёт расстояния до центроидов)
  • Память — хранит только центроиды (экономно)

KNN — алгоритм классификации/регрессии

KNN — это алгоритм контролируемого обучения, который классифицирует новую точку на основе k ближайших соседей из обучающего набора. Это алгоритм "ленивого обучения" — не требует явного обучения.

Как работает:

  1. Выбирается количество соседей (k)
  2. Для новой точки вычисляется расстояние до всех точек обучающего набора
  3. Отбираются k ближайших точек
  4. Для классификации — берётся большинственный класс среди k соседей
  5. Для регрессии — берётся среднее значение k соседей
from sklearn.neighbors import KNeighborsClassifier

# Размеченные данные (с метками)
X_train = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
y_train = np.array([0, 0, 0, 1, 1, 1])

# KNN требует обучающих данных с метками
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# Предсказание для новой точки
X_test = np.array([[2, 3]])
prediction = knn.predict(X_test)
print(f"Предсказание: {prediction}")  # 0 или 1

Характеристики:

  • Контролируемое обучение — требует меток в обучающих данных
  • Этап обучения — "ленивое обучение", просто запоминает данные
  • Скорость предсказания — медленнее (расчёт расстояния до всех точек)
  • Память — хранит все обучающие данные (требовательно)

Сравнительная таблица

ПараметрK-MeansKNN
Тип обученияНеконтролируемоеКонтролируемое
ЗадачаКластеризацияКлассификация/Регрессия
Требует метокНетДа
Этап обученияТребуется (итеративный)"Ленивое" (запоминание)
Скорость обученияЗависит от итерацийМгновенно
Скорость предсказанияБыстроМедленно
ПамятьНизкая (k центроидов)Высокая (все данные)
ИнтерпретируемостьЦентроиды как представителиВидны соседи

Практические примеры

K-Means: Сегментация клиентов

from sklearn.cluster import KMeans
import pandas as pd

# Данные о клиентах (возраст, доход)
customer_data = pd.DataFrame({
    age: [25, 28, 35, 40, 45, 50, 55],
    income: [30000, 35000, 50000, 55000, 70000, 80000, 90000]
})

# Найти 3 сегмента клиентов
kmeans = KMeans(n_clusters=3, random_state=42)
customer_data[segment] = kmeans.fit_predict(customer_data)

print(customer_data)

KNN: Классификация цветов Iris

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

# Загружаем классический датасет
iris = load_iris()
X_train, y_train = iris.data, iris.target

# Обучаем KNN на 5 соседях
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

# Предсказываем класс цветка
new_flower = [[5.1, 3.5, 1.4, 0.2]]
predicted_class = knn.predict(new_flower)
print(f"Класс цветка: {iris.target_names[predicted_class[0]]}")

Ключевые различия в применении

  • Используйте K-Means когда нужно разделить неразмеченные данные на группы
  • Используйте KNN когда есть размеченные примеры и нужно классифицировать новые объекты
В чем разница между K-Means и KNN моделями? | PrepBro