<?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=Denemmy</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=Denemmy"/>
	<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/Denemmy"/>
	<updated>2026-10-22T17:26:29Z</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=18048</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=18048"/>
		<updated>2016-11-18T07:26:11Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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{\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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;math&amp;gt; O(N^2) &amp;lt;/math&amp;gt; , число операций алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равно &amp;lt;math&amp;gt; O(K*N^2*\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; число итераций алгоритма, &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; - число точек. Тогда вычислительная мощность алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равна &amp;lt;math&amp;gt;O(K*\Tau)&amp;lt;/math&amp;gt;.&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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=18047</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=18047"/>
		<updated>2016-11-18T07:25:40Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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{\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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;math&amp;gt; O(N^2) &amp;lt;/math&amp;gt; , число операций алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равно &amp;lt;math&amp;gt; O(K*N^2*\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; число итераций алгоритма, &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; - число точек. Тогда вычислительная мощность алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равна &amp;lt;math&amp;gt;K*\Tau &amp;lt;/math&amp;gt;.&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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=18046</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=18046"/>
		<updated>2016-11-18T07:24:09Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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{\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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;math&amp;gt; O(N^2) &amp;lt;/math&amp;gt; , число операций алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равно &amp;lt;math&amp;gt; O(K*N^2*\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; число итераций алгоритма, &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; - число точек. Тогда вычислительная мощность алгоритма &#039;&#039;&#039;PAM&#039;&#039;&#039; равна &amp;lt;math&amp;gt;K*\Tau &amp;lt;/math&amp;gt;.&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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=18045</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=18045"/>
		<updated>2016-11-18T07:14:44Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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{\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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=18044</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=18044"/>
		<updated>2016-11-18T07:14:13Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=17613</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=17613"/>
		<updated>2016-11-16T11:38:46Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=17610</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=17610"/>
		<updated>2016-11-16T11:38:20Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;. [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=17609</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=17609"/>
		<updated>2016-11-16T11:38:09Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039; &amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt;  [http://parallel.ru/cluster/lomonosov.html Аппаратные характеристики суперкомпьютера]. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=17602</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=17602"/>
		<updated>2016-11-16T11:27:38Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039;. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
В экспериментах была использована сторонняя реализация алгоритма, с небольшими изменениями она выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=16894</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=16894"/>
		<updated>2016-11-14T10:31:26Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039;. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Таким образом, из полученных графиков можно сделать вывод о том, что эффективность задачи при фиксированном размере входной матрицы понижается с увеличением числа процессоров, это связано с увеличением передачи данных между процессорами. При фиксированном значениии числа процессоров эффективность увеличивается при увеличении размера входной матрицы, это в свою очередь связано с тем, что доля времени, потраченного на передачу данных между процессорами, от общего затраченного на вычисления времени уменьшается.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма, которая использовалась в экспериментах выложена в репозитории[https://denemmy@bitbucket.org/denemmy/pam.git]&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>Denemmy</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=16886</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=16886"/>
		<updated>2016-11-14T10:23:08Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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;
Исследование проводилось на суперкомпьютере &#039;&#039;&#039;&amp;quot;Ломоносов&amp;quot;&#039;&#039;&#039;. Алгоритм реализован с использованием технологии &#039;&#039;&#039;MPI&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Данные были сгенерированы в &#039;&#039;&#039;Matlab&#039;е&#039;&#039;&#039; случайным образом. Количество кластеров равно &#039;&#039;&#039;16&#039;&#039;&#039;, каждый кластер был промоделирован нормальным распределением с некоторыми случайными значениями среднего и среднеквадратического отклонения. Размерность данных равна &#039;&#039;&#039;2&#039;&#039;&#039;, а число точек на каждый кластер было достаточно большим для проведения экспериментов с различными значениями размерности матрицы расстояний. Пример сгенерированных данных показан на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:16_clusters.jpg|thumb|center|512px|Рисунок 3. Пример сгенерированных данных.]]&lt;br /&gt;
&lt;br /&gt;
Измерялось &#039;&#039;&#039;время выполнения&#039;&#039;&#039; стадий &#039;&#039;&#039;BUILD&#039;&#039;&#039; и &#039;&#039;&#039;SWAP&#039;&#039;&#039;, без учета времени, потраченного на построение матрицы расстояний, а также измерялось &#039;&#039;&#039;число итераций&#039;&#039;&#039; алгоритма.&lt;br /&gt;
Были проведены эксперименты для следующих значений размерности матрицы расстояний и числа процессоров:&lt;br /&gt;
&lt;br /&gt;
 Значения размерности: [2500, 2000, 1500, 1000, 500, 200, 150, 100, 50]&lt;br /&gt;
 Значения числа процессоров: [500, 400, 256, 128, 64, 32, 16, 8, 4, 1]&lt;br /&gt;
&lt;br /&gt;
Полученные графики производительности и эффективности представлены на рисунках 4 и 5 соответственно.&lt;br /&gt;
&lt;br /&gt;
[[Файл:GFLOPS.png|thumb|center|512px|Рисунок 4. Зависимость производительности реализации параллельного алгоритма от размера матрицы и числа процессоров]]&lt;br /&gt;
[[Файл:EFF.png|thumb|center|512px|Рисунок 5. Зависимость эффективности реализации параллельного алгоритма от размера матрицы и числа процессоров.]]&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>Denemmy</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=16353</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=16353"/>
		<updated>2016-11-11T07:53:29Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&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;
Авторы: [[Участник:Denemmy|Галеев Д.Ф]], [[Участник:zaputlyaev|Запутляев И.]]&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;&#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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16352</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=16352"/>
		<updated>2016-11-11T07:53:18Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
{{Assignment}}&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16064</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=16064"/>
		<updated>2016-11-07T13:53:39Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16063</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=16063"/>
		<updated>2016-11-07T13:53:25Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм K-means, в основном потому, что оба являются алгоритмами кластеризации, другими словами, оба разделяют множество объектов на группы (кластеры) и работа обоих основана на попытках минимизировать ошибку, но PAM работает с медоидами - объектами, являющимися частью исходного множества и представляющими группу, в которую они включены, а K-means работает с центроидами - искусственно созданными объектами, представляющими кластер.&lt;br /&gt;
&lt;br /&gt;
Алгоритм PAM разделяет множество из N объектов на K кластеров, где и множество объектов, и число K являются входными данными алгоритма. Алгоритм работает с матрицей расстояний, его цель - минимизировать расстояние между представителями каждого кластера и его членами. Алгоритм использует следующую модель для решения задачи:&amp;lt;ref&amp;gt;Fasulo D. An analysis of recent work on clustering algorithms. – Technical report, 1999. – №. 01-03. – С. 02.&amp;lt;/ref&amp;gt;&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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16062</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=16062"/>
		<updated>2016-11-07T13:52:08Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм 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; &amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16061</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=16061"/>
		<updated>2016-11-07T13:51:52Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм 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;&amp;lt;ref&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;/ref&amp;gt;&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16060</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=16060"/>
		<updated>2016-11-07T13:50:31Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм 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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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;, поскольку не накапливает ошибки в процессе своей работы. &amp;lt;ref&amp;gt;Нейский И. М. Классификация и сравнение методов кластеризации //ББК 32.813 И 76 Составитель: ЮН Филиппович. – 2006. – С. 130.&amp;lt;/ref&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>Denemmy</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=16059</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=16059"/>
		<updated>2016-11-07T13:47:30Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм 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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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>Denemmy</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=16058</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=16058"/>
		<updated>2016-11-07T13:46:46Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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)&amp;lt;ref&amp;gt;Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. In: Y. Dodge and North-Holland, editor. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.&amp;lt;/ref&amp;gt;. и он очень похож на алгоритм 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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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>Denemmy</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=16057</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=16057"/>
		<updated>2016-11-07T13:43:27Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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_2.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_2.png|thumb|center|800px|Рисунок 2. Информационный граф итерации 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>Denemmy</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=16056</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=16056"/>
		<updated>2016-11-07T13:43:12Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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_2.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>Denemmy</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=16055</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=16055"/>
		<updated>2016-11-07T13:32:49Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;
=== Общее описание алгоритма ===&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>Denemmy</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=12062</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=12062"/>
		<updated>2016-10-15T20:59:20Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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>Denemmy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=11561</id>
		<title>Обсуждение участника:Lineprinter</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=11561"/>
		<updated>2016-10-15T19:51:25Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Кластеризация сетями Кохонена]]&lt;br /&gt;
Выполняют: [[Участник:Kravtsovkirill| Кравцов Кирилл]] и [[Участник:Emaksimov| Максимов Егор]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение собственных чисел квадратной матрицы методом QR разложения (2)]]&lt;br /&gt;
Выполняют: Баев Олег и Шевелев Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Стабилизированный метод биспоряженных градиентов (BiCGSTAB)]]&lt;br /&gt;
Выполняют: Гаврилов Алексей и Новиков Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм k-means]]&lt;br /&gt;
Выполняют: [[Участник:Бротиковская Данута|Данута Бротиковская]] и [[Участник:DennZo1993|Денис Зобнин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning Around Medoids (Алгоритм)]]&lt;br /&gt;
Выполняют: [[Участник:Denemmy| Галеев Данил]] и [[Участник:Ivan.Z| Запутляев Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Участница:JuliaA|Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Участник:GlotovES| Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм С-средних (Fuzzy C-means)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм C средних]]&lt;br /&gt;
Выполняют: [[Участник:Gkhazeeva|Гелана Хазеева]], [[Участник:Yushin|Павел Юшин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный алгоритм кластеризации DBSCAN]]&lt;br /&gt;
Выполняют: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация Partitioning Around Medoids (PAM)]]&lt;br /&gt;
Выполняют:[[ Участник:Тодуа Антон| Тодуа Антон]], [[Участник:Гусева Юлия| Гусева Юлия]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Бугаков Юрий (613 группа), Кужамалиев Ернур (601 группа)/Построение матрицы Адамара произвольной размерности]]&lt;br /&gt;
Выполняют:[[ Участник:Бугаков Юрий| Бугаков Юрий]], [[Участник:Кужамалиев Ернур| Кужамалиев Ернур]]&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9659</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=9659"/>
		<updated>2016-10-15T13:20:37Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Ресурс параллелизма алгоритма */&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;
=== Макроструктура алгоритма ===&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>Denemmy</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=9610</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=9610"/>
		<updated>2016-10-15T13:09:22Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Информационный граф */&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;
=== Макроструктура алгоритма ===&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;
&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>Denemmy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SWAP.png&amp;diff=9599</id>
		<title>Файл:SWAP.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SWAP.png&amp;diff=9599"/>
		<updated>2016-10-15T13:06:30Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9494</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=9494"/>
		<updated>2016-10-15T12:36:04Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Информационный граф */&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;
=== Макроструктура алгоритма ===&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;
&amp;lt;p&amp;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;
=== Ресурс параллелизма алгоритма ===&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>Denemmy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:BUILD.png&amp;diff=9464</id>
		<title>Файл:BUILD.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:BUILD.png&amp;diff=9464"/>
		<updated>2016-10-15T12:31:13Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: Denemmy загрузил новую версию Файл:BUILD.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:BUILD.png&amp;diff=9420</id>
		<title>Файл:BUILD.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:BUILD.png&amp;diff=9420"/>
		<updated>2016-10-15T12:15:16Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9214</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=9214"/>
		<updated>2016-10-15T11:09:15Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Существующие реализации алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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>Denemmy</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=9209</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=9209"/>
		<updated>2016-10-15T11:07:25Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Существующие реализации алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9202</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=9202"/>
		<updated>2016-10-15T11:05:44Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Существующие реализации алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9195</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=9195"/>
		<updated>2016-10-15T11:03:24Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Существующие реализации алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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.&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>Denemmy</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=9047</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=9047"/>
		<updated>2016-10-15T10:33:28Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Свойства алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=9029</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=9029"/>
		<updated>2016-10-15T10:29:30Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Свойства алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8932</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=8932"/>
		<updated>2016-10-15T10:03:34Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
== Программная реализация алгоритма ==&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;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8929</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=8929"/>
		<updated>2016-10-15T10:02:58Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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 чисел &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;
== Программная реализация алгоритма ==&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;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8924</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=8924"/>
		<updated>2016-10-15T10:01:03Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
&#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 чисел &amp;lt;math&amp;gt;k_1, k_2, ..., k_N&amp;lt;/math&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;
==== Открытое программное обеспечение ====&lt;br /&gt;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8915</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=8915"/>
		<updated>2016-10-15T09:59:04Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
 * числа &amp;lt;math&amp;gt;m_1, m_2, ..., m_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;
&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;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8901</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=8901"/>
		<updated>2016-10-15T09:57:42Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;&#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;
=== Свойства алгоритма ===&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;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8900</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=8900"/>
		<updated>2016-10-15T09:57:18Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
=== Свойства алгоритма ===&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;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8845</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=8845"/>
		<updated>2016-10-15T09:33:50Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Входные и выходные данные алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
=== Свойства алгоритма ===&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;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8830</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=8830"/>
		<updated>2016-10-15T09:24:27Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Последовательная сложность алгоритма */&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;
=== Макроструктура алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&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;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8826</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=8826"/>
		<updated>2016-10-15T09:23:40Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &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;
=== Макроструктура алгоритма ===&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;.&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(K*N^2)&amp;lt;/math&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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Открытое программное обеспечение ====&lt;br /&gt;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8803</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=8803"/>
		<updated>2016-10-15T09:11:59Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
=== Макроструктура алгоритма ===&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;.&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(K*N^2)&amp;lt;/math&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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Открытое программное обеспечение ====&lt;br /&gt;
==== Проприетарное программное обеспечение  ====&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8796</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=8796"/>
		<updated>2016-10-15T09:09:58Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
=== Макроструктура алгоритма ===&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;.&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(K*N^2)&amp;lt;/math&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;
===== Количественная оценка локальности =====&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;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8789</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=8789"/>
		<updated>2016-10-15T09:08:18Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
=== Макроструктура алгоритма ===&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&#039; - F&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;.&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(K*N^2)&amp;lt;/math&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;
===== Количественная оценка локальности =====&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;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</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=8771</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=8771"/>
		<updated>2016-10-15T08:57:32Z</updated>

		<summary type="html">&lt;p&gt;Denemmy: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
=== Макроструктура алгоритма ===&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&#039; - F&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;br&amp;gt;&lt;br /&gt;
Тогда стадия &#039;&#039;&#039;BUILD&#039;&#039;&#039; будет требовать &amp;lt;math&amp;gt;K*N^2&amp;lt;/math&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;
===== Количественная оценка локальности =====&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;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Denemmy</name></author>
	</entry>
</feed>