Участник:IanaV/Алгоритм k means

Материал из Алговики
Перейти к навигации Перейти к поиску

Авторы страницы: Валуйская Я.А. и Глотов Е.С.

1 Свойства и структура алгоритма

1.1 Общее описание алгоритма

Алгоритм k-means (k средних) - один из наиболее популярных алгоритмов кластеризации. Алгоритм был изобретён в 1950-х годах математиком Гуго Штейнгаузом, и почти одновременно его изобрел Стюарт Ллойд. Особую популярность алгоритм снискал после работы Маккуина.

Алгоритм кластеризации k-means решает задачу распределения N наблюдений по K кластерам так, чтобы наблюдение принадлежало одному кластеру, который имеет наименьшее удаление от наблюдения.

1.2 Математическое описание алгоритма

Исходные данные:

  • множество наблюдений X = \{x_1, x_2, ..., x_n\}, где каждое наблюдение x_i \in R^d, i = 1, ..., n;
  • количество кластеров k \in N, k \leq n

Обозначения:

  • S = \{S_1, S_2, ..., S_k \} - множество кластеров, которые удовлетворяют следующим условиям:
    • S_i \bigcap S_j = \emptyset, i \neq j;
    • X = {\bigcup \limits _{i = 1}^k S_i} .
  • \mu_i, i = 1, ..., k - центр масс кластера S_i

Выходные данные:

  • l = (l_1, l_2, ..., l_n), где l_i \in [1, k] - является порядковым номером кластера, к которому принадлежит вектор x_i: x_i \in S_{l_i}


Цель алгоритма k-means - распределить наблюдения из входного множества X по k кластерам S = \{S_1, S_2, ..., S_k \} таким образом, чтобы сумма квадратов расстояний от каждой точки кластера до его центра по всем кластерам была минимальной:

\arg\min_{S} \sum_{i=1}^{k} \sum_{x \in S_i} \left\| \mathbf x - \mu_i \right\|^2 ,


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

  1. Инициализация центров масс
    На данном шаге задаются начальные значения центров масс \mu_1^1, ..., \mu_k^1. Существует несколько способов их выбора. Они будут рассмотрены ниже.
  2. t-ый шаг итерации:
    • Распределение векторов по кластерам
      На данном шаге каждый вектор x \in X распределяется в свой кластер S_i^t так, что:
      l_i^t = \arg \min_{j} \left\| \mathbf x - \mu_j^t \right\|^2 , j = 1, ..., k
    • Пересчет центров масс кластеров
      На данном шаге происходит пересчет центров масс кластеров, полученных на предыдущем этапе:
      \mu_i^{t+1} = \frac{1}{|S_i^t|} \sum_{x \in S_i^t} x
  3. Критерий останова
    \mu_i^t = \mu_i^{t+1}, для всех i = 1, ..., k

1.3 Вычислительное ядро алгоритма

Вычислительном ядром алгоритма является шаг 2, состоящий из следующих этапов:

  1. распределение векторов по кластерам;
  2. пересчет центров масс кластеров.

Распределение векторов по кластерам заключается в следующем: для каждого вектора x_i \in X, i = 1, ..., n необходимо посчитать расстояние между этим вектором и центром масс кластера \mu_j^t, j = 1, ..., k. Следовательно, необходимо выполнить n * k операций вычисления расстояния между векторами. В качестве расстояния между векторами v \in R^m и u \in R^m используется Евклидова метрика d(v, u) = \sqrt{\sum_{j=1}^{m} (v_j - u_j)^2} .

Пересчет центров масс кластеров заключается в следующем: для каждого кластера S_i^t \in S, i = 1, ..., k необходимо пересчитать кластер по формуле, приведенной в пункте выше.

1.4 Макроструктура алгоритма

1.5 Схема реализации последовательного алгоритма

1.6 Последовательная сложность алгоритма

1.7 Информационный граф

1.8 Ресурс параллелизма алгоритма

1.9 Входные и выходные данные алгоритма

1.10 Свойства алгоритма

2 Программная реализация алгоритма

2.1 Масштабируемость алгоритма и его реализации

2.2 Существующие реализации алгоритма

Существуют следующие Open Source реализации алгоритма:

  • ELKI - содержит реализацию алгоритма k-means на языке Java (в том числе реализацию улучшенного алгоритма k-means++)
  • Weka - содержит реализацию k-means на языке Java
  • Apache Mahout - содержит реализацию k-means в парадигме MapReduce
  • Spark Mllib - содержит распределенную реализацию k-means
  • Accord.NET - содержит реализацию k-means на C# (в том числе реализацию улучшенного алгоритма k-means++)
  • MLPACK - содержит реализацию k-means на языке C++
  • OpenCV - содержит реализацию k-means на C++. А также есть обертки для языков Python и Java
  • SciPy - содержит реализацию k-means на языке Python
  • Scikit-learn - содержит реализацию k-means на языке Python
  • Julia - содержит реализацию алгоритма k-means на языке Julia
  • Octave - содержит реализацию k-means на языке Octave
  • R - содержит реализацию k-means на языке R
  • Torch - содержит реализацию k-means на языке Lua

3 Литература