Перейти к основному содержимому

Метод K-средних

Кластеризация KK представителями

Повторим общую схему работы метода K-представителей:

  1. Инициализировать μ1,,μK\boldsymbol{\mu}_1, \dots, \boldsymbol{\mu}_K.

  2. Повторять до сходимости:

    • Для n=1,2,...Nn=1,2,...N обновить метки кластеров:

      zn=argminkρ(xn,μk)z_n=\arg\min_k \rho(\mathbf{x}_n,\boldsymbol{\mu}_k)
    • Для k=1,2,...Kk=1,2,...K обновить центроиды кластеров:

      μk=argminμnCkρ(xn,μ)\boldsymbol{\mu}_k=\arg\min_{\boldsymbol{\mu}}\sum_{n\in C_k} \rho(\mathbf{x}_n,\boldsymbol{\mu})
  3. ВЕРНУТЬ z1,,zNz_1, \dots, z_N.

Здесь

  • CkC_k - индексы объектов, принадлежащих кластеру kk;

  • z1,...zNz_{1},...z_{N} - назначения объектам x1,x2,...xN\mathbf{x}_1,\mathbf{x}_2,...\mathbf{x}_{N} номеров их кластеров ;

  • μ1,...μK\boldsymbol{\mu}_{1},...\boldsymbol{\mu}_{K} - центры каждого кластера, называемые также центроидами.

Кластеризация методом KK средних

Метод KK-средних (K-means) является самым популярным частным случаем общего алгоритма KK-представителей. Он получается, если в качестве меры расстояния ρ()\rho(\cdot) выбрать квадрат Евклидова расстояния:

ρ(x,μ)=xμ2=j=1D(xjμj)2\rho(\boldsymbol{x}, \boldsymbol{\mu}) = \|\boldsymbol{x} - \boldsymbol{\mu}\|^2 = \sum_{j=1}^D (x^j - \mu^j)^2

где xRD\boldsymbol{x} \in \mathbb{R}^D — вектор объекта, а μRD\boldsymbol{\mu} \in \mathbb{R}^D — вектор центра кластера. Индекс jj, как обычно, обозначает номер признака.

Минимизируемая функция потерь называемая инерцией и выглядит так:

L=n=1Nxnμzn2minμ,z\mathcal{L} = \sum_{n=1}^{N} \|\boldsymbol{x}_n - \boldsymbol{\mu}_{z_n}\|^2 \to \min_{\boldsymbol{\mu}, \boldsymbol{z}}

Расчёт центроидов

Почему же метод называется "KK-средних"? Рассмотрим шаг обновления центров при фиксированных метках кластеров z1,,zNz_1, \dots, z_N. Нам нужно найти такой вектор μk\boldsymbol{\mu}_k, который минимизирует сумму квадратов расстояний до всех объектов xn\boldsymbol{x}_n, входящих в кластер CkC_k:

μk=argminμnCkxnμ2\boldsymbol{\mu}_k = \arg\min_{\boldsymbol{\mu}} \sum_{n \in C_k} \|\boldsymbol{x}_n - \boldsymbol{\mu}\|^2

Функция J(μ)=nCkxnμ2J(\boldsymbol{\mu}) = \sum_{n \in C_k} \|\boldsymbol{x}_n - \boldsymbol{\mu}\|^2 является суммой квадратичных функций, а значит — строго выпуклой (параболоиды с ветвями вверх). Следовательно, условие равенства градиента нулю является не только необходимым, но и достаточным условием глобального минимума.

Возьмем производную по вектору μ\boldsymbol{\mu} и приравняем её к нулю:

μJ(μ)=nCkμ(xnμ)T(xnμ)=2nCk(xnμ)=0\nabla_{\boldsymbol{\mu}} J(\boldsymbol{\mu}) = \sum_{n \in C_k} \nabla_{\boldsymbol{\mu}} (\boldsymbol{x}_n - \boldsymbol{\mu})^T (\boldsymbol{x}_n - \boldsymbol{\mu}) = -2 \sum_{n \in C_k} (\boldsymbol{x}_n - \boldsymbol{\mu}) = 0

Раскрывая сумму, получаем:

nCkxnCkμk=0\sum_{n \in C_k} \boldsymbol{x}_n - |C_k| \cdot \boldsymbol{\mu}_k = 0

Отсюда следует формула пересчета:

μk=1CknCkxn\boldsymbol{\mu}_k = \frac{1}{|C_k|} \sum_{n \in C_k} \boldsymbol{x}_n

Таким образом, оптимальным представителем кластера по квадрату метрики L2L_2 является среднее арифметическое всех объектов этого кластера.

Алгоритм Ллойда

Классическая реализация метода KK-средних называется алгоритмом Ллойда. Она выглядит следующим образом:

  1. Инициализировать центры μ1,,μK\boldsymbol{\mu}_1, \dots, \boldsymbol{\mu}_K (случайно или методом K-means++).

  2. ПОВТОРЯТЬ до сходимости:

    • Для n=1,2,...Nn=1,2,...N обновить метки кластеров:

      zn=argmink{1,,K}xnμk22z_n = \arg\min_{k \in \{1,\dots,K\}} \|\boldsymbol{x}_n - \boldsymbol{\mu}_k\|^2_2
    • Для k=1,2,...Kk=1,2,...K обновить центроиды кластеров:

      μk=1CknCkxn\boldsymbol{\mu}_k = \frac{1}{|C_k|} \sum_{n \in C_k} \boldsymbol{x}_n
  3. ВЕРНУТЬ z1,,zNz_1, \dots, z_N.

K-means популярен за счёт быстрой скорости работы - центры не нужно оптимизировать, поскольку для их оптимального расположения есть аналитическая формула в виде усреднения объектов каждого кластера.

Инициализация центров

Метод K-средних, как частный случай метода K-представителей, чувствителен к начальной инициализации центров кластеров. К нему применимы те же приёмы повышения эффективности инициализации, что и для общего метода K-представителей.

Пример работы

Ниже приведен процесс работы алгоритма шаг за шагом:

kmeans1png kmeans2png kmeans3png kmeans4png

Кластеризация рукописных цифр (MNIST): Если кластеризовать данные датасета Digits (рукописные цифры [1]), уменьшенные до двух измерений с помощью метода главных компонент, то разбиение на кластера будет таким [2]: kmeansdigitspng

Ограничения метода

Метод всегда возвращает KK кластеров, где KK - заданный пользователем гиперпараметр, даже если кластерная структура в данных реально отсутствует, как на примере ниже:

kmeansnoclusterspng

Также метод вернёт в точности KK кластеров, даже если реальное число кластеров больше или меньше этого значения.

Выбор Евклидова расстояния накладывает строгие ограничения на форму получаемых кластеров. Объект x\boldsymbol{x} сильнее принадлежит ii-му, а не jj-му кластеру, если выполняется условие:

xμi<xμj\|\boldsymbol{x} - \boldsymbol{\mu}_i\| < \|\boldsymbol{x} - \boldsymbol{\mu}_j\|

Это уравнение задает линейную полуплоскость. Множество объектов ii-го кластера будет получаться пересечением всех таких полуплоскостей

{x:xμi<xμj,  ji}\{\boldsymbol{x}: \|\boldsymbol{x} - \boldsymbol{\mu}_i\| < \|\boldsymbol{x} - \boldsymbol{\mu}_j\|,\; \forall j\ne i\}

и представлять собой выпуклый многогранник. Таким образом, алгоритм конструктивно не сможет выделять невыпуклые кластеры, как на примере ниже:

kmeans2moonspng

Также алгоритм стремится минимизировать дисперсию во всех направлениях одинаково. Это означает неявное предположение, что кластеры имеют сферическую форму, поэтому он будет плохо справляться с выделением кластеров вытянутой формы. Чтобы уменьшить эффект этой особенности, признаки важно приводить к одной шкале перед запуском метода.

Из равномерности учёта всех расстояний следует другое предположение, что кластера имеют примерно одинаковый размер.

Алгоритмическая сложность

Вычислительная сложность алгоритма Ллойда оценивается как O(INKD)O(I \cdot N \cdot K \cdot D), где:

  • NN — количество объектов в выборке;
  • KK — количество кластеров;
  • DD — размерность пространства признаков;
  • II — количество итераций до сходимости.

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

  1. Назначение меток. На этом этапе для каждого из NN объектов необходимо найти ближайший центроид.

    • Чтобы вычислить квадрат Евклидова расстояния xnμk2\|\boldsymbol{x}_n - \boldsymbol{\mu}_k\|^2 между одним объектом и одним центроидом, требуется O(D)O(D) операций.
    • Это вычисление проводится для каждого из KK центроидов.
    • Следовательно, для одного объекта сложность поиска ближайшего центра составляет O(KD)O(K \cdot D).
    • Для всех NN объектов суммарная сложность шага: O(NKD)O(N \cdot K \cdot D).
  2. Обновление центроидов. На этом этапе пересчитываются координаты центров.

    • Для вычисления нового центра μk\boldsymbol{\mu}_k необходимо усреднить векторы всех объектов, попавших в кластер CkC_k.
    • Сложение двух векторов размерности DD требует O(D)O(D) операций.
    • Поскольку каждый из NN объектов принадлежит ровно одному кластеру, он участвует в суммировании ровно один раз.
    • Следовательно, суммарная сложность пересчета всех центров составляет O(ND)O(N \cdot D).

В итоге получаем сложность одной итерации цикла O(NKD)O(N \cdot K \cdot D). Поскольку итерации повторяются II раз, то итоговая сложность KK-средних равна O(INKD)O(I \cdot N \cdot K \cdot D).

Сложность растёт линейно с увеличением числа объектов NN, делает алгоритм пригодным для обработки больших массивов данных, в отличие от многих других методов кластеризации.

Алгоритмические оптимизации

Стандартный алгоритм Ллойда на каждой итерации вычисляет расстояния от каждого объекта до всех KK центров. Существуют алгоритм Элкана [3], ускоряющий этот процесс, который основан на использовании неравенства треугольника для расстояний:

xμjμiμjxμi\|\boldsymbol{x} - \boldsymbol{\mu}_j\| \ge \|\boldsymbol{\mu}_i - \boldsymbol{\mu}_j\| - \|\boldsymbol{x} - \boldsymbol{\mu}_i\|

Это позволяет отбрасывать далекие центры без явного вычисления расстояний до них, если известно, что объект уже достаточно близок к своему текущему центру.

Ускорение достигается ценой повышенных расходов на память порядка O(NK)O(N\cdot K) для хранения промежуточных переменных.

Mini-batch K-means

Несмотря на то, что метод K-средних обладает линейной сложностью, для очень больших данных (таких, как веб-страницы интернета) используется его приближённая стохастическая версия, которая работает приближённо, но сходится гораздо быстрее. Это алгоритм K-средних на минибатчах (Mini-batch K-means [4]), представляющий собой аналог стохастического градиентного спуска.

Обозначим N(k)N(k) — текущее число элементов кластера kk.

Алгоритм работает следующим образом:

  1. Инициализировать μk\boldsymbol{\mu}_k (случайно).

  2. Повторять до сходимости:

    • Сэмплировать минибатч случайных объектов xb,b=1,2,...B\mathbf{x}'_b, \quad b=1,2,...B.

    • Для b=1,2,...Bb=1,2,...B:

      • определить кластер zbz_b для xb\mathbf{x}'_b (по принципу ближайшего центроида).

      • Обновить размер кластера: N(zb):=N(zb)+1N(z_b) := N(z_b)+1.

      • Обновить центроид кластера:

        μz(b):=(11N(zb))μz(b)+1N(zb)xb\boldsymbol{\mu}_{z(b)}:=\left(1-\frac{1}{N(z_b)}\right)\boldsymbol{\mu}_{z(b)}+\frac{1}{N(z_b)}\mathbf{x}'_b

Выходом алгоритма являются центроиды μ1,...μK\boldsymbol{\mu}_1,...\boldsymbol{\mu}_K по близости к которым можно кластеризовать любые данные.

K-средних на минибатчах не требует прохода по всем объектам выборки и приближённо сходится к ожидаемым центрам кластеров при просмотре лишь части обучающих объектов. При этом разница результатов K-means и Mini-batch K-means оказывается небольшой, как проиллюстрировано ниже [5]:

Kmeans-vs-mini-batch-Kmeans.png

Ядерное обобщение K-средних

Идея

Как мы показали выше, метод K-средних выделяет лишь линейные границы между кластерами, а границы кластеров могут иметь только выпуклую форму. Однако метод K-средних допускает ядерное обобщение (Kernel K-means), которое способно сделать границы между классами нелинейными, а выделяемые области каждого класса - невыпуклыми, как показано на примере ниже:

Ядерное обобщение соответствует обычному методу K-средних, но не в исходном пространстве x\boldsymbol{x}, а в новом пространстве ϕ(x)\phi(\boldsymbol{x}), которое называемом спрямляющим.

При этом центроиды кластеров формально вычисляются по формуле

μi=1CinCiϕ(xn),\boldsymbol{\mu}_i = \frac{1}{|C_i|}\sum_{n \in C_i} \phi(\boldsymbol{x}_n),

но напрямую не вычисляются, поскольку спрямляющее пространство может быть сложной структуры и даже бесконечномерным.

Ядерное обобщение расстояния до центроидов

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

ρ(x,μi)2=ϕ(x)μi2\rho(\boldsymbol{x}, \boldsymbol{\mu}_i)^2 = \|\phi(\boldsymbol{x}) - \boldsymbol{\mu}_i\|^2

Воспользуемся тем, что квадрат L2-нормы можно вычислить через скалярное произведение, а также свойствами скалярного произведения:

ϕ(x)μi2=ϕ(x)μi,ϕ(x)μi=ϕ(x),ϕ(x)2ϕ(x),μi+μi,μi\|\phi(\boldsymbol{x}) - \boldsymbol{\mu}_i\|^2 = \langle\phi(\boldsymbol{x}) - \boldsymbol{\mu}_i, \phi(\boldsymbol{x}) - \boldsymbol{\mu}_i \rangle = \langle \phi(\boldsymbol{x}), \phi(\boldsymbol{x}) \rangle - 2\langle \phi(\boldsymbol{x}), \boldsymbol{\mu}_i \rangle + \langle \boldsymbol{\mu}_i, \boldsymbol{\mu}_i \rangle

Теперь выразим каждое слагаемое через функцию ядра:

K(x,x)=ϕ(x),ϕ(x)K(\boldsymbol{x},\boldsymbol{x}') = \langle\phi(\boldsymbol{x}), \phi(\boldsymbol{x}') \rangle
  1. Первое слагаемое:

    ϕ(x),ϕ(x)=K(x,x)\langle \phi(\boldsymbol{x}), \phi(\boldsymbol{x}) \rangle = K(\boldsymbol{x}, \boldsymbol{x})
  2. Второе слагаемое:

    2ϕ(x),1CinCiϕ(xn)=2CinCiK(x,xn)2\langle \phi(\boldsymbol{x}), \frac{1}{|C_i|}\sum_{n \in C_i} \phi(\boldsymbol{x}_n) \rangle = \frac{2}{|C_i|} \sum_{n \in C_i} K(\boldsymbol{x}, \boldsymbol{x}_n)
  3. Третье слагаемое:

    1CinCiϕ(xn),1CimCiϕ(xm)=1Ci2nCimCiK(xn,xm)\langle \frac{1}{|C_i|}\sum_{n \in C_i} \phi(\boldsymbol{x}_n), \frac{1}{|C_i|}\sum_{m \in C_i} \phi(\boldsymbol{x}_m) \rangle = \frac{1}{|C_i|^2} \sum_{n \in C_i} \sum_{m \in C_i} K(\boldsymbol{x}_n, \boldsymbol{x}_m)

Итоговая формула:

ρ(x,μi)2=K(x,x)const по i2CinCiK(x,xn)средняя близость к объектам кластера+1Ci2nCimCiK(xn,xm)компактность кластера\rho(\boldsymbol{x}, \boldsymbol{\mu}_i)^2 = \underbrace{K(\boldsymbol{x}, \boldsymbol{x})}_{\text{const по } i} - \underbrace{\frac{2}{|C_i|} \sum_{n \in C_i} K(\boldsymbol{x}, \boldsymbol{x}_n)}_{\text{средняя близость к объектам кластера}} + \underbrace{\frac{1}{|C_i|^2} \sum_{n \in C_i} \sum_{m \in C_i} K(\boldsymbol{x}_n, \boldsymbol{x}_m)}_{\text{компактность кластера}}

Итоговый алгоритм

В отличие от стандартного K-means, здесь мы не можем явно хранить и пересчитывать координаты центров μi\boldsymbol{\mu}_i. Вместо этого состояние алгоритма определяется текущим распределением объектов по кластерам (метками znz_n), которые неявно задают центроиды в спрямляющем пространстве.

Вход:

  • X={x1,,xN}\mathbf{X} = \{\boldsymbol{x}_1, \dots, \boldsymbol{x}_N\} — набор данных.
  • KK — число кластеров.
  • k(,)k(\cdot, \cdot) — функция ядра (обычно это гауссово или полиномиальное ядро).

Алгоритм:

  1. Инициализация: Случайным образом назначить начальные метки кластеров zn{1,,K}z_n \in \{1, \dots, K\} для всех объектов n=1,,Nn=1, \dots, N. Это определяет начальные множества C1,,CKC_1, \dots, C_K.

  2. Повторять до сходимости:

    1. Для каждого кластера i=1,,Ki=1, \dots, K вычислить слагаемое, отвечающее за его компактность (не зависит от текущего объекта x\boldsymbol{x}):

      Li=1Ci2nCimCiK(xn,xm)L_i = \frac{1}{|C_i|^2} \sum_{n \in C_i} \sum_{m \in C_i} K(\boldsymbol{x}_n, \boldsymbol{x}_m)
    2. Для каждого объекта n=1,,Nn=1, \dots, N:

      • Вычислить расстояние от xn\boldsymbol{x}_n до центра каждого кластера ii:
      d2(xn,i)=Li2CimCiK(xn,xm)d^2(\boldsymbol{x}_n, i) = L_i - \frac{2}{|C_i|} \sum_{m \in C_i} K(\boldsymbol{x}_n, \boldsymbol{x}_m)

      (Слагаемое K(xn,xn)K(\boldsymbol{x}_n, \boldsymbol{x}_n) опущено, так как оно одинаково для всех ii и не влияет на выбор минимума).

      • Назначить новый кластер:
      zn=argminid2(xn,i)z_n = \arg\min_{i} d^2(\boldsymbol{x}_n, i)
  3. Вернуть z1,,zNz_1, \dots, z_N.

Недостатки метода

Недостатком ядерного обобщения K-means является высокая вычислительная сложность. Чтобы вычислить расстояние от одного объекта до центра кластера ii, нужно просуммировать значения ядра со всеми объектами этого кластера. Суммарная сложность одной итерации составляет O(N2)O(N^2). Квадратичная сложность по числу объектов делает метод неприменимым для очень больших выборок.

Также метод, производя переход в спрямляющее пространство, теряет изначальную интуитивность и интерпретируемость. Для его работы необходимо выбрать функцию ядра и её гиперпараметры.

Литература

  1. Репозиторий UCI: Optical Recognition of Handwritten Digits.
  2. Документация sklearn: A demo of K-Means clustering on the handwritten digits data.
  3. Elkan C. Using the triangle inequality to accelerate k-means //Proceedings of the 20th international conference on Machine Learning (ICML-03). – 2003. – С. 147-153.
  4. Sculley D. Web-scale k-means clustering //Proceedings of the 19th international conference on World wide web. – 2010. – С. 1177-1178.
  5. Документация sklearn: Mini Batch K-Means.