<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ivan.Z</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ivan.Z"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Ivan.Z"/>
	<updated>2026-10-22T21:21:34Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=12052</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=12052"/>
		<updated>2016-10-15T20:58:04Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом (Leonard Kaufman) и Питером Руссивом (Peter J. Rousseeuw) и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера расстояния между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что расстояние только между объектами из одного кластера будет вычислено в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. С матрицей расстояний.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет две фазы: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу расстояний, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие среднее расстояние, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
1. Начальное приближение: &amp;lt;math&amp;gt;M_0 = M_{BUILD}, L_0 = L_{BUILD}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Множественные вычисления значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Изменение множеств в соответствии с выбранной парой &amp;lt;math&amp;gt;(x_{m_t}, x_{l_q})&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M_i = M_{i-1} \backslash \{x_{m_t}\} \cup \{x_{l_q}\} , L_i = L_{i-1} \cup \{x_{m_t}\} \backslash \{x_{l_q}\} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Проверка критерия останова.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M}  d(x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=12028</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=12028"/>
		<updated>2016-10-15T20:55:55Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом (Leonard Kaufman) и Питером Руссивом (Peter J. Rousseeuw) и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера расстояния между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что расстояние только между объектами из одного кластера будет вычислено в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. С матрицей расстояний.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет две фазы: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу расстояний, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие среднее расстояние, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
1. Начальное приближение: &amp;lt;math&amp;gt;M_0 = M_{BUILD}, L_0 = L_{BUILD}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Множественные вычисления значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Изменение множеств в соответствии с выбранной парой &amp;lt;math&amp;gt;(x_{m_t}, x_{l_q})&amp;lt;math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M_i = M_{i-1} \backslash \{x_{m_t}\} \cup \{x_{l_q}\} , L_i = L_{i-1} \cup \{x_{m_t}\} \backslash \{x_{l_q}\} &amp;lt;math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Проверка критерия останова.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11971</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11971"/>
		<updated>2016-10-15T20:50:06Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом (Leonard Kaufman) и Питером Руссивом (Peter J. Rousseeuw) и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера расстояния между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что расстояние только между объектами из одного кластера будет вычислено в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. С матрицей расстояний.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет две фазы: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу расстояний, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие среднее расстояние, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11941</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11941"/>
		<updated>2016-10-15T20:47:01Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера расстояния между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что расстояние только между объектами из одного кластера будет вычислено в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. С матрицей расстояний.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет две фазы: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу расстояний, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие среднее расстояние, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11871</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11871"/>
		<updated>2016-10-15T20:40:37Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера непохожести между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. Напрямую с матрицей непохожести.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11865</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11865"/>
		<updated>2016-10-15T20:39:27Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера непохожести между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. Напрямую с матрицей непохожести.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма PAM сосредоточено в стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; и состоит из вычислений значений целевой функции для различных вариантов замены текущей медоиды на новую:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F = arg \min_{i \in M , j \in L} \sum_{y \in L \backslash \{j\}} {min (d(i,y),d(j,y))} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11745</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11745"/>
		<updated>2016-10-15T20:19:15Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера непохожести между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. Напрямую с матрицей непохожести.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_1}, x_{m_2}, ... , x_{m_s} \} - &amp;lt;/math&amp;gt; множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;L = \{ x_{l_1}, x_{l_2}, ... , x_{m_t} \} - &amp;lt;/math&amp;gt; множество объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, не являющихся медоидами;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;F_{M,L} = \sum_{j = 1}^{N} \min_{ x_{m_q} \in M}  d(x_{m_q},x_{l_j}) - &amp;lt;/math&amp;gt; целевая функция.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(x_i,x_j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя выбор K медоид за K последовательных шагов:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M_0 = \varnothing, L_0 = X&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;x_{m_i} = \arg \min_{x_{l_q} \in L_0} \sum_{j = 1}^N  d(x_{l_q},x_j), L_1 = L_0 \backslash \{x_{m_i}\}, M_1 = M_1 \cup \{x_{m_i}\}, i=1 \dots N &amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Представляет из себя итерационный процесс.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{l_q} \in L \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{l_q}, x_{m_s}) \}, i=1 \dots K, K -&amp;lt;/math&amp;gt; множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11417</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11417"/>
		<updated>2016-10-15T19:27:23Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Кластеризация&#039;&#039;&#039; - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Partitioning Around Medoids&#039;&#039;&#039; (&#039;&#039;&#039;PAM&#039;&#039;&#039;) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;F(x)=minimize \sum_{i=1}^{N}\sum_{j=1}^{N} d(i,j)z_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; \sum_{i=1}^N {z_{ij} = 1} , j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;z_{ij} \le y_i , i, j = 1,2,...,N&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;\sum_{i=1}^N {y_i = K} , K - &amp;lt;/math&amp;gt; число кластеров;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;y_i , z_{ij} \in \{ 0,1 \} , i, j = 1,2,...,N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где функция &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; - целевая минимизируемая функция, &amp;lt;math&amp;gt;d(i,j)&amp;lt;/math&amp;gt; - мера непохожести между объектами &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt; - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру;&lt;br /&gt;
&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер;&lt;br /&gt;
&lt;br /&gt;
3. Есть в точности K кластеров;&lt;br /&gt;
&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных;&lt;br /&gt;
&lt;br /&gt;
2. Напрямую с матрицей непохожести.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Выбрать K объектов в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана;&lt;br /&gt;
&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид;&lt;br /&gt;
&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11307</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11307"/>
		<updated>2016-10-15T19:10:58Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11244</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11244"/>
		<updated>2016-10-15T18:58:00Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
[Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11232</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11232"/>
		<updated>2016-10-15T18:56:55Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
[Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11219</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11219"/>
		<updated>2016-10-15T18:55:08Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.]&lt;br /&gt;
[Park H. S., Jun C. H. A simple and fast algorithm for K-medoids clustering //Expert Systems with Applications. – 2009. – Т. 36. – №. 2. – С. 3336-3341.]&lt;br /&gt;
[Van der Laan M., Pollard K., Bryan J. A new partitioning around medoids algorithm //Journal of Statistical Computation and Simulation. – 2003. – Т. 73. – №. 8. – С. 575-584.]&lt;br /&gt;
[Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.]&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11105</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11105"/>
		<updated>2016-10-15T18:27:27Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/Python_(programming_language) Python]. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащем также различные варианты k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11081</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11081"/>
		<updated>2016-10-15T18:22:12Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Python. Алгоритм PAM реализован как k-medoids в пакете pyclust, содержащим и другие алгоритмы кластеризации, например, k-means&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11066</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11066"/>
		<updated>2016-10-15T18:17:49Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов с их координатами в пространстве &amp;lt;math&amp;gt;R^P&amp;lt;/math&amp;gt;, то операция вычисления расстояния между объектами &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(a,b) = \sqrt{(a_1-b_1)^2+(a_2-b_2)^2+\dots+(a_P-b_P)^2} = \sqrt{\sum_{i=1}^P (a_i-b_i)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11036</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=11036"/>
		<updated>2016-10-15T18:08:52Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. Множество &amp;lt;math&amp;gt;X = \{ x_{1}, x_{2}, \dots, x_{N} \}&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;, каждый из который задается &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; вещественными значениями;&lt;br /&gt;
&lt;br /&gt;
2. Симметрическая матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, элементы &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt; которой являются расстояниями между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
3. Число кластеров &amp;lt;math&amp;gt;K \le N&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
4. Метрика &amp;lt;math&amp;gt;d_{ij} = d(i,j)&amp;lt;/math&amp;gt;, задающая расстояние между объектами &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычислительные формулы метода&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Build&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Фаза &#039;&#039;&#039;Swap&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;M = \{ x_{m_{1}}, x_{m_{2}}, ..., x_{m_{K}} \}&amp;lt;/math&amp;gt; - множество медоид;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;K_{m_i} = \{ x_{o_h} \in O \| x_{m_i} = \arg \min_{x_{m_s} \in M} \rho (x_{o_h}, x_{m_s}) \}, 1 \leq i \leq k&amp;lt;/math&amp;gt;- множество искомых кластеров.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов и их значений, то операция вычисления расстояния между объектами i и j будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(i,j) = \sqrt{(i_1-j_1)^2+(i_2-j_2)^2+\dots+(i_w-j_w)^2} = \sqrt{\sum_{j=1}^w (p_j-q_j)^2}&amp;lt;/math&amp;gt; , где автвадр&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10815</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10815"/>
		<updated>2016-10-15T17:27:22Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Обозначения:&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычислительные формулы метода:&lt;br /&gt;
Фаза Build&lt;br /&gt;
&lt;br /&gt;
Фаза Swap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Если на вход алгоритма была подана не матрица расстояний, а матрица объектов и их значений, то операция вычисления расстояния между объектами i и j будет являться макрооперацией. В качестве меры расстояния может быть использована евклидова метрика:&lt;br /&gt;
&amp;lt;math&amp;gt; d(i,j) = \sqrt{(i_1-j_1)^2+(i_2-j_2)^2+\dots+(i_w-j_w)^2} = \sqrt{\sum_{j=1}^w (p_j-q_j)^2}&amp;lt;/math&amp;gt; , где автвадр&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10407</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10407"/>
		<updated>2016-10-15T16:02:02Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Обозначения:&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычислительные формулы метода:&lt;br /&gt;
Фаза Build&lt;br /&gt;
&lt;br /&gt;
Фаза Swap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10395</id>
		<title>Участник:Denemmy/Partitioning Around Medoids (Алгоритм)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Denemmy/Partitioning_Around_Medoids_(%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC)&amp;diff=10395"/>
		<updated>2016-10-15T16:00:06Z</updated>

		<summary type="html">&lt;p&gt;Ivan.Z: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Partitioning Around Medoids&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; N*(N-1)/2 + 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.&amp;lt;br&amp;gt;&lt;br /&gt;
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.&lt;br /&gt;
&lt;br /&gt;
====================&lt;br /&gt;
&lt;br /&gt;
Алгоритм Partitioning Around Medoids (PAM) был создан Леонардом Кауфманом и Питером Россеву и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей непохожести, чья цель - минимизировать общую непохожесть между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&lt;br /&gt;
{\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}} {\displaystyle F(x)={\text{minimize}}\sum _{i=1}^{n}\sum _{j=1}^{n}d(i,j)z_{ij}}&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
&lt;br /&gt;
Σ i=1 n zij = 1 , j = 1,2,...,n&lt;br /&gt;
zij ≤ yi , i, j = 1,2,...,n&lt;br /&gt;
Σ i=1 n yi = k , k = число кластеров&lt;br /&gt;
yi , zij € {0,1} , i, j = 1,2,...,n&lt;br /&gt;
&lt;br /&gt;
где функция F(x) - целевая минимизируемая функция, d(i,j) - мера непохожести между объектами i и j, z_ij - переменная, которая гарантирует, что непохожесть только между объектами из одного кластера будет вычислена в целевой функции. Остальные выражения являются следующими ограничениями:&lt;br /&gt;
1. Каждый объект принадлежит одному и только одному кластеру&lt;br /&gt;
2. Каждый объект относится к медоиде, представляющей его кластер&lt;br /&gt;
3. Есть в точности K кластеров&lt;br /&gt;
4. Решающая переменная принимает значения 0 или 1&lt;br /&gt;
&lt;br /&gt;
PAM может работать с двумя типами входных данных:&lt;br /&gt;
1. С матрицей объектов и значениями ее переменных&lt;br /&gt;
2. Напрямую с матрицей непохожести&lt;br /&gt;
В последнем случае пользователь может подать матрицу непохожести на вход алгоритму, вместо матрицы, представляющей объекты.&lt;br /&gt;
&lt;br /&gt;
В любом случае, алгоритм находит решение задачи. Алгоритм работает следующим образом: &lt;br /&gt;
Фаза Build:&lt;br /&gt;
1. Выбрать K объектов в качестве медоид&lt;br /&gt;
2. Построить матрицу непохожести, если она не была задана&lt;br /&gt;
3. Отнести каждый объект к ближайшей медоиде&lt;br /&gt;
&lt;br /&gt;
Фаза Swap:&lt;br /&gt;
4. Для каждого кластера найти объекты, снижающие коэффициент средней непохожести, и если такие объекты есть, выбрать те, которые снижают его сильней всего, в качестве медоид&lt;br /&gt;
5. Если хотя бы одна медоида поменялась, вернуться к шагу 3, иначе завершить алгоритм.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано, PAM работает с матрицей непохожести, для построения которой алгоритм использует две метрики. Первая - евклидова, явялющаяща корнем из суммы квадратов разностей, вторая - манхетонское расстояние, являющееся суммой модулей расстояний.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 1  функция PAM(D, k, tmax=100):&lt;br /&gt;
 2      &amp;lt;span style=&amp;quot;color:#408080&amp;quot;&amp;gt;# D - матрица расстояний, k - число кластеров, tmax - маскимальное число итераций&amp;lt;/span&amp;gt;&lt;br /&gt;
 3      выполнить фазу BUILD, получить множество метоидов M и множество не-метоидов L&lt;br /&gt;
 4      вычислить значение целевой функции F&lt;br /&gt;
 5      для t = 0..tmax-1:&lt;br /&gt;
 6          выполнить фазу SWAP, вычислить значение целевой функции F&#039;&lt;br /&gt;
 7          delta = F - F&#039;&lt;br /&gt;
 8          если delta &amp;gt; 0:&lt;br /&gt;
 9              обновить множества M и L&lt;br /&gt;
 10             F = F&#039;&lt;br /&gt;
 11         иначе:&lt;br /&gt;
 12             выйти из цикла&lt;br /&gt;
 13     вернуть М&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма===&lt;br /&gt;
Обозначим количество кластеров как &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, количество объектов как &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, число итераций алгоритма как &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;BUILD&#039;&#039;&#039; каждый шаг нахождения очередного метоида имеет сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&amp;lt;br&amp;gt;Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На стадии &#039;&#039;&#039;SWAP&#039;&#039;&#039; вычисление целевой функции имеет сложность &amp;lt;math&amp;gt;O(K*N^2)&amp;lt;/math&amp;gt; по количеству операций сложения вещественных чисел и по количеству операций сравнения двух вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
Таким образом алгоритм &amp;lt;b&amp;gt;PAN&amp;lt;/b&amp;gt; имеет сложность &amp;lt;math&amp;gt;O(T*K*N^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза BUILD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для шага t представлен на рисунке 1:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BUILD.png|thumb|center|800px|Рисунок 1. Информационный граф шага t фазы BUILD алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление функции ошибки, на вход подается расстояния от очередного объекта до всех остальных, а также минимальные расстояния от выбранных на данном шаге метоидов до всех остальных вершин&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_s&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;math&amp;gt;_d&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - нахождение минимальных расстояний от медоидов до остальных вершин, используется в операции SUM&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Количество шагов t равно &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt;, где &amp;lt;b&amp;gt;K&amp;lt;/b&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фаза SWAP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Общий вид информационного графа для итерации t представлен на рисунке 2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SWAP.png|thumb|center|800px|Рисунок 1. Информационный граф итерации t фазы SWAP алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Операции&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_M&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;Update&amp;lt;math&amp;gt;_L&amp;lt;/math&amp;gt;&amp;lt;/b&amp;gt; - операции обновления множества метоидов и не-метоидов соответственно&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;SUM&amp;lt;/b&amp;gt; - вычисление целевой функции&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;MIN&amp;lt;/b&amp;gt; - нахождение аргумента, соответствующего минимальному значению, а также само минимальное значение&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть число кластеров равно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а число объектов равно &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Тогда параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Таким образом параллельная сложность фазы &amp;lt;b&amp;gt;BUILD&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; имеет &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сложения и &amp;lt;math&amp;gt;O(K*N)&amp;lt;/math&amp;gt; операций сравнения двух вещественных чисел. Параллельная сложность фазы &amp;lt;b&amp;gt;SWAP&amp;lt;/b&amp;gt; равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Таким образом параллельная сложность алгоритма равна &amp;lt;math&amp;gt;O(K*N*T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;:&lt;br /&gt;
 * число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
 * число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество объектов;&lt;br /&gt;
 * вектор попарных расстояний, имеющий длину &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt;, из данных чисел однозначно восстанавливается симметрическая матрица расстояний &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;Объём входных данных&#039;&#039;: &amp;lt;math&amp;gt;N*(N-1)/2&amp;lt;/math&amp;gt; вещественное число и &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; целых числа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * K чисел &amp;lt;math&amp;gt;m_1, m_2, ..., m_K&amp;lt;/math&amp;gt; - индексы объектов соответствующие метоидам;&lt;br /&gt;
 * N-K чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_{N-K}&amp;lt;/math&amp;gt; - номера кластеров для каждого объекта (кроме тех, что являются метоидами);&lt;br /&gt;
&#039;&#039;Объём выходных данных&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]]&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Вычислительная мощность алгоритма &amp;lt;i&amp;gt;k means&amp;lt;/i&amp;gt; равна &amp;lt;math&amp;gt;\frac{K*N^2*\Tau}{N^2} = K*\Tau &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; &amp;amp;ndash; число кластеров, &amp;lt;math&amp;gt;\Tau&amp;lt;/math&amp;gt; &amp;amp;ndash; число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;[[глоссарий#Детерминированность |&#039;&#039;Детерминированность&#039;&#039;]] и [[глоссарий#Устойчивость |&#039;&#039;Устойчивость&#039;&#039;]] &amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Алгоритм &amp;lt;i&amp;gt;PAM&amp;lt;/i&amp;gt; является итерационным, количество итераций может быть ограничено сверху, однако в общем случае не фиксируется. Из-за недетермирированности выбора элементов, на которых достигается минимум целевой функции, алгоритм не является &amp;lt;b&amp;gt;детермирированным&amp;lt;/b&amp;gt;. Однако, данный алгоритм является &amp;lt;b&amp;gt;устойчивым&amp;lt;/b&amp;gt;, поскольку не накапливает ошибки в процессе своей работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сильные стороны алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;  &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Меньшая чувствительность к выбросам, чем k-means&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Несложность реализации&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность распараллеливания&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Однако равномерная загрузка процессоров не всегда возможна.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Недостатки алгоритма&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;Квадратичная сложность алгоритма&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Количество кластеров является параметром алгоритма&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Во многих задачах число кластеров может быть неизвестным.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;i&amp;gt;Возможность сходимости к локальному оптимуму&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Оптимальное решение не гарантировано.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/ELKI ELKI] реализует несколько вариантов алгоритма кластеризации, включая алгоритм PAM. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://java-ml.sourceforge.net/ Java-ML]. Включает реализацию k-metoid. Написан на Java&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php?title=Julia_language&amp;amp;action=edit&amp;amp;redlink=1 Julia] содержит реализацию k-metoid в пакете для кластеризации JuliaStats&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/R_(programming_language) R] включает различные варианты k-means в пакете flexclust. Алгоритм PAM реализован в пакете cluster&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;[http://research.omicsgroup.org/index.php/MATLAB MATLAB]. Реализованы PAM, CLARA и другие алгоритмы кластеризации&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan.Z</name></author>
	</entry>
</feed>