Menu
CoddyTech

Когда K-Means не справляется

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 14 из 51.

Алгоритм k-средних представляет каждый кластер в виде круглого пятна вокруг его центра. Дротики образуют мишень с кольцом вокруг неё, а k-средних делит их пополам:

Две диаграммы с 140 дротиками. Слева — истинное распределение: плотная группа в центре мишени внутри широкого кольца. Справа — k-средних при k = 2: прямая пунктирная граница делит мишень, кольцо и центр пополам — на левую и правую части, в каждой из которых есть крестик, обозначающий центр

Каждая точка присоединяется к ближайшему центру, поэтому граница между двумя кластерами — это прямая линия посередине между центрами. Никакая прямая линия не отделяет кольцо от его середины.

Длинные, изогнутые или очень неоднородные группы приводят к сбоям в k-means одинаковым образом. Алгоритм всё равно возвращает кластеры, поэтому всегда смотрите на график.

challenge icon

Задание

Средне

Дрон обнаружил 200 тюленей на двух изогнутых песчаных отмелях. Стартовый код показывает истинное распределение на панели left.

  1. Сгруппируй тюленей с помощью метода k-средних, k = 2.
  2. На панели right отобрази каждую группу точечной диаграммой и обозначь её как cluster 0 или cluster 1.
  3. Отметь центры чёрными маркерами "X" с подписью centers. Добавь легенду, затем покажи график.

Coddy описывает твою диаграмму и подсчитывает, сколько тюленей осталось на своей песчаной отмели. Вот так это выглядит для двух групп:

Две диаграммы. Слева — истинное распределение: большая рассеянная группа и справа от неё небольшая компактная группа. Справа — метод k-средних с k = 2: группа, содержащая небольшое скопление, также захватывает правый край большой группы, а чёрные крестики отмечают два центра

Попробуйте сами

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 тюленей отдыхают на двух изогнутых песчаных отмелях, вид с дрона (координаты в 100 м)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# Отображает настоящие песчаные отмели на ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python