보강 3. 그래프 라플라시안과 스펙트럴 클러스터링 The Graph Laplacian and Spectral Clustering — 서술
L12는 회로 이야기로 끝났다. 그리고 마지막 절에서 행렬 하나를 만들었다.
L = A T A , L i j = { 노드 i 의 차수 ( i = j ) − 1 ( i ≠ j , 이어져 있음 ) 0 ( 그 외 ) L = A^{\mathsf T}A,
\qquad
L_{ij} =
\begin{cases}
\text{노드 } i \text{ 의 차수} & (i = j) \\
-1 & (i \neq j,\ \text{이어져 있음}) \\
0 & (\text{그 외})
\end{cases} L = A T A , L ij = ⎩ ⎨ ⎧ 노드 i 의 차수 − 1 0 ( i = j ) ( i = j , 이어져 있음 ) ( 그 외 ) (1) 의 L L L 을 그래프 라플라시안 이라 부른다고 하고 L12는 거기서
멈췄다. 그때는 회로를 푸는 도구였을 뿐이다.
그런데 이 행렬은 대칭이고 준정부호 다. 그러니 L25의 스펙트럼 정리가 무조건 통하고,
L27의 에너지 이야기도 통한다. 후반부에서 만든 도구가 전부 들어맞는다는 뜻이다.
그러면 그 도구로 무엇을 할 수 있는가. 놀랍게도 그래프를 자르는 선을 알려준다.
그래프의 노드마다 수를 하나씩 적어 놓고 이웃끼리 얼마나 다른지 를 재 보자.
전부 같은 수를 적으면 0이다. 이웃끼리 비슷하게 적으면 작고, 마구 적으면 크다.
그 "다름의 총량"이 정확히 x T L x \vv{x}^{\mathsf T}L\vv{x} x T L x 다.
가장 작게 만드는 법은 전부 같은 수를 적는 것이고, 그것은 시시하다.
그래서 "합이 0"이라는 조건을 걸고 다시 묻는다. 그 답이 그래프를 둘로 가른다.
1. L12가 한 줄을 남겨 두었다 ¶ L12의 마지막 논증을 다시 보자. L x = 0 L\vv{x} = \vv{0} L x = 0 인 x \vv{x} x 를 찾을 때 이렇게 썼다.
x T A T A x = ( A x ) T ( A x ) = ∥ A x ∥ 2 \vv{x}^{\mathsf T}A^{\mathsf T}A\vv{x} = (A\vv{x})^{\mathsf T}(A\vv{x})
= \lVert A\vv{x} \rVert^2 x T A T A x = ( A x ) T ( A x ) = ∥ A x ∥ 2 (2) 의 오른쪽을 성분으로 풀어 쓰기만 하면 이 글 전체가 나온다.
L12는 그것을 하지 않고 넘어갔다.
성분으로 풀어 쓴다 ¶ A A A 의 k k k 번째 행은 간선 k k k 에 해당한다. 그 간선이 노드 i i i 에서 노드 j j j 로 간다면
그 행은 이렇게 생겼다(L12).
A k ℓ = { − 1 ( ℓ = i ) + 1 ( ℓ = j ) 0 ( 그 외 ) A_{k\,\ell} =
\begin{cases}
-1 & (\ell = i) \\
+1 & (\ell = j) \\
0 & (\text{그 외})
\end{cases} A k ℓ = ⎩ ⎨ ⎧ − 1 + 1 0 ( ℓ = i ) ( ℓ = j ) ( 그 외 ) (3) 의 행에는 0이 아닌 성분이 딱 둘뿐이다. 그러니 x \vv{x} x 와 곱할 때
살아남는 항도 둘뿐이다.
( A x ) k = ∑ ℓ A k ℓ x ℓ = ( − 1 ) x i + ( + 1 ) x j = x j − x i (A\vv{x})_k = \sum_{\ell} A_{k\,\ell}\,x_\ell = (-1)\,x_i + (+1)\,x_j = x_j - x_i ( A x ) k = ℓ ∑ A k ℓ x ℓ = ( − 1 ) x i + ( + 1 ) x j = x j − x i 이다. (4) 의 값이 L12에서 "간선 양 끝의 전위차"라고 부른 것이다.
이제 (2) 의 제곱합에 넣는다.
x T L x = ∑ k [ ( A x ) k ] 2 = ∑ ( i , j ) ∈ E ( x i − x j ) 2 \vv{x}^{\mathsf T}L\vv{x}
= \sum_{k} \left[(A\vv{x})_k\right]^2
= \sum_{(i,j) \in E} \left(x_i - x_j\right)^2 x T L x = k ∑ [ ( A x ) k ] 2 = ( i , j ) ∈ E ∑ ( x i − x j ) 2 Figure 1: 같은 그래프에 세 가지 값을 적어 본 것이다. 굵은 빨간 간선이 이웃끼리 어긋난 자리다.
왼쪽은 하나도 안 어긋나 0이다. 가운데는 일곱 간선이 모두 조금씩 어긋났는데 1.92뿐이고,
오른쪽은 다섯만 어긋났는데 20이다. 개수가 아니라 어긋난 크기가 제곱되어 들어간다.
여기서 두 가지가 공짜로 나온다 ¶ 첫째, L L L 은 준정부호다. (5) 의 오른쪽이 제곱의 합이니
음수가 될 수 없다. L27의 다섯 조건 중 "에너지"로 판정한 것이고,
L = A T A L = A^{\mathsf T}A L = A T A 라는 꼴에서 곧바로 나오는 것이기도 하다.
x T L x ≥ 0 for all x ⟺ λ i ≥ 0 for all i \vv{x}^{\mathsf T}L\vv{x} \ge 0 \ \text{ for all } \vv{x}
\qquad\Longleftrightarrow\qquad
\lambda_i \ge 0 \ \text{ for all } i x T L x ≥ 0 for all x ⟺ λ i ≥ 0 for all i 둘째, 상수벡터가 영공간에 있다. 1 = ( 1 , 1 , … , 1 ) \vv{1} = (1,1,\dots,1) 1 = ( 1 , 1 , … , 1 ) 을 넣으면
모든 간선에서 x i − x j = 0 x_i - x_j = 0 x i − x j = 0 이므로 (5) 의 값이 0이다.
준정부호에서 에너지가 0이면 영공간에 있는 것이므로
L 1 = 0 ⟹ λ 1 = 0 은 언제나 고윳값이다 L\vv{1} = \vv{0}
\qquad\Longrightarrow\qquad
\lambda_1 = 0 \ \text{ 은 언제나 고윳값이다} L 1 = 0 ⟹ λ 1 = 0 은 언제나 고윳값이다 이다. (1) 의 정의로 보면 더 뻔하다. i i i 번째 행을 다 더해 보자.
∑ j L i j = deg ( i ) ⏟ j = i + ( − 1 ) × deg ( i ) ⏟ j ≠ i , 이어진 것 = 0 \sum_j L_{ij}
= \underbrace{\deg(i)}_{j = i}
+ \underbrace{(-1) \times \deg(i)}_{j \neq i,\ \text{이어진 것}}
= 0 j ∑ L ij = j = i deg ( i ) + j = i , 이어진 것 ( − 1 ) × deg ( i ) = 0 (8) 의 계산은 "대각에 차수가 있고 나머지에 -1 이 차수만큼 있다"를
그대로 적은 것이다. 행의 합이 0이라는 것이 곧 L 1 = 0 L\vv{1} = \vv{0} L 1 = 0 이다.
대각합도 세어 두자. L21에서 대각합이 고윳값의 합이었다.
∑ i λ i = tr L = ∑ i deg ( i ) = 2 ∣ E ∣ \sum_i \lambda_i = \tr L = \sum_i \deg(i) = 2\lvert E \rvert i ∑ λ i = tr L = i ∑ deg ( i ) = 2 ∣ E ∣ (9) 의 마지막 등식은 간선 하나가 양 끝에서 한 번씩 세어지기 때문이다.
고윳값을 다 더하면 간선 수의 두 배다.
2. 영공간의 차원이 조각의 개수다 ¶ L12에서는 연결된 그래프만 다뤘고, 그때 영공간이 상수벡터 하나뿐이라고 했다.
연결이 끊기면 어떻게 되는가.
에너지가 0이라는 것의 뜻 ¶ x T L x = 0 \vv{x}^{\mathsf T}L\vv{x} = 0 x T L x = 0 이라고 하자. (5) 의 오른쪽은
제곱의 합이므로 모든 항이 각각 0이어야 한다.
∑ ( i , j ) ∈ E ( x i − x j ) 2 = 0 ⟺ x i = x j for every edge ( i , j ) \sum_{(i,j) \in E} (x_i - x_j)^2 = 0
\qquad\Longleftrightarrow\qquad
x_i = x_j \ \ \text{ for every edge } (i,j) ( i , j ) ∈ E ∑ ( x i − x j ) 2 = 0 ⟺ x i = x j for every edge ( i , j ) (10) 의 오른쪽은 "이어진 두 노드는 값이 같다"는 뜻이다.
그런데 한 연결 성분 안에서는 어떤 두 노드도 간선을 따라 이어져 있으므로,
그 길을 따라가며 값이 계속 같아야 한다. 한 성분 안에서는 값이 상수다.
성분끼리는 이어져 있지 않으니 서로 다른 값을 가져도 된다.
확인해 보자. 성분 S S S 의 지시벡터를 1 S \vv{1}_S 1 S 라 하면, 어떤 간선 ( i , j ) (i,j) ( i , j ) 든
양 끝이 같은 성분에 있다. 성분을 넘나드는 간선은 정의상 없기 때문이다.
그러니 두 값이 항상 같다.
( 1 S ) i = ( 1 S ) j for every edge ⟹ 1 S T L 1 S = ∑ ( i , j ) ∈ E 0 = 0 (\vv{1}_S)_i = (\vv{1}_S)_j
\quad \text{ for every edge}
\qquad\Longrightarrow\qquad
\vv{1}_S^{\mathsf T}L\,\vv{1}_S
= \sum_{(i,j)\in E} 0 = 0 ( 1 S ) i = ( 1 S ) j for every edge ⟹ 1 S T L 1 S = ( i , j ) ∈ E ∑ 0 = 0 (12) 에서 에너지가 0이고 L L L 이 준정부호이므로 L 1 S = 0 L\vv{1}_S = \vv{0} L 1 S = 0 이다.
그리고 성분이 다르면 겹치는 자리가 없으므로 1 S T 1 S ′ = 0 \vv{1}_S^{\mathsf T}\vv{1}_{S'} = 0 1 S T 1 S ′ = 0 ,
곧 서로 직교라 독립이다. 성분이 c c c 개면 독립인 벡터가 c c c 개 나온다.
Figure 2: 다리를 하나씩 끊을 때마다 0인 고윳값이 하나씩 늘어난다.
윗줄이 그래프이고 아랫줄이 그 라플라시안의 고윳값이다.
3. 두 번째 고윳값이 진짜 이야기다 ¶ λ 1 = 0 \lambda_1 = 0 λ 1 = 0 은 아무것도 말해 주지 않는다. 어떤 그래프에서든 그렇기 때문이다.
λ 2 \lambda_2 λ 2 부터가 정보다.
λ 2 = 0 \lambda_2 = 0 λ 2 = 0 이면 Theorem 1 에 의해 연결이 끊겨 있다.
λ 2 \lambda_2 λ 2 가 아주 작으면 끊어질 뻔했다. 다리 몇 개로 겨우 붙어 있다는 뜻이다.
λ 2 \lambda_2 λ 2 가 크면 단단히 얽혀 있다.
그래서 λ 2 \lambda_2 λ 2 를 대수적 연결도 (algebraic connectivity)라 부르고,
그 고유벡터를 피들러 벡터 라 부른다. 미로슬라프 피들러가 1973년에 이 성질을
알아낸 데서 왔다.
왜 최소화 문제인가 ¶ λ 2 \lambda_2 λ 2 가 무엇을 최소로 하는 것인지 적어 두자. L25의 스펙트럼 정리로
L = Q Λ Q T L = Q\Lambda Q^{\mathsf T} L = Q Λ Q T 라 쓰고, x \vv{x} x 를 고유기저로 펼치면
x = ∑ i c i q i \vv{x} = \sum_i c_i\vv{q}_i x = ∑ i c i q i 이고
x T L x x T x = ∑ i λ i c i 2 ∑ i c i 2 \frac{\vv{x}^{\mathsf T}L\vv{x}}{\vv{x}^{\mathsf T}\vv{x}}
= \frac{\sum_i \lambda_i c_i^2}{\sum_i c_i^2} x T x x T L x = ∑ i c i 2 ∑ i λ i c i 2 가 된다. (14) 의 오른쪽은 λ i \lambda_i λ i 들의 가중평균 이므로
가장 작은 것 이상이다. 보강 1에서 쓴 레일리 몫 바로 그것이다.
아무 조건도 없으면 최솟값은 λ 1 = 0 \lambda_1 = 0 λ 1 = 0 이고, 그것을 주는 x \vv{x} x 는 상수벡터다.
시시한 답이다. 그래서 그 방향을 막는다.
막는다는 것이 고유좌표에서 무슨 뜻인지 보자. q 1 = 1 / n \vv{q}_1 = \vv{1}/\sqrt{n} q 1 = 1 / n 이므로
x ⊥ 1 ⟺ c 1 = q 1 T x = 0 \vv{x} \perp \vv{1}
\qquad\Longleftrightarrow\qquad
c_1 = \vv{q}_1^{\mathsf T}\vv{x} = 0 x ⊥ 1 ⟺ c 1 = q 1 T x = 0 이고, (15) 의 조건을 (14) 의 식에 넣으면 첫 항이
통째로 사라진다.
x T L x x T x = λ 2 c 2 2 + λ 3 c 3 2 + ⋯ c 2 2 + c 3 2 + ⋯ ≥ λ 2 \frac{\vv{x}^{\mathsf T}L\vv{x}}{\vv{x}^{\mathsf T}\vv{x}}
= \frac{\lambda_2 c_2^2 + \lambda_3 c_3^2 + \cdots}{c_2^2 + c_3^2 + \cdots}
\ \ge\ \lambda_2 x T x x T L x = c 2 2 + c 3 2 + ⋯ λ 2 c 2 2 + λ 3 c 3 2 + ⋯ ≥ λ 2 (16) 의 부등식에서 등호는 c 2 c_2 c 2 만 남을 때, 곧 x = q 2 \vv{x} = \vv{q}_2 x = q 2 일 때
성립한다. 한 방향을 막았더니 최솟값이 그다음 고윳값으로 올라간 것이다.
λ 2 = min x ≠ 0 , x ⊥ 1 x T L x x T x = min ∑ i x i = 0 ∑ ( i , j ) ∈ E ( x i − x j ) 2 ∑ i x i 2 \lambda_2 = \min_{\vv{x} \neq \vv{0},\ \vv{x} \perp \vv{1}}
\frac{\vv{x}^{\mathsf T}L\vv{x}}{\vv{x}^{\mathsf T}\vv{x}}
= \min_{\sum_i x_i = 0}
\frac{\sum_{(i,j)\in E}(x_i - x_j)^2}{\sum_i x_i^2} λ 2 = x = 0 , x ⊥ 1 min x T x x T L x = ∑ i x i = 0 min ∑ i x i 2 ∑ ( i , j ) ∈ E ( x i − x j ) 2 (17) 의 오른쪽을 말로 옮기면 이렇다.
성분의 합이 0이라는 조건 아래에서, 이웃끼리 가장 덜 어긋나게 값을 적는 방법.
합이 0이라는 조건은 "양수도 있고 음수도 있어야 한다"는 뜻이다.
곧 모두를 같은 편에 둘 수는 없다. 그러면서 이웃끼리는 되도록 같은 편에 두라는 것이니,
답이 자연스럽게 두 덩어리 로 갈린다.
Figure 3: 왼쪽에서 회색은 아무 x \vv{x} x 나 넣은 것이고 파랑은 합이 0인 것만 넣은 것이다.
회색은 0까지 내려가고 파랑은 λ 2 \lambda_2 λ 2 에서 멈춘다.
오른쪽은 무작위로 아무리 많이 뽑아도 λ 2 \lambda_2 λ 2 아래로는 못 간다는 것을 보인 것이다.
삼각형 두 개를 다리 하나로 이은 그래프를 보자.
L = [ 2 − 1 − 1 0 0 0 − 1 2 − 1 0 0 0 − 1 − 1 3 − 1 0 0 0 0 − 1 3 − 1 − 1 0 0 0 − 1 2 − 1 0 0 0 − 1 − 1 2 ] L = \begin{bmatrix}
2 & -1 & -1 & 0 & 0 & 0 \\
-1 & 2 & -1 & 0 & 0 & 0 \\
-1 & -1 & 3 & -1 & 0 & 0 \\
0 & 0 & -1 & 3 & -1 & -1 \\
0 & 0 & 0 & -1 & 2 & -1 \\
0 & 0 & 0 & -1 & -1 & 2
\end{bmatrix} L = ⎣ ⎡ 2 − 1 − 1 0 0 0 − 1 2 − 1 0 0 0 − 1 − 1 3 − 1 0 0 0 0 − 1 3 − 1 − 1 0 0 0 − 1 2 − 1 0 0 0 − 1 − 1 2 ⎦ ⎤ (18) 의 대각선이 차수 ( 2 , 2 , 3 , 3 , 2 , 2 ) (2,2,3,3,2,2) ( 2 , 2 , 3 , 3 , 2 , 2 ) 이고 행의 합이 전부 0이다.
이 그래프는 좌우가 대칭이다(노드 0 ↔ 5 0\leftrightarrow5 0 ↔ 5 , 1 ↔ 4 1\leftrightarrow4 1 ↔ 4 ,
2 ↔ 3 2\leftrightarrow3 2 ↔ 3 을 맞바꾸면 그대로다). 그러니 1 \vv{1} 1 에 수직인 고유벡터는
반대칭 일 것이라 짐작하고 x = ( a , a , b , − b , − a , − a ) \vv{x} = (a, a, b, -b, -a, -a) x = ( a , a , b , − b , − a , − a ) 로 놓아 보자.
첫 행과 셋째 행을 쓰면
2 a − a − b = λ a 및 − a − a + 3 b + b = λ b 2a - a - b = \lambda a
\qquad\text{및}\qquad
-a - a + 3b + b = \lambda b 2 a − a − b = λa 및 − a − a + 3 b + b = λb 이다. (19) 의 왼쪽에서 b = ( 1 − λ ) a b = (1-\lambda)a b = ( 1 − λ ) a 를 얻어 오른쪽에 넣으면
− 2 a + 4 ( 1 − λ ) a = λ ( 1 − λ ) a ⟹ λ 2 − 5 λ + 2 = 0 -2a + 4(1-\lambda)a = \lambda(1-\lambda)a
\qquad\Longrightarrow\qquad
\lambda^2 - 5\lambda + 2 = 0 − 2 a + 4 ( 1 − λ ) a = λ ( 1 − λ ) a ⟹ λ 2 − 5 λ + 2 = 0 가 되고, (20) 의 근이 답이다.
λ = 5 ± 17 2 ⟹ λ 2 = 5 − 17 2 = 0.438447 … \lambda = \frac{5 \pm \sqrt{17}}{2}
\qquad\Longrightarrow\qquad
\lambda_2 = \frac{5 - \sqrt{17}}{2} = 0.438447\ldots λ = 2 5 ± 17 ⟹ λ 2 = 2 5 − 17 = 0.438447 … (21) 의 값이 수치 계산과 소수점 아홉 자리까지 일치한다.
그리고 피들러 벡터는 ( − 0.465 , − 0.465 , − 0.261 , + 0.261 , + 0.465 , + 0.465 ) (-0.465, -0.465, -0.261, +0.261, +0.465, +0.465) ( − 0.465 , − 0.465 , − 0.261 , + 0.261 , + 0.465 , + 0.465 ) 다.
Figure 4: 왼쪽이 피들러 벡터를 그래프 위에 칠한 것이다. 왼쪽 삼각형이 전부 음수이고
오른쪽이 전부 양수다. 부호가 바뀌는 자리에 놓인 간선은 다리 하나뿐이다.
4. 그래서 그래프를 자른다 ¶ 이제 알고리즘이 나온다. 놀랍도록 짧다.
라플라시안 L = A T A L = A^{\mathsf T}A L = A T A 를 만든다.
두 번째로 작은 고윳값의 고유벡터 f \vv{f} f 를 구한다.
f i > 0 f_i > 0 f i > 0 이면 이쪽, f i < 0 f_i < 0 f i < 0 이면 저쪽으로 보낸다.
Definition 1 의 절차는 그래프의 구조를 아무에게도 알려주지 않았다.
고윳값 하나를 구했을 뿐인데 덩어리가 갈린다.
왜 이것이 좋은 절단인가 ¶ 절단의 크기, 곧 두 편을 잇는 간선의 개수 를 세어 보자. x \vv{x} x 를
한쪽은 +1, 다른 쪽은 -1 인 벡터로 두면 (5) 에서
항마다 두 경우뿐이다.
( x i − x j ) 2 = { 0 ( 같은 편 ) ( ± 2 ) 2 = 4 ( 다른 편 ) (x_i - x_j)^2 =
\begin{cases}
0 & (\text{같은 편}) \\
(\pm 2)^2 = 4 & (\text{다른 편})
\end{cases} ( x i − x j ) 2 = { 0 ( ± 2 ) 2 = 4 ( 같은 편 ) ( 다른 편 ) (22) 의 값을 다 더하면 4가 건너는 간선의 개수만큼 나온다.
x T L x = ∑ ( i , j ) ∈ E ( x i − x j ) 2 = 4 × ∣ cut ∣ \vv{x}^{\mathsf T}L\vv{x}
= \sum_{(i,j)\in E}(x_i - x_j)^2
= 4 \times \lvert\, \text{cut} \,\rvert x T L x = ( i , j ) ∈ E ∑ ( x i − x j ) 2 = 4 × ∣ cut ∣ (23) 의 등식이 다리를 놓아 준다. 절단을 작게 하는 것과
x T L x \vv{x}^{\mathsf T}L\vv{x} x T L x 를 작게 하는 것이 같은 일이다.
그리고 ± 1 \pm1 ± 1 성분의 합이 0이라는 조건은 양쪽을 반반으로 나누라 는 뜻이다.
그러면 우리가 풀고 싶은 문제는 이렇게 적힌다.
min x i ∈ { − 1 , + 1 } , ∑ i x i = 0 x T L x \min_{\ x_i \in \{-1, +1\},\ \sum_i x_i = 0} \ \vv{x}^{\mathsf T}L\vv{x} x i ∈ { − 1 , + 1 } , ∑ i x i = 0 min x T L x (24) 의 문제는 NP-어렵다. 후보의 개수를 세어 보면 왜 그런지 짐작이 간다.
1 2 ( n n / 2 ) ∼ 2 n 2 π n ( n = 60 ⟹ 5.9 × 1 0 16 ) \frac{1}{2}\binom{n}{n/2} \ \sim\ \frac{2^{n}}{\sqrt{2\pi n}}
\qquad
(n = 60 \ \Longrightarrow\ 5.9 \times 10^{16}) 2 1 ( n /2 n ) ∼ 2 πn 2 n ( n = 60 ⟹ 5.9 × 1 0 16 ) (25) 의 값은 1초에 10억 개씩 세어도 2년 이 걸린다.
노드가 60개인 작은 그래프에서 그렇다.
그런데 여기서 조건 하나를 놓아 준다. x i ∈ { − 1 , + 1 } x_i \in \{-1,+1\} x i ∈ { − 1 , + 1 } 이라는 조건을 빼고
실수를 허용 하면, 남는 것이 정확히 (17) 의 문제이고
답이 λ 2 \lambda_2 λ 2 와 피들러 벡터다.
± 1 \pm1 ± 1 을 요구하면 NP-어렵다. 실수를 허용하면 고윳값 문제가 되어 순식간에 풀린다.
그렇게 얻은 실수 답의 부호만 취해 다시 ± 1 \pm1 ± 1 로 돌아온다.
이 완화가 최적을 보장하지는 않는다. 다만 λ 2 \lambda_2 λ 2 가 최적 절단의 아래 한계 를
주고, 실제로 나오는 절단이 그 한계에 꽤 붙어 있다.
실제로 잘라 보면 ¶ 노드 60개를 두 덩어리로 만들고 덩어리 안은 촘촘히, 사이는 성기게 이었다.
간선이 320개이고 그중 두 덩어리를 잇는 것이 15개다.
피들러 벡터의 부호로 자르면 30 대 30으로 정확히 갈리고 15개를 자른다.
무작위로 반반 나눈 것 5000개와 견주면 최선이 125개다.
자른 간선 피들러 15 \mathbf{15} 15 무작위 5000개 중 최선 125 무작위 5000개의 중앙값 163
Figure 5: 가운데 그림에서 빨간 간선이 잘린 것이다. 오른쪽 히스토그램에서 빨간 선(피들러)이
무작위 분포와 겹치지도 않는다.
언제 안 되는가 ¶ λ 2 \lambda_2 λ 2 는 "얼마나 붙어 있는가"를 재는 수다. 그러니 덩어리가 애초에 없으면
알려줄 것도 없다. 두 덩어리 사이의 다리를 늘려 가며 재 보면 그것이 보인다.
Figure 6: 왼쪽에서 다리를 놓을수록 λ 2 \lambda_2 λ 2 가 올라간다. 오른쪽에서 정답률이
다리가 많아지면 50%로, 곧 동전 던지기로 떨어진다.
다리가 없으면 λ 2 = 0 \lambda_2 = 0 λ 2 = 0 이고 갈래가 뚜렷하다. 다리를 몇 개 놓아도
λ 2 \lambda_2 λ 2 가 작게 남아 여전히 잘 갈린다. 그런데 다리를 충분히 많이 놓으면
두 덩어리라는 것이 더 이상 사실이 아니고 , 그때는 알고리즘이 틀린 것이 아니라
찾을 것이 없는 것이다.
5. 어디까지 가는가 ¶ 두 조각으로 가르는 것이 전부가 아니다.
k k k 조각으로 나누려면 고유벡터를 q 2 , … , q k \vv{q}_2, \dots, \vv{q}_k q 2 , … , q k 까지 k − 1 k-1 k − 1 개 쓴다.
노드 i i i 에 좌표를 하나씩 붙이는 셈이다.
z i = ( ( q 2 ) i , ( q 3 ) i , … , ( q k ) i ) ∈ R k − 1 \vv{z}_i = \left(
(\vv{q}_2)_i,\ (\vv{q}_3)_i,\ \dots,\ (\vv{q}_k)_i
\right) \in \R^{k-1} z i = ( ( q 2 ) i , ( q 3 ) i , … , ( q k ) i ) ∈ R k − 1 (26) 의 좌표는 그래프에서 가까운 노드를 R k − 1 \R^{k-1} R k − 1 에서도 가깝게
놓는다. 그 위에서 보통의 군집화를 돌리면 된다. 이것이 스펙트럴 클러스터링 이다.
k = 2 k = 2 k = 2 이면 좌표가 하나뿐이고, 그 부호로 자르는 것이 4절이었다.
이미지 분할 도 같은 틀이다. 픽셀을 노드로 두고 이웃 픽셀을 간선으로 이은 뒤,
색이 비슷할수록 큰 가중치를 준다. 그러면 라플라시안이 L = A T C A L = A^{\mathsf T}CA L = A T C A 가 되는데,
L12에서 회로의 전도도로 만든 바로 그 행렬이다. 피들러 벡터가 그 그래프를 자르면
그것이 곧 물체의 경계다.
반반이 아니어도 될 때 가 실무에서는 더 흔하다. 4절에서는 ± 1 \pm1 ± 1 성분의 합이
0이라는 조건을 걸었고, 그것은 정확히 반반으로 나누라 는 뜻이었다. 그럴 이유가 없다.
크기가 a a a 와 b b b 인 두 덩어리 A , B A, B A , B 로 나누고 싶다면 값을 이렇게 잡으면 된다.
x i = { + b / a ( i ∈ A ) − a / b ( i ∈ B ) x_i =
\begin{cases}
+\sqrt{b/a} & (i \in A) \\
-\sqrt{a/b} & (i \in B)
\end{cases} x i = { + b / a − a / b ( i ∈ A ) ( i ∈ B ) (27) 의 벡터는 두 조건을 자동으로 만족한다. 합을 세어 보면
∑ i x i = a b a − b a b = a b − a b = 0 및 ∥ x ∥ 2 = a ⋅ b a + b ⋅ a b = a + b = n \sum_i x_i = a\sqrt{\tfrac{b}{a}} - b\sqrt{\tfrac{a}{b}}
= \sqrt{ab} - \sqrt{ab} = 0
\qquad\text{및}\qquad
\lVert \vv{x} \rVert^2 = a\cdot\tfrac{b}{a} + b\cdot\tfrac{a}{b} = a + b = n i ∑ x i = a a b − b b a = ab − ab = 0 및 ∥ x ∥ 2 = a ⋅ a b + b ⋅ b a = a + b = n 이다. 이제 (5) 에 넣는다. 건너는 간선에서만 값이 생기고,
그때 차이는 b / a + a / b \sqrt{b/a} + \sqrt{a/b} b / a + a / b 이므로
x T L x = ∣ cut ∣ ( b a + a b ) 2 = ∣ cut ∣ ⋅ ( a + b ) 2 a b = n ∣ cut ∣ ( 1 a + 1 b ) \vv{x}^{\mathsf T}L\vv{x}
= \lvert \text{cut} \rvert \left(\sqrt{\tfrac{b}{a}} + \sqrt{\tfrac{a}{b}}\right)^{2}
= \lvert \text{cut} \rvert \cdot \frac{(a+b)^2}{ab}
= n \,\lvert \text{cut} \rvert \left(\frac{1}{a} + \frac{1}{b}\right) x T L x = ∣ cut ∣ ( a b + b a ) 2 = ∣ cut ∣ ⋅ ab ( a + b ) 2 = n ∣ cut ∣ ( a 1 + b 1 ) 가 된다. (28) 의 노름이 n n n 이었으니 레일리 몫은 n n n 이 약분되어
x T L x x T x = ∣ cut ∣ ( 1 a + 1 b ) = : RatioCut ( A , B ) \frac{\vv{x}^{\mathsf T}L\vv{x}}{\vv{x}^{\mathsf T}\vv{x}}
= \lvert \text{cut} \rvert \left(\frac{1}{a} + \frac{1}{b}\right)
=: \operatorname{RatioCut}(A, B) x T x x T L x = ∣ cut ∣ ( a 1 + b 1 ) =: RatioCut ( A , B ) (30) 의 오른쪽이 정체를 밝혀 준다. λ 2 \lambda_2 λ 2 를 구하는 것은 RatioCut 을
완화해 푸는 것이다. 절단이 작으면서 양쪽 마디 수 가 고를수록 값이 작아진다.
그런데 마디 수로 균형을 잡는 것이 늘 옳지는 않다. 차수가 제각각이면 간선 수 로
재는 편이 낫다. vol A = ∑ i ∈ A deg ( i ) \vol A = \sum_{i \in A}\deg(i) vol A = ∑ i ∈ A deg ( i ) 라 두고 분모를 바꾼 것이 Ncut 이다.
Ncut ( A , B ) = ∣ cut ∣ ( 1 vol A + 1 vol B ) \operatorname{Ncut}(A, B)
= \lvert \text{cut} \rvert \left(\frac{1}{\vol A} + \frac{1}{\vol B}\right) Ncut ( A , B ) = ∣ cut ∣ ( vol A 1 + vol B 1 ) (31) 의 목적함수를 완화해 푸는 것이 정규화 라플라시안 이다.
L sym = D − 1 / 2 L D − 1 / 2 , D = diag ( deg ( 1 ) , … , deg ( n ) ) L_{\text{sym}} = D^{-1/2} L D^{-1/2},
\qquad
D = \diag\!\left(\deg(1), \dots, \deg(n)\right) L sym = D − 1/2 L D − 1/2 , D = diag ( deg ( 1 ) , … , deg ( n ) ) (32) 의 행렬도 대칭이고 준정부호이므로 지금까지의 이야기가
그대로 통한다. y = D 1 / 2 x \vv{y} = D^{1/2}\vv{x} y = D 1/2 x 로 바꿔 놓으면 무엇이 달라졌는지 보인다.
(33) 에서 차수가 큰 노드는 분모가 커서 덜 어긋난 것으로
세어진다. 그래서 허브 하나가 절단을 좌우하지 못한다.
6. 자주 하는 오해 ¶ ① 라플라시안은 인접행렬이다.
아니다. L11의 인접행렬은 이어져 있으면 1, 아니면 0인 n × n n \times n n × n 행렬이다.
라플라시안은 L = D − W L = D - W L = D − W 로, 대각에 차수가 들어가고 비대각의 부호가 음수 다.
그 차이 때문에 행의 합이 0이 되고, 그래서 λ 1 = 0 \lambda_1 = 0 λ 1 = 0 이 나온다.
② λ 2 \lambda_2 λ 2 가 작으면 좋은 그래프다.
좋고 나쁨의 문제가 아니다. λ 2 \lambda_2 λ 2 가 작다는 것은 끊어지기 쉽다 는 뜻이다.
통신망이라면 나쁜 소식이고, 군집을 찾고 싶다면 좋은 소식이다.
③ 부호로 자르는 것이 최적 절단이다.
아니다. (24) 의 문제는 NP-어렵고, 피들러 절단은 그것을 완화해 푼 것이다.
대개 아주 좋지만 최적이라는 보장은 없다. 실제로 이 강의의 큰 예제에서는
참 분할을 정확히 찾았지만, 그것이 늘 그렇다는 뜻은 아니다.
④ 0을 기준으로 잘라야 한다.
그럴 필요 없다. 피들러 벡터의 성분을 정렬해 놓고 어디를 잘라도 후보 분할이 된다.
n − 1 n-1 n − 1 개의 후보를 전부 재 보고 가장 좋은 것을 고르는 방법을 흔히 쓴다.
0으로 자르는 것은 가장 단순한 규약일 뿐이다.
⑤ 고유벡터의 부호가 정해져 있다.
아니다. f \vv{f} f 가 고유벡터면 − f -\vv{f} − f 도 고유벡터다(L21).
그래서 어느 쪽이 "1번 덩어리"인지는 소프트웨어 마음이다.
분할은 같고 이름만 바뀐다.
⑥ 라플라시안은 대칭이니 언제나 대각화된다 — 그러니 조건이 좋다.
대각화는 되지만 조건이 좋다는 것은 다른 이야기다. λ 2 \lambda_2 λ 2 와 λ 3 \lambda_3 λ 3 이
가까우면 피들러 벡터 자체가 불안정해진다. 두 고유벡터가 만드는 평면은 잘 정해져도
그 안에서 어느 방향인지는 흔들린다. 보강 2의 고윳값 조건수 이야기가 여기서도 산다.
마치며... ¶ 이번 글에서는 L12에서 만들어 놓고 이름만 붙였던 행렬을 끝까지 따라갔다.
x T L x = ∑ ( i , j ) ∈ E ( x i − x j ) 2 \vv{x}^{\mathsf T}L\vv{x} = \sum_{(i,j)\in E}(x_i-x_j)^2 x T L x = ∑ ( i , j ) ∈ E ( x i − x j ) 2 이다.
L12는 이 한 줄 앞에서 멈췄다. 이 식 하나가 라플라시안의 모든 성질을 준다.
그래서 L L L 은 준정부호이고(L27), 대칭이라 스펙트럼 정리가 통하며(L25),
상수벡터가 언제나 영공간에 있다.
영공간의 차원이 연결 성분의 개수다. 다리를 끊으면 0이 하나 는다.
λ 2 \lambda_2 λ 2 는 "얼마나 붙어 있는가"를 재고, 그 고유벡터의 부호가 그래프를 가른다.
그 절단이 왜 좋은가 하면, ± 1 \pm1 ± 1 벡터에서 x T L x \vv{x}^{\mathsf T}L\vv{x} x T L x 가
절단 크기의 4배이기 때문이다. 어려운 이산 문제를 연속 문제로 완화한 것 이다.
고윳값이 시간의 흐름을 예측하고(L23), 확률의 정착점을 알려주고(L24),
이제는 그래프를 자르는 선 까지 알려준다.
그리고 여기서 끝난다 ¶ 서른네 편의 본편과 세 편의 보강편이 지났다.
A x = b A\vv{x} = \vv{b} A x = b 라는 방정식 하나에서 시작했다. 푸는 법을 배웠고, 해가 사는 공간의
모양을 배웠고, 해가 없을 때 가장 가까운 답을 찾는 법을 배웠다. 그다음 방향을 돌려
행렬 자체를 들여다보았다. 변하지 않는 방향을 찾았고, 시간의 흐름을 예측했고,
조건 없이 쪼갤 수 있는 도구에 닿았다. 마지막에는 그 도구를 들고 밖으로 나가
자료를 줄이고, 계산이 무너지는 자리를 재고, 그래프를 잘랐다.
돌아보면 같은 문장이 계속 나왔다.
좋은 기저를 고르면 어려운 문제가 쉬워진다. 대각화가 그랬고, 푸리에가 그랬고,
DCT가 그랬고, SVD가 그랬고, 방금 본 피들러 벡터가 그랬다.
존재하는 것과 손에 쥘 수 있는 것은 다르다. 크래머 공식도, 여인수 전개도,
조르당 형도, 정규방정식도, 공분산행렬도 종이 위에서는 옳았다.
조건이 없는 도구가 가장 강하다. 그래서 이 책의 후반부는 조건을 하나씩
버리는 이야기였고, 마지막에 아무 조건도 없는 분해에 닿았다.
이제 길이 여러 갈래로 갈라진다. 최적화로, 함수해석으로, 확률과 통계로, 미분기하로.
어느 길로 가든 손에 쥔 다섯 개의 분해와 네 부분공간의 그림은 계속 쓰이게 될 것이다.
긴 여정에 함께해 주어 고맙습니다.
이번 글의 내용을 파이썬으로 확인해 보려면 보강 3 실습 노트북 으로
넘어가면 된다. 이차형식이 정말 차이 제곱의 합인지 재 보고, 다리를 끊어 가며 0인
고윳값이 늘어나는 것을 보고, 60개짜리 그래프를 피들러 벡터로 잘라 무작위 5000개와
겨뤄 볼 수 있다.