В чем разница между K-Means и KNN моделями?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
K-Means vs KNN: кластеризация и классификация
K-Means и KNN (k-nearest neighbors) часто путают из-за похожих названий, но это совершенно разные алгоритмы машинного обучения. K-Means используется для неконтролируемого обучения (кластеризация), а KNN — для контролируемого обучения (классификация и регрессия). Понимание различий критично для выбора правильного инструмента.
K-Means — алгоритм кластеризации
K-Means — это алгоритм неконтролируемого обучения, который разбивает данные на k предопределённых кластеров на основе сходства признаков. Цель — минимизировать внутрикластерное расстояние.
Как работает:
- Выбирается количество кластеров (k)
- Случайно инициализируются k центроидов (центров кластеров)
- Каждая точка данных назначается ближайшему центроиду
- Центроиды пересчитываются как среднее значение всех точек в кластере
- Повторяются шаги 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 ближайших соседей из обучающего набора. Это алгоритм "ленивого обучения" — не требует явного обучения.
Как работает:
- Выбирается количество соседей (k)
- Для новой точки вычисляется расстояние до всех точек обучающего набора
- Отбираются k ближайших точек
- Для классификации — берётся большинственный класс среди k соседей
- Для регрессии — берётся среднее значение 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-Means | KNN |
|---|---|---|
| Тип обучения | Неконтролируемое | Контролируемое |
| Задача | Кластеризация | Классификация/Регрессия |
| Требует меток | Нет | Да |
| Этап обучения | Требуется (итеративный) | "Ленивое" (запоминание) |
| Скорость обучения | Зависит от итераций | Мгновенно |
| Скорость предсказания | Быстро | Медленно |
| Память | Низкая (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 когда есть размеченные примеры и нужно классифицировать новые объекты