본 내용은 MIT 18.065 의 강의35번 내용 중 일부 정리입니다. 자세한 내용은 해당 강의를 참고하세요.
머신러닝의 비지도 학습의 한 종류인 클러스터링은 여러 가지 방법이 존재한다. 대표적으로는 k-Means 가 있고, 그 다음으로 Spectral clustering 을 들 수 있다.
Spectral clustering 는 graph Laplacian 행렬의 고유값을 이용한다. graph Laplacian matrix 는 Incidency Matrix 인 A 를 이용해서 구할 수 있고, Degree matrix - Adjacency matrix 로도 구할 수 있다.
\(L = A^TA = D - B\)
L 의 0 이 아닌 가장 작은 고유값을 먼저 구하고 이 고유값에 해당하는 고유벡터가 Fiedler vector 라고 부른다. 그리고 이 벡터의 성분들에 대한 각 부호(+, -) 로 클러스터링을 구분한다.
절차
그래프는 다음과 같다.
# Incidency matrix A 를 구한다.
A <- matrix(c(-1, 1, 0, 0, -1, 0, 1, 0, 0, -1, 0, 1, 0, 1, -1, 0, -1, 0, 0, 1), nrow=5, byrow=T)
A
## [,1] [,2] [,3] [,4]
## [1,] -1 1 0 0
## [2,] -1 0 1 0
## [3,] 0 -1 0 1
## [4,] 0 1 -1 0
## [5,] -1 0 0 1
# graph Laplacian matrix L 을 구한다.
L <- t(A) %*% A
L
## [,1] [,2] [,3] [,4]
## [1,] 3 -1 -1 -1
## [2,] -1 3 -1 -1
## [3,] -1 -1 2 0
## [4,] -1 -1 0 2
# L을 고유값 분해한다.
ev <- eigen(L)
ev
## eigen() decomposition
## $values
## [1] 4.000000e+00 4.000000e+00 2.000000e+00 2.664535e-15
##
## $vectors
## [,1] [,2] [,3] [,4]
## [1,] 0.8660254 0.0000000 0.0000000 -0.5
## [2,] -0.2886751 0.8164966 0.0000000 -0.5
## [3,] -0.2886751 -0.4082483 -0.7071068 -0.5
## [4,] -0.2886751 -0.4082483 0.7071068 -0.5
# Fiedler vector 를 구한다.
x2 <- ev$vectors[,3]
x2
## [1] 0.0000000 0.0000000 -0.7071068 0.7071068
# 또는 아래 방법을 사용한다.
k <- 2
Z <- ev$vectors[,(ncol(ev$vectors)-k+1):(ncol(ev$vectors)-1)]
Z
## [1] 0.0000000 0.0000000 -0.7071068 0.7071068
library(stats)
km <- kmeans(Z, centers=k, nstart=5)
km
## K-means clustering with 2 clusters of sizes 3, 1
##
## Cluster means:
## [,1]
## 1 -0.2357023
## 2 0.7071068
##
## Clustering vector:
## [1] 1 1 1 2
##
## Within cluster sum of squares by cluster:
## [1] 0.3333333 0.0000000
## (between_SS / total_SS = 66.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
군집 1은 node 1, 2, 4 로 구분할 수 있고, 군집 2는 3 이 된다.