Основная задача кластерного анализа — разбиение исходного набора объектов на группы (кластеры) таким образом, чтобы:
interact(elbow_demo, k=IntSlider(min=2,max=8,step=1,value=2))
<function __main__.elbow_demo(k=2)>
interact(demo_kmpp, iters=IntSlider(min=1,max=6,step=1,value=1))
<function __main__.demo_kmpp(iters=1)>
Аггломеративные алгоритмы
Дивизивные алгоритмы
см. лекцию про метрические методы
Single linkage $$ d_{min}(C_i, C_j) = \min_{\mathbf{x} \in C_i, \mathbf{x}' \in C_j} \|\mathbf{x} -\mathbf{x}' \| $$
Complete linkage $$ d_{max}(C_i, C_j) = \max_{\mathbf{x} \in C_i, \mathbf{x}' \in C_j} \|\mathbf{x} -\mathbf{x}' \| $$
Average linkage $$ d_{avg}(C_i, C_j) = \frac{1}{n_i n_j}\sum_{\mathbf{x} \in C_i}\sum_{\mathbf{x}' \in C_j} \|\mathbf{x} -\mathbf{x}' \| $$
Centroid linkage $$ d_{cent}(C_i, C_j) = \|\mu_i -\mu_j \| $$
Ward linkage $$ d_{ward}(C_i, C_j) = \sqrt{\frac{n_i n_j}{n_i + n_j}} \|\mu_i - \mu_j \|$$
plt.scatter(X[:,0], X[:,1])
<matplotlib.collections.PathCollection at 0x1a19685cc0>
# А теперь сделаем это с питоном
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.cluster.hierarchy import fcluster, cophenet
Z = linkage(X, method='single', metric='euclidean')
dend = dendrogram(Z)
При "удачно" построенном дереве эти ряды должны сильно коррелировать.
interact(coph_demo, k=IntSlider(min=2, max=10, step=1, value=2),
link=['complete', 'single', 'average', 'centroid'],
metric=['euclidean', 'cityblock'])
<function __main__.coph_demo(link='single', metric='euclidean', k=2)>
![]() |
![]() |
---|
min_pts
. interact(dbscan_demo, eps=FloatSlider(min=0.1, max=10, step=0.05, value=1), min_pts=IntSlider(min=2, max=15, step=1, value=5))
<function __main__.dbscan_demo(eps=1, min_pts=5)>
Пусть $\hat{\pi}$ - это полученное разбиение на кластеры, а $\pi^*$ - ground truth. Тогда доля правильно угаданных меток рассчитывается как
$$ Acc(\hat{\pi}, \pi^*) = \frac{\text{# of correctly clustered obs}}{N} \text{,}$$где объект считается правильно кластеризован, если хотя бы половина объектов из того же кластера в $\hat{\pi}$ относится к некоторому кластеру в $\pi^*$
где
где
Adjusted Rand Index - корректировка Rand index:
$$\text{ARI}(\hat{\pi},\pi^*) = \frac{\text{Rand}(\hat{\pi},\pi^*) - \text{Expected}}{\text{Max} - \text{Expected}}$$Так же есть Normalized Mutual Information, но результаты этой метрики схожи с ARI
Пусть дана кластеризация в $K$ кластеров, и объект $i$ попал в $C_k$