Dariusz Brzeziński
Część III: Grupowanie
Celem algorytmów analizy skupień (grupowania) jest połączenie w grupy obiektów podobnych do siebie i oddzielenie obiektów, które się od siebie różnią.
Definicja miary podobieństwa między obiektami jest kluczowa dla każdego algorytmu grupowania. To co rozumiane jest jako grupa, też bywa różnie definiowane. Wynika to z faktu, że grupowanie jest “źle zdefiniowanym problemem”.
Podstawowe typy algorytmów:
Algorytmy analizy skupień pozostają rozproszone po różnych paczkach w R.
Pokażemy tylko kilka podstawowych zagadnień z grupowania. Przykłady będą wykonywane na zbiorze Iris.
library(factoextra)
library(fpc)
library(NbClust)
set.seed(23)
df <- iris[, -5] # usuwamy kolumnę Species
df <- scale(df)
km.res <- eclust(df, "kmeans", k = 3, nstart = 25, graph = F)
fviz_cluster(km.res, palette = "jco", ggtheme = theme_minimal())
Sprawdzamy sumę sum kwadratów (wss) odległości od centroidu dla wszystkich skupień przy rosnącym k. Następnie analizujemy wykres zależności wws od k (elbow plot). Alternatywnie wykorzystujemy miarę gap statistic, lub rysujemy silhouette plot.
wss <- (nrow(df)-1)*sum(apply(df,2,var))
for (i in 2:15)
wss[i] <- sum(kmeans(df,
centers=i)$withinss)
wssDf = data.frame(n=1:15, wss=wss)
ggplot(wssDf, aes(n, wss)) + geom_point() +
geom_line() + theme_minimal()
km.res <- eclust(df, "kmeans", k = 2, nstart = 25, graph = F)
fviz_silhouette(km.res, palette = "jco", ggtheme = theme_classic(), print.summary = F)
km.res <- eclust(df, "kmeans", k = 3, nstart = 25, graph = F)
fviz_silhouette(km.res, palette = "jco", ggtheme = theme_classic(), print.summary = F)
km.res <- eclust(df, "kmeans", k = 4, nstart = 25, graph = F)
fviz_silhouette(km.res, palette = "jco", ggtheme = theme_classic(), print.summary = F)
Dla k-średnich jak i innych algorytmów grupowania kluczowe jest określenie miary odległości między przykładami. Typowe miary to:
Algorytm jest bardzo podobny do k-średnich, z tą różnicą, że po każdej iteracji wyliczany jest nie centroid tylko medoid. Medoid jest to przykład, który znajduje się najbliżej centrum skupień.
Ponieważ jest to konkretny przykład a nie punkt w przestrzeni, medoid może być traktowany jako konkretny reprezentant skupienia ze zbioru danych.
Popularne wersje: PAM i CLARA
pam.res <- eclust(df, "pam", k = 3, graph = F)
fviz_cluster(pam.res, palette = "jco", ggtheme = theme_minimal())
AHC = Agglomerative Hierarchical Clustering
hc.res <- eclust(df, "hclust", k = 3, hc_metric = "euclidean", hc_method = "ward.D2", graph = F)
fviz_dend(hc.res, show_labels = F, palette = "jco", as.ggplot = T)
Density-Based Spatial Clustering and Application with Noise
data("multishapes"); ms <- multishapes[, 1:2]
db.res <- fpc::dbscan(ms, eps=0.15, MinPts=5)
fviz_cluster(db.res, ms, stand=F, ellipse=F, show.clust.cent=F, geom="point", palette="jco", ggtheme= theme_classic())
Jak znamy poprawne etykiety to mamy do dyspozycji macierz pomyłek i możemy wykorzystać miary znane z klasyfikacji
kc <- kmeans(df, 3)
table(iris$Species, kc$cluster)
1 2 3
setosa 0 33 17
versicolor 46 0 4
virginica 50 0 0
Polecanymi miarami przy znajomości etykiet są Adjuested Mutual Information (AMI) i Adjusted Rand Index (ARI).
Jeśli nie znamy poprawnych etykiet dla danych uczących to typowymi miarami oceny są:
library(fpc)
set.seed(23)
face <- rFace(1000, p=2, dMoNo=3)
df = data.frame(x=face[,1], y=face[,2])
labels = as.integer(attr(face,"grouping"))
df
to dane do pogrupowania, labels
poprawne etykietyggplot(df, aes(x, y, color=factor(predicted))) +
geom_point() +
theme_bw()