library(tidyverse)
library(factoextra)
Silhouette coefficient
실루엣 계수는 아래와 같은 순서로 계산됩니다. 순서대로 살펴보겠습니다.
번째 관측치가 속해있는 군집 내에 average dissimilarity 를 계산
번째 관측치가 속해있지 않은 군집에 대해서 를 계산
번째 관측치에 대해서 실루엣 계수 계산
Average silhouette method
Average silhouette method에 대해 알아보겠습니다. 알고리즘의 대략적인 순서는 다음과 같습니다.
여기서 avg.sil
은 위에서 구한 실루엣 계수의 평균을 의미합니다. 즉, 각 관측치별로 avg.sil
을 구할 수 있습니다.
Example
<- scale(iris[, -5]) df_iris
fviz_nbclust(df_iris, kmeans, method = "silhouette")
fviz_nbclust()
에서는 avg.sil이 가장 높은
<- df_iris %>%
km.res2 eclust("kmeans", k = 3, graph = F, nstart = 25)
fviz_silhouette(km.res2)
cluster size ave.sil.width
1 1 50 0.64
2 2 53 0.39
3 3 47 0.35
silhouette plot을 보면 빨간 점선으로 avg.sil이 표시되는 것을 볼 수 있습니다. 각 군집별 ave.sil.width를 평균내면 avg.sil과 같습니다. 오른쪽 끝에 실루엣 계수 값이 음수인 경우가 보입니다. 실루엣 계수가 음수라는 의미는
<- km.res2$silinfo$widths[, 1:3]
sil <- which(sil[, "sil_width"] < 0)
neg_sil sil[neg_sil, ]
cluster neighbor sil_width
112 3 2 -0.01058434
128 3 2 -0.02489394
해당 관측치를 뽑아보면 112, 128번 index의 관측치인 것을 확인할 수 있습니다.
silhouette coefficient는 각 관측치별로 계산해야 하기 때문에 계산량이 많습니다. 데이터가 클 때는 주의가 필요합니다.
참고자료
https://en.wikipedia.org/wiki/Silhouette_(clustering)
https://www.datanovia.com/en/wp-content/uploads/dn-tutorials/book-preview/clustering_en_preview.pdf
Citation
@online{don2022,
author = {Don, Don and Don, Don},
title = {Average Silhouette Method},
date = {2022-10-08},
url = {https://dondonkim.netlify.app/posts/2022-10-08-sillouette/silhouette.html},
langid = {en}
}