Участник:IanaV/Алгоритм k means: различия между версиями
IanaV (обсуждение | вклад) |
IanaV (обсуждение | вклад) |
||
Строка 10: | Строка 10: | ||
=== Математическое описание алгоритма === | === Математическое описание алгоритма === | ||
− | '' | + | ''Исходные данные:'' |
* множество наблюдений <math>X = \{x_1, x_2, ..., x_n\}</math>, где каждое наблюдение <math>x_i \in R^d, i = 1, ..., n</math>; | * множество наблюдений <math>X = \{x_1, x_2, ..., x_n\}</math>, где каждое наблюдение <math>x_i \in R^d, i = 1, ..., n</math>; | ||
* количество кластеров <math>k \in N, k \leq n</math> | * количество кластеров <math>k \in N, k \leq n</math> | ||
+ | ''Обозначения:'' | ||
+ | * <math>S = \{S_1, S_2, ..., S_k \} </math> - множество кластеров, которые удовлетворяют следующим условиям: | ||
+ | ** <math>S_i \bigcap S_j = \emptyset, i \neq j</math>; | ||
+ | ** <math>X = {\bigcup \limits _{i = 1}^k S_i} </math>. | ||
− | ''Цель алгоритма k-means'' - распределить наблюдения из входного множества <math>X</math> по <math>k</math> кластерам <math>S = \{S_1, S_2, ..., S_k \} </math> | + | * <math>\mu_i, i = 1, ..., k</math> - центр масс кластера <math>S_i</math> |
− | + | ||
− | + | ''Выходные данные:'' | |
− | таким образом, чтобы сумма квадратов расстояний от каждой точки кластера до его центра по всем кластерам была минимальной: | + | * <math>l = (l_1, l_2, ..., l_n)</math>, где <math>l_i \in [1, k]</math> - является порядковым номером кластера: <math> x_i \in S_{l_i}</math> |
+ | |||
+ | ''Цель алгоритма k-means'' - распределить наблюдения из входного множества <math>X</math> по <math>k</math> кластерам <math>S = \{S_1, S_2, ..., S_k \} </math> таким образом, чтобы сумма квадратов расстояний от каждой точки кластера до его центра по всем кластерам была минимальной: | ||
<p align="center"><math>\arg\min_{S} \sum_{i=1}^{k} \sum_{x \in S_i} \left\| \mathbf x - \mu_i \right\|^2 </math>,</p> где <math>\mu_i</math>- центр масс векторов <math>x \in S_i</math>, <math>i = 1, ..., k</math> | <p align="center"><math>\arg\min_{S} \sum_{i=1}^{k} \sum_{x \in S_i} \left\| \mathbf x - \mu_i \right\|^2 </math>,</p> где <math>\mu_i</math>- центр масс векторов <math>x \in S_i</math>, <math>i = 1, ..., k</math> |
Версия 23:12, 12 октября 2016
Авторы страницы: Валуйская Я.А. и Глотов Е.С.
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Алгоритм k-means (k средних) - один из наиболее популярных алгоритмов кластеризации. Алгоритм был изобретён в 1950-х годах математиком Гуго Штейнгаузом, и почти одновременно его изобрел Стюарт Ллойд. Особую популярность алгоритм снискал после работы Маккуина.
Алгоритм кластеризации k-means решает задачу распределения N наблюдений по K кластерам так, чтобы наблюдение принадлежало одному кластеру, который имеет наименьшее удаление от наблюдения.
1.2 Математическое описание алгоритма
Исходные данные:
- множество наблюдений [math]X = \{x_1, x_2, ..., x_n\}[/math], где каждое наблюдение [math]x_i \in R^d, i = 1, ..., n[/math];
- количество кластеров [math]k \in N, k \leq n[/math]
Обозначения:
- [math]S = \{S_1, S_2, ..., S_k \} [/math] - множество кластеров, которые удовлетворяют следующим условиям:
- [math]S_i \bigcap S_j = \emptyset, i \neq j[/math];
- [math]X = {\bigcup \limits _{i = 1}^k S_i} [/math].
- [math]\mu_i, i = 1, ..., k[/math] - центр масс кластера [math]S_i[/math]
Выходные данные:
- [math]l = (l_1, l_2, ..., l_n)[/math], где [math]l_i \in [1, k][/math] - является порядковым номером кластера: [math] x_i \in S_{l_i}[/math]
Цель алгоритма k-means - распределить наблюдения из входного множества [math]X[/math] по [math]k[/math] кластерам [math]S = \{S_1, S_2, ..., S_k \} [/math] таким образом, чтобы сумма квадратов расстояний от каждой точки кластера до его центра по всем кластерам была минимальной:
[math]\arg\min_{S} \sum_{i=1}^{k} \sum_{x \in S_i} \left\| \mathbf x - \mu_i \right\|^2 [/math],
где [math]\mu_i[/math]- центр масс векторов [math]x \in S_i[/math], [math]i = 1, ..., k[/math]
Алгоритм состоит из следующих шагов:
1. Инициализация центров масс
На данном шаге задаются начальные значения центров масс [math] \mu_1^0, ..., \mu_k^0[/math]. Существует несколько способов их выбора. Они будут рассмотрены ниже.
2. Распределение векторов по кластерам
На данном шаге каждый вектор [math]x \in X[/math] распределяется в свой кластер [math]S_i^t[/math] так, что:
[math]S_i^t = \arg \min_{S_j^t} \left\| \mathbf x - \mu_j^t \right\|^2 , j = 1, ..., k[/math]
3. Пересчет центров масс кластеров
На данном шаге происходит пересчет центров масс кластеров, полученных на предыдущем этапе:
[math]\mu_i^{t+1} = \frac{1}{|S_i^t|} \sum_{x \in S_i^t} x[/math]
Алгоритм останавливается, когда центры масс кластеров остаются без изменения после пересчета.
1.3 Вычислительное ядро алгоритма
Вычислительном ядром алгоритма являются шаги 2 и 3, так как они повторяются на каждой итерации:
- распределение векторов по кластерам;
- пересчет центров масс кластеров.
Распределение векторов по кластерам заключается в следующем: для каждого вектора [math]x_i \in X, i = 1, ..., n[/math] необходимо посчитать расстояние между этим вектором и центром масс кластера [math]\mu_j^t, j = 1, ..., k[/math]. Следовательно, необходимо выполнить [math]n * k[/math] операций вычисления расстояния между векторами. В качестве расстояния между векторами [math]v \in R^m[/math] и [math]u \in R^m[/math] используется Евклидова метрика [math]d(v, u) = \sqrt{\sum_{j=1}^{m} (v_j - u_j)^2} [/math].
Пересчет центров масс кластеров заключается в следующем: для каждого кластера [math]S_i^t \in S, i = 1, ..., k[/math] необходимо пересчитать кластер по формуле, приведенной в пункте выше.
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