Участник:Denemmy/Partitioning Around Medoids (Алгоритм): различия между версиями
Перейти к навигации
Перейти к поиску
Denemmy (обсуждение | вклад) |
Denemmy (обсуждение | вклад) |
||
| Строка 16: | Строка 16: | ||
1 def kMedoids(D, k, tmax=100): | 1 def kMedoids(D, k, tmax=100): | ||
2 # determine dimensions of distance matrix D | 2 <span style="color:#408080"># determine dimensions of distance matrix D</span> | ||
3 m, n = D.shape | 3 m, n = D.shape | ||
4 # randomly initialize an array of k medoid indices | 4 <span style="color:#408080"># randomly initialize an array of k medoid indices</span> | ||
5 M = np.sort(np.random.choice(n, k)) | 5 M = np.sort(np.random.choice(n, k)) | ||
6 # create a copy of the array of medoid indices | 6 <span style="color:#408080"># create a copy of the array of medoid indices</span> | ||
7 Mnew = np.copy(M) | 7 Mnew = np.copy(M) | ||
8 # initialize a dictionary to represent clusters | 8 <span style="color:#408080"># initialize a dictionary to represent clusters</span> | ||
9 C = {} | 9 C = {} | ||
10 for t in xrange(tmax): | 10 for t in xrange(tmax): | ||
11 # determine clusters, i.e. arrays of data indices | 11 <span style="color:#408080"># determine clusters, i.e. arrays of data indices</span> | ||
12 J = np.argmin(D[:,M], axis=1) | 12 J = np.argmin(D[:,M], axis=1) | ||
13 for kappa in range(k): | 13 for kappa in range(k): | ||
14 C[kappa] = np.where(J==kappa)[0] | 14 C[kappa] = np.where(J==kappa)[0] | ||
15 # update cluster medoids | 15 <span style="color:#408080"># update cluster medoids</span> | ||
16 for kappa in range(k): | 16 for kappa in range(k): | ||
17 J = np.mean(D[np.ix_(C[kappa],C[kappa])],axis=1) | 17 J = np.mean(D[np.ix_(C[kappa],C[kappa])],axis=1) | ||
| Строка 35: | Строка 35: | ||
19 Mnew[kappa] = C[kappa][j] | 19 Mnew[kappa] = C[kappa][j] | ||
20 np.sort(Mnew) | 20 np.sort(Mnew) | ||
21 # check for convergence | 21 <span style="color:#408080"># check for convergence</span> | ||
22 if np.array_equal(M, Mnew): | 22 if np.array_equal(M, Mnew): | ||
23 break | 23 break | ||
24 M = np.copy(Mnew) | 24 M = np.copy(Mnew) | ||
25 else: | 25 else: | ||
26 # final update of cluster memberships | 26 <span style="color:#408080"># final update of cluster memberships</span> | ||
27 J = np.argmin(D[:,M], axis=1) | 27 J = np.argmin(D[:,M], axis=1) | ||
28 for kappa in range(k): | 28 for kappa in range(k): | ||
29 C[kappa] = np.where(J==kappa)[0] | 29 C[kappa] = np.where(J==kappa)[0] | ||
30 # return results | 30 <span style="color:#408080"># return results</span> | ||
31 return M, C | 31 return M, C | ||
Версия от 08:24, 15 октября 2016
Авторы: Галеев Д.Ф, Запутляев И.
Свойства и структура алгоритма
Общее описание алгоритма
Кластеризация - это задача из области машинного обучения, которая заключается в том, что нужно выделить некоторое число групп в исходном множестве, в каждой из которых содержатся схожие по некоторой метрике элементы.
Partitioning Around Medoids (PAM) - это одна из реализаций алгоритма кластеризации k-medoids. PAM использует жадный алгоритм, который может не найти оптимального решения, однако он гораздо быстрее полного перебора.
Математическое описание алгоритма
Вычислительное ядро алгоритма
Макроструктура алгоритма
Схема реализации последовательного алгоритма
Реализация алгоритма на python:
1 def kMedoids(D, k, tmax=100): 2 # determine dimensions of distance matrix D 3 m, n = D.shape 4 # randomly initialize an array of k medoid indices 5 M = np.sort(np.random.choice(n, k)) 6 # create a copy of the array of medoid indices 7 Mnew = np.copy(M) 8 # initialize a dictionary to represent clusters 9 C = {} 10 for t in xrange(tmax): 11 # determine clusters, i.e. arrays of data indices 12 J = np.argmin(D[:,M], axis=1) 13 for kappa in range(k): 14 C[kappa] = np.where(J==kappa)[0] 15 # update cluster medoids 16 for kappa in range(k): 17 J = np.mean(D[np.ix_(C[kappa],C[kappa])],axis=1) 18 j = np.argmin(J) 19 Mnew[kappa] = C[kappa][j] 20 np.sort(Mnew) 21 # check for convergence 22 if np.array_equal(M, Mnew): 23 break 24 M = np.copy(Mnew) 25 else: 26 # final update of cluster memberships 27 J = np.argmin(D[:,M], axis=1) 28 for kappa in range(k): 29 C[kappa] = np.where(J==kappa)[0] 30 # return results 31 return M, C