Участник:Илья Егоров/Алгоритм k-средних
Алгоритм k-средних (k-means) | |
Последовательный алгоритм | |
Последовательная сложность | O() |
Объём входных данных | \frac{()}{} |
Объём выходных данных | \frac{ ()}{} |
Страница создана группой "Илья Егоров — Евгений Богомазов"
Содержание
- 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-средних впервые был предложен в 1950-х годах математиками Гуго Штейнгаузом и Стюартом Ллойдом независимо друг от друга. Наибольшую популярность он получил после работы Маккуина.
Алгоритм позволяет при заданном числе k построить k кластеров, расположенных на максимальном расстоянии друг от друга. Таким образом, наибольшей точности результат выполнения алгоритма достигает при полной осведомленности Пользователя о характере кластеризуемых объектов и, как следствие, при обладании максимально корректной информацией о числе кластеров.
В общем случае выбор числа k может базироваться на любых значимых факторах, в том числе на результатах предшествующих исследований, теоретических соображениях или интуиции.
1.2 Математическое описание алгоритма
Исходные данные:
- Совокупность n d-мерных векторов X = \{x_1 \dots x_n\} , где x_i = \{x_{i1} \dots x_{id}\}
- Предполагаемое количество кластеров k
Выходные данные:
- Разбиение X на множество S = \{S_1 \dots S_k \}, \bigcup S_i = X, S_i \cap S_j = \emptyset, i \neq j
- k центров кластеров \Mu = \{\mu_1 \dots \mu_k \} , где \mu_i = \{\mu_{i1} \dots \mu_{id} \} такие, что
\begin{cases}\mu_i = argmin_y \sum_{x \in S_i} ||x-y||^2_E \\ \mu_i = argmin_\Mu \sum_{i \in k} \sum_{x \in S_i} ||x-\mu_i||^2_E \end{cases}
Алгоритм:
1) \mu_{ij} = random
2) S_i = \{x| argmin_j ||x-\mu_j|| = i\} i = 1 \dots k
3) \tilde{\mu_{i}} = E_{x \in S_i}(x)
4) Если для \forall i: \mu_i = \tilde{\mu_i} то алгоритм завершен, иначе \mu_i = \tilde{\mu_i} и перейти на пункт 2)
1.3 Вычислительное ядро алгоритма
Вычислительным ядром алгоритма является второй этап, а точнее нахождение матрицы расстояний между X и \Mu. Для d-мерного вектора a:
||a||=\sqrt{\sum_{i=1\dots d} a_i^2}, поэтому заполнение одной ячейки такой матрицы потребует d операций умножения, d-1 операций сложения и одну операция вычисления квадратного корня. Но так как эти расстояния используются только для сравнения, а sqrt является монотонно возрастающей функцией, то ее можно не вычислять. Поэтому нахождения матрицы расстояний потребует всего n*k*d операций умножений и n*k*(d-1) операций сложений.
1.4 Макроструктура алгоритма
Алгоритм k-средних базируется на алгоритме вычисления расстояния между векторами, расстояние на каждом шаге высчитывается k\cdot n раз.
Помимо этого, в конце каждого шага вычисляется центр масс объектов кластера, для всех объектов потребуется n-1 суммирование и k делений.
1.5 Схема реализации последовательного алгоритма
Последовательность шагов алгоритма следующая:
1. Инициализация центроидов [math]\Mu[/math], [math] iter = 1 [/math], задание максимального количество итераций [math]maxiter[/math] 2a. Нахождение матрицы расстояний [math]dist:[/math] [math]dist_{ij} = \sum_{l = 1\dots d} (x_{il}-\mu_{il})^2[/math] 2b. Нахождение вектора распределения объектов по кластерам [math]index: [/math] [math]index_{i} = \underset{j}{argmin }~dist_{ij} [/math] 3. Пересчет центроидов [math]\tilde{\Mu}:[/math] [math]\tilde{\mu_{ij}} = \sum_{l \in T_i} \dfrac{x_{lj}}{|T_i|} [/math], где [math]T_i = \{l~|~l \in 1\dots n, index_l = i\} [/math] 4. Проверка критерия останова: Если [math] \exists i: \tilde{\mu_i} \neq \mu_i[/math], [math] iter \lt maxiter [/math], то [math] inc(iter), \Mu=\tilde{\Mu},[/math] GOTO 2.а.
1.6 Последовательная сложность алгоритма
1) Сложность инициализации в общем случае зависит от применяемого метода генерации/получения случайных чисел, но ей можно пренебречь 2a) Вычисление матрицы расстояний требует [math] n*k*d [/math] операций умножений и [math] n*k*(d-1) [/math] операций сложений 2b) Нахождение вектора распределения требует [math] n*(k-1) [/math] операций сравнений 3) Для вычисления [math] \tilde{\Mu} [/math] требуется [math] (n - k + 1) * d [/math] операций сложений и [math] k * d [/math] операций деления 4) Для критерия останова требуется [math] n*d [/math] сравнений
Итого: так как максимальное количество итераций задается в алгоритме заранее и не зависит от входных данных, то количество итераций ограничено константой. Тогда сложность алгоритма:
- O(n*k*d) операций сложений/вычитаний
- O(n*k*d) операций умножений, O(k*d) операций делений
1.7 Информационный граф
1.8 Ресурс параллелизма алгоритма
1.9 Входные и выходные данные алгоритма
Входные данные: Количество кластеров k, n кластеризуемых элементов
Дополнительные ограничения:
- k — положительное число, т. е. k > 0.
- Для кластеризуемых элементов определена метрика (расстояние между объектами)
Объём входных данных: n \cdot d + 1 (кластеризуемые объекты в виде векторов и число k)
Выходные данные: Массив, в который записаны принадлежности каждого элемента кластеру (допустим вывод в другой эквивалентной более удобной структуре).
Объём выходных данных: Размер массива равен 2 \cdot n.
1.10 Свойства алгоритма
Вычислительная мощность алгоритма на каждом шаге равна k\cdot n (расстояние между элементом и центроидом k\cdot n раз)
Ограничения алгоритма
Алгоритм эффективно работает только на небольших объемах данных.
Преимущества алгоритма
- Простота использования
- Быстрота использования
- Понятность и прозрачность описания и
Недостатки алгоритма
- Нет проверки корректности выбора числа кластеров
- Алгоритм чувствителен к выбору начальных элементов в качестве центроидов и на одном наборе данных в теории может демонстрировать разные результаты
- Медленная работа на больших объемах данных
2 ЧАСТЬ. Программная реализация алгоритма
2.1 Масштабируемость алгоритма и его реализации
2.2 Существующие реализации алгоритма
2.2.1 Бесплатный доступ
Десктопные программы
Фреймворки для языков
- Python:
- C++:
- C#:
- Java:
- Lua
Языки R и Julia содержат алгоритм k-means в базовой реализации.
2.2.2 Платный доступ/лицензия
Существует целый перечень мощных статистических и математических пакетов для разных ОС:
3 Литература
[1] Нейский И.М. Классификация и сравнение методов кластеризации http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf