Lecture 24. 마코브 행렬 Markov Matrices — 서술
성분이 모두 음이 아니고 각 열의 합이 1인 행렬을 마코브 행렬 이라 한다. 조건이 둘뿐이고
둘 다 대단해 보이지 않는다. 그런데 이 둘만으로 다음이 따라 나온다.
첫째, 고윳값 1이 반드시 존재한다. 둘째, 나머지 고윳값의 절댓값은 1을 넘지 못한다.
L22에서 우리는 A k A^k A k 의 운명이 고윳값의 절댓값으로 결정된다는 것을 배웠다. 단위원 안쪽은
죽고 바깥쪽은 폭발하며 원 위의 것만 살아남는다. 그렇다면 위의 두 사실을 합치면 결론이
저절로 나온다. 절댓값이 1보다 작은 것들은 전부 사라지고 고윳값 1의 방향만 살아남는다.
어디서 출발하든 결국 한 곳으로 모인다는 뜻이다. 이것이 마코브 과정의 정상상태이며,
구글의 페이지랭크가 작동하는 원리이기도 하다.
1. 두 조건과 그 뜻 ¶ 먼저 말을 정하자.
두 조건 모두 성분에 대한 조건이라 눈으로 확인할 수 있다. 그런데 왜 하필 열 의 합인가.
열의 합이 1이어야 하는 이유 ¶ 마코브 행렬을 쓰는 목적은 확률분포를 한 걸음 앞으로 밀어 보내는 것이다. 그러니
확률벡터에 곱했을 때 다시 확률벡터가 나와야 한다. 두 조건이 정확히 그것을 보장한다.
p \vv{p} p 가 확률벡터일 때 A p A\vv{p} A p 를 살펴보자. 확률벡터가 되려면 둘을 확인해야 한다.
첫째, 성분이 음이 아닌가. A A A 의 성분도 p \vv{p} p 의 성분도 음이 아니므로,
그것들을 곱하고 더한 A p A\vv{p} A p 의 성분도 음이 아니다. 첫 번째 조건이 여기에 쓰인다.
둘째, 성분의 합이 1인가. 성분의 합은 모든 성분이 1인 행벡터를 왼쪽에 곱한 것이다.
그 행벡터를 1 T \vv{1}^{\mathsf T} 1 T 라 쓰자.
( A p 의 성분의 합 ) = 1 T ( A p ) = ( 1 T A ) p (A\vv{p} \text{ 의 성분의 합})
= \vv{1}^{\mathsf T}\left(A\vv{p}\right)
= \left(\vv{1}^{\mathsf T}A\right)\vv{p} ( A p 의 성분의 합 ) = 1 T ( A p ) = ( 1 T A ) p 가운데에서 오른쪽으로 갈 때 결합법칙을 썼다. 괄호를 옮긴 것이 이 절의 핵심이다.
그런데 1 T A \vv{1}^{\mathsf T}A 1 T A 는 무엇인가. j j j 번째 성분이 A A A 의 j j j 열의 합이다.
( 1 T A ) j = a 1 j + a 2 j + ⋯ + a n j = 1 ⟹ 1 T A = 1 T \left(\vv{1}^{\mathsf T}A\right)_j = a_{1j} + a_{2j} + \cdots + a_{nj} = 1
\qquad\Longrightarrow\qquad
\vv{1}^{\mathsf T}A = \vv{1}^{\mathsf T} ( 1 T A ) j = a 1 j + a 2 j + ⋯ + a nj = 1 ⟹ 1 T A = 1 T 열의 합이 1이라는 조건이 이 한 줄로 압축된다. 이것을 (3) 에 넣으면
1 T ( A p ) = 1 T p = 1 \vv{1}^{\mathsf T}\left(A\vv{p}\right) = \vv{1}^{\mathsf T}\vv{p} = 1 1 T ( A p ) = 1 T p = 1 이다. 합이 1로 보존된다.
이번 강의의 앵커 ¶ 두 지역 사이의 인구 이동을 보자. 해마다 지역 1에 있던 사람의 10%가 지역 2로 가고,
지역 2에 있던 사람의 20%가 지역 1로 온다.
A = [ 0.9 0.2 0.1 0.8 ] A = \begin{bmatrix} 0.9 & 0.2 \\ 0.1 & 0.8 \end{bmatrix} A = [ 0.9 0.1 0.2 0.8 ] 열을 읽는 법 이 중요하다. j j j 열은 "지금 j j j 에 있는 사람이 어디로 흩어지는가"이다.
1열 ( 0.9 , 0.1 ) (0.9, 0.1) ( 0.9 , 0.1 ) 은 지역 1의 사람 중 90%가 남고 10%가 지역 2로 간다는 뜻이고,
그래서 열의 합이 1이다. 성분 a i j a_{ij} a ij 는 j j j 에서 i i i 로 갈 확률 이다. 첨자의 순서가
거꾸로라는 점을 놓치기 쉽다.
Figure 1: 왼쪽이 모형이고 오른쪽이 답이다. 두 초기 상태가 같은 곳에 도착한다.
2. 고윳값 1은 우연이 아니다 ¶ A A A 의 고윳값을 실제로 구해 보면 1이 나온다. 앵커로 확인하자. L21의 검산 도구를 쓴다.
tr ( A ) = 0.9 + 0.8 = 1.7 , det A = 0.9 × 0.8 − 0.2 × 0.1 = 0.72 − 0.02 = 0.7 \operatorname{tr}(A) = 0.9 + 0.8 = 1.7,
\qquad
\det A = 0.9 \times 0.8 - 0.2 \times 0.1 = 0.72 - 0.02 = 0.7 tr ( A ) = 0.9 + 0.8 = 1.7 , det A = 0.9 × 0.8 − 0.2 × 0.1 = 0.72 − 0.02 = 0.7 λ 2 − 1.7 λ + 0.7 = 0 ⟹ ( λ − 1 ) ( λ − 0.7 ) = 0 \lambda^2 - 1.7\lambda + 0.7 = 0
\qquad\Longrightarrow\qquad
(\lambda - 1)(\lambda - 0.7) = 0 λ 2 − 1.7 λ + 0.7 = 0 ⟹ ( λ − 1 ) ( λ − 0.7 ) = 0 고윳값이 1과 0.7이다. 그런데 왜 하필 1인가. 숫자를 잘 골라서 우연히 나온 것인가.
아니다. 세 걸음이면 증명된다.
첫째 걸음 — 전치하면 행의 합이 1이다 ¶ (4) 의 식 1 T A = 1 T \vv{1}^{\mathsf T}A = \vv{1}^{\mathsf T} 1 T A = 1 T 를 전치하자.
곱을 전치하면 순서가 뒤집히고, 행벡터가 열벡터가 된다.
( 1 T A ) T = ( 1 T ) T ⟹ A T 1 = 1 \left(\vv{1}^{\mathsf T}A\right)^{\mathsf T} = \left(\vv{1}^{\mathsf T}\right)^{\mathsf T}
\qquad\Longrightarrow\qquad
A^{\mathsf T}\vv{1} = \vv{1} ( 1 T A ) T = ( 1 T ) T ⟹ A T 1 = 1 오른쪽 식을 다시 읽어 보자. A T A^{\mathsf T} A T 를 1 \vv{1} 1 에 곱했더니 1 \vv{1} 1 이 그대로
나왔다. 이것은 정확히 A T x = 1 ⋅ x A^{\mathsf T}\vv{x} = 1 \cdot \vv{x} A T x = 1 ⋅ x 의 꼴이다.
A T 는 고윳값 1 을 가지며, 그 고유벡터가 1 이다 A^{\mathsf T} \text{ 는 고윳값 } 1 \text{ 을 가지며, 그 고유벡터가 } \vv{1} \text{ 이다} A T 는 고윳값 1 을 가지며 , 그 고유벡터가 1 이다 당연한 이야기이다. A T A^{\mathsf T} A T 의 행 의 합이 1이라는 말은 각 행을 1 \vv{1} 1 과
내적하면 1이 나온다는 말이고, 그것이 곧 A T 1 = 1 A^{\mathsf T}\vv{1} = \vv{1} A T 1 = 1 이다.
둘째 걸음 — A A A 와 A T A^{\mathsf T} A T 는 고윳값이 같다 ¶ 우리가 알고 싶은 것은 A A A 의 고윳값이지 A T A^{\mathsf T} A T 의 고윳값이 아니다. 다행히 둘이 같다.
특성다항식을 나란히 놓아 보자. 먼저 A − λ I A - \lambda I A − λ I 를 전치하면 무엇이 되는가.
전치는 항별로 들어가고 I T = I I^{\mathsf T} = I I T = I 이므로
( A − λ I ) T = A T − λ I T = A T − λ I \left(A - \lambda I\right)^{\mathsf T} = A^{\mathsf T} - \lambda I^{\mathsf T}
= A^{\mathsf T} - \lambda I ( A − λ I ) T = A T − λ I T = A T − λ I 이다. 이제 L18의 det M T = det M \det M^{\mathsf T} = \det M det M T = det M 을 M = A − λ I M = A - \lambda I M = A − λ I 에 쓰자.
det ( A − λ I ) = det ( ( A − λ I ) T ) = det ( A T − λ I ) \det(A - \lambda I)
= \det\left(\left(A - \lambda I\right)^{\mathsf T}\right)
= \det\left(A^{\mathsf T} - \lambda I\right) det ( A − λ I ) = det ( ( A − λ I ) T ) = det ( A T − λ I ) 두 특성다항식이 글자 하나 다르지 않다. 다항식이 같으면 근도 같고 중복도까지 같다.
그러므로 A A A 와 A T A^{\mathsf T} A T 는 고윳값이 완전히 같다.
셋째 걸음 — 결론 ¶ A T A^{\mathsf T} A T 가 고윳값 1을 가지고, A A A 는 A T A^{\mathsf T} A T 와 고윳값이 같다. 따라서
A A A 도 고윳값 1을 가진다.
Figure 2: 세 걸음을 한 장에 담았다. 아래쪽의 경고가 특히 중요하다.
다른 길로도 갈 수 있다 ¶ 같은 결론에 더 짧게 도달하는 길도 있다. 고윳값 1이 있다는 말은 A − I A - I A − I 가 특이하다는
말이다. A − I A - I A − I 의 열의 합을 보자. A A A 의 열의 합이 1이고 I I I 의 열의 합도 1이므로
차의 열의 합은 0이다.
1 T ( A − I ) = 1 T A − 1 T = 1 T − 1 T = 0 T \vv{1}^{\mathsf T}(A - I) = \vv{1}^{\mathsf T}A - \vv{1}^{\mathsf T}
= \vv{1}^{\mathsf T} - \vv{1}^{\mathsf T} = \vv{0}^{\mathsf T} 1 T ( A − I ) = 1 T A − 1 T = 1 T − 1 T = 0 T 왼쪽을 읽으면 A − I A - I A − I 의 행들을 전부 더하면 영벡터가 된다 는 뜻이다. 계수가 전부 1인
자명하지 않은 결합이 0이 되었으니 행이 종속이고, 따라서 A − I A - I A − I 는 특이하다.
det ( A − I ) = 0 ⟹ λ = 1 이 고윳값 \det(A - I) = 0
\qquad\Longrightarrow\qquad
\lambda = 1 \text{ 이 고윳값} det ( A − I ) = 0 ⟹ λ = 1 이 고윳값 앵커에서 눈으로 확인해 보자. A − I = [ − 0.1 0.2 0.1 − 0.2 ] A - I = \begin{bmatrix} -0.1 & 0.2 \\ 0.1 & -0.2\end{bmatrix} A − I = [ − 0.1 0.1 0.2 − 0.2 ]
이고 두 행을 더하면 영벡터이다.
고윳값은 같아도 고유벡터는 다르다 ¶ 여기가 이 강의에서 가장 흔한 오해가 생기는 자리이다.
1 \vv{1} 1 은 A T A^{\mathsf T} A T 의 고유벡터이지 A A A 의 고유벡터가 아니다.
(12) 의 등식이 보장한 것은 고윳값이 같다는 것뿐이고, 고유벡터에 대해서는
아무 말도 하지 않았다. 앵커로 확인하자.
A T [ 1 1 ] = [ 1 1 ] 그러나 A [ 1 1 ] = [ 1.1 0.9 ] ≠ [ 1 1 ] A^{\mathsf T}\begin{bmatrix} 1 \\ 1 \end{bmatrix}
= \begin{bmatrix} 1 \\ 1 \end{bmatrix}
\qquad\text{그러나}\qquad
A\begin{bmatrix} 1 \\ 1 \end{bmatrix}
= \begin{bmatrix} 1.1 \\ 0.9 \end{bmatrix}
\neq \begin{bmatrix} 1 \\ 1 \end{bmatrix} A T [ 1 1 ] = [ 1 1 ] 그러나 A [ 1 1 ] = [ 1.1 0.9 ] = [ 1 1 ] 정상상태를 ( 1 , 1 , … , 1 ) (1, 1, \dots, 1) ( 1 , 1 , … , 1 ) 로 착각하지 말 것. 그것은 A T A^{\mathsf T} A T 의 고유벡터이다.
A A A 의 고유벡터는 따로 구해야 하고, 그것이 우리가 찾는 정상상태이다.
앵커에서 A A A 의 λ = 1 \lambda = 1 λ = 1 고유벡터를 실제로 구해 보자. 영공간을 구하면 된다.
A − I = [ − 0.1 0.2 0.1 − 0.2 ] ⟹ − 0.1 x 1 + 0.2 x 2 = 0 ⟹ x 1 = 2 x 2 ⟹ x 1 = [ 2 1 ] A - I = \begin{bmatrix} -0.1 & 0.2 \\ 0.1 & -0.2 \end{bmatrix}
\;\Longrightarrow\;
-0.1x_1 + 0.2x_2 = 0
\;\Longrightarrow\;
x_1 = 2x_2
\;\Longrightarrow\;
\vv{x}_1 = \begin{bmatrix} 2 \\ 1 \end{bmatrix} A − I = [ − 0.1 0.1 0.2 − 0.2 ] ⟹ − 0.1 x 1 + 0.2 x 2 = 0 ⟹ x 1 = 2 x 2 ⟹ x 1 = [ 2 1 ] λ = 0.7 \lambda = 0.7 λ = 0.7 쪽도 구해 두자.
A − 0.7 I = [ 0.2 0.2 0.1 0.1 ] ⟹ x 1 + x 2 = 0 ⟹ x 2 = [ 1 − 1 ] A - 0.7I = \begin{bmatrix} 0.2 & 0.2 \\ 0.1 & 0.1 \end{bmatrix}
\;\Longrightarrow\;
x_1 + x_2 = 0
\;\Longrightarrow\;
\vv{x}_2 = \begin{bmatrix} 1 \\ -1 \end{bmatrix} A − 0.7 I = [ 0.2 0.1 0.2 0.1 ] ⟹ x 1 + x 2 = 0 ⟹ x 2 = [ 1 − 1 ] 3. 나머지는 1을 넘지 못한다 ¶ 두 번째 사실을 증명하자. 마코브 행렬의 모든 고윳값에 대해 ∣ λ ∣ ≤ 1 |\lambda| \le 1 ∣ λ ∣ ≤ 1 이다.
2절에서 A A A 와 A T A^{\mathsf T} A T 의 고윳값이 같음을 보였으니, 다루기 편한
A T A^{\mathsf T} A T 쪽에서 증명하면 된다. A T A^{\mathsf T} A T 는 행 의 합이 1이라 한 행씩
따로 보기 좋다.
A T y = λ y A^{\mathsf T}\vv{y} = \lambda\vv{y} A T y = λ y 이고 y ≠ 0 \vv{y} \neq \vv{0} y = 0 이라 하자.
y \vv{y} y 의 성분 중 절댓값이 가장 큰 것 을 골라 그 자리를 m m m 이라 하자.
y ≠ 0 \vv{y} \neq \vv{0} y = 0 이므로 ∣ y m ∣ > 0 |y_m| > 0 ∣ y m ∣ > 0 이다.
m m m 번째 줄만 꺼내 쓰면 이렇다.
λ y m = ∑ j ( A T ) m j y j \lambda\, y_m = \sum_{j} \left(A^{\mathsf T}\right)_{mj} y_j λ y m = j ∑ ( A T ) mj y j 양변의 절댓값을 재고 오른쪽에 삼각부등식을 쓴다. 성분이 음이 아니라
∣ ( A T ) m j ∣ = ( A T ) m j \left|\left(A^{\mathsf T}\right)_{mj}\right| = \left(A^{\mathsf T}\right)_{mj} ∣ ∣ ( A T ) mj ∣ ∣ = ( A T ) mj 이다.
∣ λ ∣ ∣ y m ∣ = ∣ ∑ j ( A T ) m j y j ∣ ≤ ∑ j ( A T ) m j ∣ y j ∣ |\lambda|\,|y_m|
= \left|\sum_{j} \left(A^{\mathsf T}\right)_{mj} y_j\right|
\le \sum_{j} \left(A^{\mathsf T}\right)_{mj}\,|y_j| ∣ λ ∣ ∣ y m ∣ = ∣ ∣ j ∑ ( A T ) mj y j ∣ ∣ ≤ j ∑ ( A T ) mj ∣ y j ∣ 이제 ∣ y j ∣ ≤ ∣ y m ∣ |y_j| \le |y_m| ∣ y j ∣ ≤ ∣ y m ∣ 이라는 사실을 쓴다. m m m 을 그렇게 골랐기 때문이다.
≤ ∑ j ( A T ) m j ∣ y m ∣ = ∣ y m ∣ ∑ j ( A T ) m j = ∣ y m ∣ ⋅ 1 \le \sum_{j} \left(A^{\mathsf T}\right)_{mj}\,|y_m|
= |y_m| \sum_{j} \left(A^{\mathsf T}\right)_{mj}
= |y_m| \cdot 1 ≤ j ∑ ( A T ) mj ∣ y m ∣ = ∣ y m ∣ j ∑ ( A T ) mj = ∣ y m ∣ ⋅ 1 마지막 등호에서 행의 합이 1 이라는 조건이 쓰였다. 양 끝을 이으면
∣ λ ∣ ∣ y m ∣ ≤ ∣ y m ∣ |\lambda|\,|y_m| \le |y_m| ∣ λ ∣ ∣ y m ∣ ≤ ∣ y m ∣ 이고, ∣ y m ∣ > 0 |y_m| > 0 ∣ y m ∣ > 0 이므로 나눌 수 있다.
∣ λ ∣ ≤ 1 |\lambda| \le 1 ∣ λ ∣ ≤ 1 두 사실을 합치면 그림이 완성된다. 고윳값 하나는 정확히 1이고 나머지는 단위원을 벗어나지
못한다. L22의 언어로는 폭발하는 방향이 없다 는 뜻이다.
4. 다른 고유벡터는 성분의 합이 0이다 ¶ 정상상태로 가는 마지막 재료가 하나 남았다. 조금 뜻밖의 사실이다.
A x = λ x A\vv{x} = \lambda\vv{x} A x = λ x 이고 λ ≠ 1 \lambda \neq 1 λ = 1 이라 하자. 양변의 성분의 합을 재 보자.
곧 1 T \vv{1}^{\mathsf T} 1 T 를 왼쪽에 곱한다.
오른쪽부터 하면 1 T ( λ x ) = λ ( 1 T x ) \vv{1}^{\mathsf T}(\lambda\vv{x}) = \lambda\left(\vv{1}^{\mathsf T}\vv{x}\right) 1 T ( λ x ) = λ ( 1 T x )
이다. 왼쪽은 (4) 의 식을 쓰면 A A A 가 통째로 사라진다.
1 T ( A x ) = ( 1 T A ) x = 1 T x \vv{1}^{\mathsf T}\left(A\vv{x}\right)
= \left(\vv{1}^{\mathsf T}A\right)\vv{x}
= \vv{1}^{\mathsf T}\vv{x} 1 T ( A x ) = ( 1 T A ) x = 1 T x 두 결과가 같아야 하므로
1 T x = λ ( 1 T x ) ⟹ ( 1 − λ ) ( 1 T x ) = 0 \vv{1}^{\mathsf T}\vv{x} = \lambda\left(\vv{1}^{\mathsf T}\vv{x}\right)
\qquad\Longrightarrow\qquad
(1 - \lambda)\left(\vv{1}^{\mathsf T}\vv{x}\right) = 0 1 T x = λ ( 1 T x ) ⟹ ( 1 − λ ) ( 1 T x ) = 0 곱이 0이니 둘 중 하나는 0이다. λ ≠ 1 \lambda \neq 1 λ = 1 이라 했으므로 1 − λ ≠ 0 1 - \lambda \neq 0 1 − λ = 0 이고,
따라서 나머지가 0이어야 한다.
1 T x = 0 ( λ ≠ 1 인 모든 고유벡터에 대해 ) \vv{1}^{\mathsf T}\vv{x} = 0
\qquad (\lambda \neq 1 \text{ 인 모든 고유벡터에 대해}) 1 T x = 0 ( λ = 1 인 모든 고유벡터에 대해 ) 앵커에서 확인된다. x 2 = ( 1 , − 1 ) \vv{x}_2 = (1, -1) x 2 = ( 1 , − 1 ) 의 성분의 합이 1 + ( − 1 ) = 0 1 + (-1) = 0 1 + ( − 1 ) = 0 이다.
5. 어디서 출발하든 같은 곳으로 ¶ 이제 조각이 다 모였다. u k + 1 = A u k \vv{u}_{k+1} = A\vv{u}_k u k + 1 = A u k 이고 u 0 \vv{u}_0 u 0 이 확률벡터라 하자.
L22의 전개를 그대로 쓴다.
u k = A k u 0 = c 1 ⋅ 1 k ⋅ x 1 + c 2 λ 2 k x 2 + ⋯ + c n λ n k x n \vv{u}_k = A^k\vv{u}_0
= c_1 \cdot 1^k \cdot \vv{x}_1
+ c_2\lambda_2^k\,\vv{x}_2 + \cdots + c_n\lambda_n^k\,\vv{x}_n u k = A k u 0 = c 1 ⋅ 1 k ⋅ x 1 + c 2 λ 2 k x 2 + ⋯ + c n λ n k x n 1 k = 1 1^k = 1 1 k = 1 이므로 첫 항은 k k k 와 무관하게 c 1 x 1 c_1\vv{x}_1 c 1 x 1 로 붙박여 있다. 그리고 나머지는
∣ λ i ∣ < 1 |\lambda_i| < 1 ∣ λ i ∣ < 1 이면 죽는다.
u k ⟶ c 1 x 1 \vv{u}_k \longrightarrow c_1\vv{x}_1 u k ⟶ c 1 x 1 남은 물음은 c 1 c_1 c 1 이 얼마냐이다. 놀랍게도 초기 상태와 무관하게 정해진다.
c 1 c_1 c 1 은 언제나 1이다¶ x 1 \vv{x}_1 x 1 을 성분의 합이 1이 되도록 정규화해 두자. 고유벡터는 스케일이 자유이므로
그렇게 골라도 된다. 앵커에서는 ( 2 , 1 ) (2,1) ( 2 , 1 ) 을 3으로 나눈 ( 2 3 , 1 3 ) \left(\tfrac23, \tfrac13\right) ( 3 2 , 3 1 ) 이다.
이제 (25) 에 k = 0 k = 0 k = 0 을 넣고 양변의 성분의 합을 재자.
1 T u 0 = c 1 ( 1 T x 1 ) + c 2 ( 1 T x 2 ) + ⋯ + c n ( 1 T x n ) \vv{1}^{\mathsf T}\vv{u}_0
= c_1\left(\vv{1}^{\mathsf T}\vv{x}_1\right)
+ c_2\left(\vv{1}^{\mathsf T}\vv{x}_2\right) + \cdots
+ c_n\left(\vv{1}^{\mathsf T}\vv{x}_n\right) 1 T u 0 = c 1 ( 1 T x 1 ) + c 2 ( 1 T x 2 ) + ⋯ + c n ( 1 T x n ) 여기서 4절이 일한다. i ≥ 2 i \ge 2 i ≥ 2 인 항은 1 T x i = 0 \vv{1}^{\mathsf T}\vv{x}_i = 0 1 T x i = 0 이라
통째로 사라진다. 그리고 정규화 덕분에 1 T x 1 = 1 \vv{1}^{\mathsf T}\vv{x}_1 = 1 1 T x 1 = 1 이다.
1 T u 0 ⏟ = 1 = c 1 ⋅ 1 + 0 + ⋯ + 0 ⟹ c 1 = 1 \underbrace{\vv{1}^{\mathsf T}\vv{u}_0}_{= \,1} = c_1 \cdot 1 + 0 + \cdots + 0
\qquad\Longrightarrow\qquad
c_1 = 1 = 1 1 T u 0 = c 1 ⋅ 1 + 0 + ⋯ + 0 ⟹ c 1 = 1 왼쪽이 1인 것은 u 0 \vv{u}_0 u 0 이 확률벡터이기 때문이다. 결론을 (26) 에 넣자.
u k ⟶ x 1 \vv{u}_k \longrightarrow \vv{x}_1 u k ⟶ x 1 어디서 출발하는가는 중요하지 않다. 무엇이 살아남는가만 중요하다.
초기 상태 u 0 \vv{u}_0 u 0 은 c 2 , … , c n c_2, \dots, c_n c 2 , … , c n 만 바꾸는데, 그것들은 어차피 죽을 항의
계수이다. 살아남는 항의 계수 c 1 c_1 c 1 은 "확률벡터"라는 조건 하나로 이미 1로 못박혀 있다.
x 1 \vv{x}_1 x 1 을 정상상태 라 한다. A x 1 = x 1 A\vv{x}_1 = \vv{x}_1 A x 1 = x 1 이므로 한 걸음 가도 그대로이고,
성분의 합이 1이므로 그 자체가 확률벡터이다.
앵커를 끝까지 ¶ u 0 = ( 1 , 0 ) \vv{u}_0 = (1, 0) u 0 = ( 1 , 0 ) 에서 출발한다고 하자. 모두가 지역 1에 있다.
c 1 = 1 c_1 = 1 c 1 = 1 인 것은 이미 알므로 c 2 c_2 c 2 만 구하면 된다.
[ 1 0 ] = 1 ⋅ [ 2 / 3 1 / 3 ] + c 2 [ 1 − 1 ] ⟹ 2 3 + c 2 = 1 ⟹ c 2 = 1 3 \begin{bmatrix} 1 \\ 0 \end{bmatrix}
= 1 \cdot \begin{bmatrix} 2/3 \\ 1/3 \end{bmatrix}
+ c_2\begin{bmatrix} 1 \\ -1 \end{bmatrix}
\qquad\Longrightarrow\qquad
\tfrac23 + c_2 = 1
\qquad\Longrightarrow\qquad
c_2 = \tfrac13 [ 1 0 ] = 1 ⋅ [ 2/3 1/3 ] + c 2 [ 1 − 1 ] ⟹ 3 2 + c 2 = 1 ⟹ c 2 = 3 1 u k = [ 2 / 3 1 / 3 ] + 1 3 ( 0.7 ) k [ 1 − 1 ] \vv{u}_k
= \begin{bmatrix} 2/3 \\ 1/3 \end{bmatrix}
+ \frac13 (0.7)^k \begin{bmatrix} 1 \\ -1 \end{bmatrix} u k = [ 2/3 1/3 ] + 3 1 ( 0.7 ) k [ 1 − 1 ] 몇 걸음 적어 보자.
k k k 0 1 2 3 5 10 ∞ \infty ∞ u 1 u_1 u 1 1 0.9 0.83 0.781 0.7227 0.6784 2 / 3 2/3 2/3 u 2 u_2 u 2 0 0.1 0.17 0.219 0.2773 0.3216 1 / 3 1/3 1/3 합 1 1 1 1 1 1 1
총량은 처음부터 끝까지 1이고, 배분만 바뀐다. 그리고 최종 배분은 초기 상태와 상관없이
( 2 3 , 1 3 ) \left(\tfrac23, \tfrac13\right) ( 3 2 , 3 1 ) 이다. Figure 1 의 오른쪽에서 점선으로 시작한
( 0 , 1 ) (0,1) ( 0 , 1 ) 도 같은 곳에 닿는 것을 볼 수 있다.
상태가 셋이면 ¶ n = 3 n = 3 n = 3 이면 확률벡터가 사는 곳이 삼각형이다. 세 성분이 음이 아니고 합이 1인 점들을
모으면 세 꼭짓점이 ( 1 , 0 , 0 ) (1,0,0) ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) (0,1,0) ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) (0,0,1) ( 0 , 0 , 1 ) 인 삼각형이 되기 때문이다.
이것을 심플렉스 라 한다.
P = [ 0.8 0.1 0.1 0.1 0.7 0.3 0.1 0.2 0.6 ] P = \begin{bmatrix}
0.8 & 0.1 & 0.1 \\
0.1 & 0.7 & 0.3 \\
0.1 & 0.2 & 0.6
\end{bmatrix} P = ⎣ ⎡ 0.8 0.1 0.1 0.1 0.7 0.2 0.1 0.3 0.6 ⎦ ⎤ 세 열이 모두 합이 1이다. 고윳값을 구하면 1 , 0.7 , 0.4 1, 0.7, 0.4 1 , 0.7 , 0.4 이고, 정상상태는
( 1 3 , 7 18 , 5 18 ) \left(\tfrac13, \tfrac{7}{18}, \tfrac{5}{18}\right) ( 3 1 , 18 7 , 18 5 ) 이다.
Figure 3: 아홉 개의 서로 다른 출발점에서 시작한 궤적이 모두 같은 빨간 점으로 모인다.
삼각형 밖으로 나가는 궤적은 하나도 없다. 1절에서 확인한 대로 마코브 행렬이
확률벡터를 확률벡터로 보내기 때문이다.
수렴이 얼마나 빠른가 ¶ (31) 에서 오차가 ( 0.7 ) k (0.7)^k ( 0.7 ) k 로 줄어든다. 일반적으로는 두 번째로 큰
고윳값의 절댓값 ∣ λ 2 ∣ |\lambda_2| ∣ λ 2 ∣ 가 속도를 정한다. L22의 지배 고윳값 이야기 그대로이다.
∥ u k − x 1 ∥ ∼ ∣ λ 2 ∣ k \left\|\vv{u}_k - \vv{x}_1\right\| \sim \left|\lambda_2\right|^k ∥ u k − x 1 ∥ ∼ ∣ λ 2 ∣ k ∣ λ 2 ∣ |\lambda_2| ∣ λ 2 ∣ 가 0에 가까우면 몇 걸음 만에 평형에 닿고, 1에 가까우면 한참 걸린다.
이 걸음 수를 혼합 시간 이라 부른다. 네트워크로 비유하면 ∣ λ 2 ∣ |\lambda_2| ∣ λ 2 ∣ 가 1에 가깝다는
것은 어딘가에 병목이 있어 확률이 잘 흘러 다니지 못한다 는 뜻이다.
6. 수렴하지 않는 경우 ¶ 앞 절의 결론에는 "나머지가 전부 단위원 안쪽"이라는 전제가 있었다. 그 전제가 깨지면
어떻게 되는지 두 가지를 보자.
진동하는 경우 ¶ 두 상태를 반드시 번갈아 오가는 사슬을 생각하자.
B = [ 0 1 1 0 ] B = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} B = [ 0 1 1 0 ] 성분이 음이 아니고 열의 합이 1이니 어엿한 마코브 행렬이다. 고윳값을 구해 보자.
tr ( B ) = 0 \operatorname{tr}(B) = 0 tr ( B ) = 0 이고 det B = − 1 \det B = -1 det B = − 1 이므로
λ 2 − 1 = 0 ⟹ λ = 1 , − 1 \lambda^2 - 1 = 0
\qquad\Longrightarrow\qquad
\lambda = 1, \; -1 λ 2 − 1 = 0 ⟹ λ = 1 , − 1 이다. ∣ λ 2 ∣ = ∣ − 1 ∣ = 1 |\lambda_2| = |-1| = 1 ∣ λ 2 ∣ = ∣ − 1∣ = 1 이라 죽지 않는다. (21) 의 부등식은
∣ λ ∣ ≤ 1 |\lambda| \le 1 ∣ λ ∣ ≤ 1 이었지 < 1 < 1 < 1 이 아니었다는 점이 여기서 드러난다.
u 0 = ( 1 , 0 ) \vv{u}_0 = (1, 0) u 0 = ( 1 , 0 ) 에서 출발하면 ( 0 , 1 ) , ( 1 , 0 ) , ( 0 , 1 ) , … (0,1), (1,0), (0,1), \dots ( 0 , 1 ) , ( 1 , 0 ) , ( 0 , 1 ) , … 을 영원히 되풀이한다.
정상상태 ( 1 2 , 1 2 ) \left(\tfrac12, \tfrac12\right) ( 2 1 , 2 1 ) 은 존재하지만 도달하지 못한다.
Figure 4: λ = − 1 \lambda = -1 λ = − 1 도 단위원 위에 있어 죽지 않는다. 앵커의 0.7과 대조하면 차이가 분명하다.
B B B 에는 0인 성분이 있으므로 페론-프로베니우스의 전제가 깨져 있다. 그 전제가 그냥 붙은
장식이 아니었던 셈이다.
정상상태가 유일하지 않은 경우 ¶ A = I A = I A = I 를 보자. 열의 합이 1이고 성분이 음이 아니니 마코브 행렬이다. 그런데
I p = p I\vv{p} = \vv{p} I p = p 이므로 모든 확률벡터가 정상상태 이다. 고윳값 1이 n n n 번 중복된다.
뜻으로 읽으면 당연하다. I I I 는 아무도 이동하지 않는 세계이고, 서로 오갈 수 없는 지역들이
따로 노는 것이다. 어디서 출발했는지가 영원히 기억된다.
두 반례를 합치면 조건이 정리된다. 아무 데서 아무 데로든 몇 걸음 안에 갈 수 있고
(연결), 되돌아오는 걸음 수에 공통의 주기가 없어야 (비주기) 유일한 정상상태로 수렴한다.
성분이 전부 양수이면 한 걸음에 어디로든 갈 수 있으므로 두 조건이 한꺼번에 만족된다.
7. 응용 ¶ 인구 이동 ¶ 앵커가 그것이었다. 결론이 실용적이다. 장기적인 인구 배분은 초기 배분과 무관하며,
이동률의 비만으로 정해진다. 앵커에서 지역 1로 오는 비율이 0.2이고 나가는 비율이 0.1이라
비가 2대 1이었고, 정상상태가 정확히 ( 2 3 , 1 3 ) \left(\tfrac23, \tfrac13\right) ( 3 2 , 3 1 ) 이었다.
이것은 우연이 아니다. 정상상태에서는 흘러 나가는 만큼 흘러 들어온다.
0.1 × x 1 = 0.2 × x 2 ⟹ x 1 x 2 = 0.2 0.1 = 2 0.1 \times x_1 = 0.2 \times x_2
\qquad\Longrightarrow\qquad
\frac{x_1}{x_2} = \frac{0.2}{0.1} = 2 0.1 × x 1 = 0.2 × x 2 ⟹ x 2 x 1 = 0.1 0.2 = 2 A x = x A\vv{x} = \vv{x} A x = x 를 성분으로 풀어쓴 것이 바로 이 균형식이다.
페이지랭크 ¶ 웹 문서에 순위를 매기는 문제를 생각하자. 구글의 아이디어는 이것이다. 웹을 무작위로
떠도는 사람을 상상하고, 그 사람이 각 페이지에 머무는 시간의 비율을 순위로 삼는다.
페이지 j j j 에 링크가 d j d_j d j 개 있다면, 그 사람은 각 링크를 1 / d j 1/d_j 1/ d j 의 확률로 고른다.
j j j 열의 합은 d j d_j d j 개의 1 / d j 1/d_j 1/ d j 를 더한 것이라 1이다. 마코브 행렬이다.
그리고 우리가 원하는 순위는 정상상태 x 1 \vv{x}_1 x 1 이다.
그런데 실제 웹에서는 세 가지가 어긋난다.
막다른 페이지. 나가는 링크가 없으면 그 열이 통째로 0이라 열의 합이 1이 아니다.
갇힌 무리. 자기들끼리만 링크하는 무리가 있으면 확률이 그리로 빨려 들어가
6절의 I I I 처럼 정상상태가 유일하지 않게 된다.
주기. 링크 구조에 주기가 있으면 6절의 B B B 처럼 진동한다.
해결책이 감쇠 이다. 무작위 서퍼가 확률 1 − α 1 - \alpha 1 − α 로 링크를 무시하고 아무 페이지로나
순간이동 한다고 두는 것이다.
G = α A + ( 1 − α ) 1 n J ( J 는 성분이 전부 1인 n × n 행렬 ) G = \alpha A + (1 - \alpha)\,\frac{1}{n}J
\qquad (J \text{ 는 성분이 전부 1인 } n \times n \text{ 행렬}) G = α A + ( 1 − α ) n 1 J ( J 는 성분이 전부 1 인 n × n 행렬 ) G G G 도 마코브 행렬이다. 열의 합을 보면 α ⋅ 1 + ( 1 − α ) ⋅ 1 = 1 \alpha \cdot 1 + (1-\alpha) \cdot 1 = 1 α ⋅ 1 + ( 1 − α ) ⋅ 1 = 1 이다.
그리고 결정적으로 G G G 의 모든 성분이 양수 이다. 1 − α n > 0 \frac{1-\alpha}{n} > 0 n 1 − α > 0 이 모든 자리에
깔리기 때문이다. 페론-프로베니우스의 전제가 충족되어 정상상태가 유일해지고 수렴이 보장된다.
덤도 있다. 이렇게 만든 G G G 는
∣ λ 2 ( G ) ∣ ≤ α \left|\lambda_2(G)\right| \le \alpha ∣ λ 2 ( G ) ∣ ≤ α 를 만족한다는 것이 알려져 있다. 곧 감쇠 인자가 곧 수렴 속도 이다. α \alpha α 를 작게 하면
빨리 수렴하지만 링크 구조를 덜 반영하고, 1에 가깝게 하면 링크를 충실히 반영하지만
오래 걸린다. 구글이 처음 쓴 α = 0.85 \alpha = 0.85 α = 0.85 는 그 사이의 타협이다.
8. 열의 합 0과 열의 합 1 ¶ 지난 강의의 앵커를 다시 보자.
A 연속 = [ − 1 2 1 − 2 ] ( 열의 합이 0 ) A_{\text{연속}} = \begin{bmatrix} -1 & 2 \\ 1 & -2 \end{bmatrix}
\qquad (\text{열의 합이 } 0) A 연속 = [ − 1 1 2 − 2 ] ( 열의 합이 0 ) 그리고 이번 강의의 앵커이다.
A 이산 = [ 0.9 0.2 0.1 0.8 ] ( 열의 합이 1 ) A_{\text{이산}} = \begin{bmatrix} 0.9 & 0.2 \\ 0.1 & 0.8 \end{bmatrix}
\qquad (\text{열의 합이 } 1) A 이산 = [ 0.9 0.1 0.2 0.8 ] ( 열의 합이 1 ) 닮았다고 느꼈다면 맞다. 두 행렬은 이렇게 이어져 있다.
A 이산 = I + 0.1 A 연속 A_{\text{이산}} = I + 0.1\,A_{\text{연속}} A 이산 = I + 0.1 A 연속 곱해 보면 확인된다. I + 0.1 [ − 1 2 1 − 2 ] = [ 1 − 0.1 0.2 0.1 1 − 0.2 ] I + 0.1\begin{bmatrix} -1 & 2 \\ 1 & -2\end{bmatrix}
= \begin{bmatrix} 1 - 0.1 & 0.2 \\ 0.1 & 1 - 0.2\end{bmatrix} I + 0.1 [ − 1 1 2 − 2 ] = [ 1 − 0.1 0.1 0.2 1 − 0.2 ] 이다.
왜 열의 합이 0이 1로 바뀌는가 ¶ A c A_c A c 의 열의 합이 0이라는 것은 1 T A c = 0 T \vv{1}^{\mathsf T}A_c = \vv{0}^{\mathsf T} 1 T A c = 0 T 였다.
그러면 I + h A c I + hA_c I + h A c 의 열의 합은 계산할 것도 없다.
1 T ( I + h A c ) = 1 T + h ( 1 T A c ) = 1 T + h 0 T = 1 T \vv{1}^{\mathsf T}\left(I + hA_c\right)
= \vv{1}^{\mathsf T} + h\left(\vv{1}^{\mathsf T}A_c\right)
= \vv{1}^{\mathsf T} + h\,\vv{0}^{\mathsf T}
= \vv{1}^{\mathsf T} 1 T ( I + h A c ) = 1 T + h ( 1 T A c ) = 1 T + h 0 T = 1 T 열의 합이 0인 행렬에 I I I 를 더하면 열의 합이 1이 된다. 다만 마코브 행렬이 되려면
성분도 음이 아니어야 하므로 h h h 가 너무 크면 안 된다. 앵커에서는 대각이
1 − h 1 - h 1 − h 와 1 − 2 h 1 - 2h 1 − 2 h 이므로 h ≤ 1 2 h \le \tfrac12 h ≤ 2 1 여야 한다.
고윳값도 함께 옮겨 간다 ¶ A c x = λ x A_c\vv{x} = \lambda\vv{x} A c x = λ x 이면
( I + h A c ) x = x + h λ x = ( 1 + h λ ) x \left(I + hA_c\right)\vv{x} = \vv{x} + h\lambda\vv{x} = (1 + h\lambda)\,\vv{x} ( I + h A c ) x = x + hλ x = ( 1 + hλ ) x 이다. 고유벡터는 그대로이고 고윳값만 λ ↦ 1 + h λ \lambda \mapsto 1 + h\lambda λ ↦ 1 + hλ 로 옮겨 간다.
앵커에서 h = 0.1 h = 0.1 h = 0.1 이었으니
λ = 0 ⟼ 1 , λ = − 3 ⟼ 1 − 0.3 = 0.7 \lambda = 0 \;\longmapsto\; 1,
\qquad
\lambda = -3 \;\longmapsto\; 1 - 0.3 = 0.7 λ = 0 ⟼ 1 , λ = − 3 ⟼ 1 − 0.3 = 0.7 이고, 실제로 두 강의의 고윳값이 그렇다. 고유벡터도 두 강의 모두 ( 2 , 1 ) (2,1) ( 2 , 1 ) 과 ( 1 , − 1 ) (1,-1) ( 1 , − 1 ) 로
똑같았다.
연속 (L23) 이산 (L24) 문제 d u d t = A u \dfrac{d\vv{u}}{dt} = A\vv{u} d t d u = A u u k + 1 = A u k \vv{u}_{k+1} = A\vv{u}_k u k + 1 = A u k 조건 열의 합 = 0 = 0 = 0 열의 합 = 1 = 1 = 1 , 성분 ≥ 0 \ge 0 ≥ 0 한 줄로 1 T A = 0 T \vv{1}^{\mathsf T}A = \vv{0}^{\mathsf T} 1 T A = 0 T 1 T A = 1 T \vv{1}^{\mathsf T}A = \vv{1}^{\mathsf T} 1 T A = 1 T 보존되는 것 1 T u \vv{1}^{\mathsf T}\vv{u} 1 T u 가 상수1 T u \vv{1}^{\mathsf T}\vv{u} 1 T u 가 상수특별한 고윳값 λ = 0 \lambda = 0 λ = 0 λ = 1 \lambda = 1 λ = 1 죽는 조건 Re ( λ ) < 0 \operatorname{Re}(\lambda) < 0 Re ( λ ) < 0 ∣ λ ∣ < 1 \lvert\lambda\rvert < 1 ∣ λ ∣ < 1 경계 허수축 단위원 정상상태 그 고윳값의 고유벡터 그 고윳값의 고유벡터
경계가 허수축에서 단위원으로 옮겨 간 것도 (44) 의 대응으로 설명된다.
λ ↦ 1 + h λ \lambda \mapsto 1 + h\lambda λ ↦ 1 + hλ 는 허수축을 1을 지나는 세로선으로 보내고, h h h 가 작으면
그 근처에서 단위원과 거의 겹친다.
9. 자주 하는 오해 ¶ 정상상태를 ( 1 , 1 , … , 1 ) (1, 1, \dots, 1) ( 1 , 1 , … , 1 ) 로 아는 것 ¶ 가장 흔하다. 2절에서 본 대로 1 \vv{1} 1 은 A T A^{\mathsf T} A T 의 고유벡터이다.
A A A 의 고유벡터는 따로 구해야 한다. 앵커에서 A ( 1 , 1 ) = ( 1.1 , 0.9 ) A(1,1) = (1.1, 0.9) A ( 1 , 1 ) = ( 1.1 , 0.9 ) 였다.
모든 마코브 행렬이 수렴한다는 오해 ¶ 6절의 B = [ 0 1 1 0 ] B = \begin{bmatrix} 0 & 1 \\ 1 & 0\end{bmatrix} B = [ 0 1 1 0 ] 가 반례이다.
∣ λ ∣ ≤ 1 |\lambda| \le 1 ∣ λ ∣ ≤ 1 은 보장되지만 < 1 < 1 < 1 은 보장되지 않는다.
정규화를 잊는 것 ¶ 고유벡터는 스케일이 자유이다. numpy.linalg.eig 는 길이를 1로 맞춰 주므로
( 2 , 1 ) (2,1) ( 2 , 1 ) 대신 ( 0.894 , 0.447 ) (0.894, 0.447) ( 0.894 , 0.447 ) 을 돌려준다. 그대로 쓰면 성분의 합이 1이 아니라 확률이
아니다. 반드시 성분의 합으로 나눠야 한다.
행 기준과 열 기준을 섞는 것 ¶ 1절에서 경고했다. 어느 쪽인지 정하고 끝까지 그것만 써야 한다. 헷갈리면 열의 합을
찍어 보면 된다.
마치며... ¶ 이번 강의에서 다룬 것을 정리하면 다음과 같다.
대상 내용 두 조건 성분 ≥ 0 \ge 0 ≥ 0 , 열의 합 = 1 = 1 = 1 한 줄로 1 T A = 1 T \vv{1}^{\mathsf T}A = \vv{1}^{\mathsf T} 1 T A = 1 T — 총량 보존의 대수적 얼굴고윳값 1 A T 1 = 1 A^{\mathsf T}\vv{1} = \vv{1} A T 1 = 1 이고 A A A 와 A T A^{\mathsf T} A T 는 고윳값이 같다다리 det A T = det A \det A^{\mathsf T} = \det A det A T = det A (L18)경고 고윳값은 같아도 고유벡터는 다르다 나머지 고윳값 ∣ λ ∣ ≤ 1 \lvert\lambda\rvert \le 1 ∣ λ ∣ ≤ 1 — 삼각부등식 세 줄다른 고유벡터 성분의 합이 0이다 c 1 = 1 c_1 = 1 c 1 = 1 확률벡터라는 조건 하나로 못박힌다 정상상태 초기 상태와 무관하게 x 1 \vv{x}_1 x 1 로 수렴 속도 ∣ λ 2 ∣ \lvert\lambda_2\rvert ∣ λ 2 ∣ 가 정한다. 혼합 시간예외 주기적이면 진동, 갈라져 있으면 유일하지 않다 페이지랭크 감쇠가 성분을 전부 양수로 만들어 준다. ∣ λ 2 ∣ ≤ α \lvert\lambda_2\rvert \le \alpha ∣ λ 2 ∣ ≤ α L23과의 관계 I + h A c I + hA_c I + h A c — 오일러 한 걸음. 고유벡터는 그대로
열의 합이 1이라는 조건 하나가 고윳값 1의 존재를 보장하고, 그 결과 어떤 초기 상태에서
출발하든 정상상태로 수렴한다는 것을 확인하였다. 증명의 핵심은 여섯 강의 전에 배운
det A T = det A \det A^{\mathsf T} = \det A det A T = det A 였다. 그때는 "행에 대한 성질이 열에도 성립한다"는 말을
덧붙이고 지나갔는데, 사소해 보이던 그 성질이 결정적인 순간에 쓰인 셈이다.
지금까지 우리가 다룬 행렬들은 저마다 사정이 있었다. 어떤 것은 고유벡터가 모자랐고
(L21의 결함 행렬), 어떤 것은 고윳값이 복소수였으며(회전행렬), 어떤 것은 고윳값이
단위원 위에 걸터앉아 진동했다(6절).
다음 강의부터는 가장 좋은 행렬을 다룬다. 대칭행렬이다. S = S T S = S^{\mathsf T} S = S T 라는 조건
하나로 모든 것이 맞아떨어진다. 고윳값은 전부 실수이고, 고유벡터는 서로 직교한다.
사실 우리는 이 현상을 이미 목격했다. L21의 앵커 [ 2 1 1 2 ] \begin{bmatrix} 2 & 1 \\ 1 & 2\end{bmatrix} [ 2 1 1 2 ]
의 두 고유벡터가 ( 1 , 1 ) (1,1) ( 1 , 1 ) 과 ( 1 , − 1 ) (1,-1) ( 1 , − 1 ) 이었고, 둘의 내적이 0이었다. 그때는 우연이라 여기고
넘어갔다. 우연이 아니었다.
이번 강의의 내용을 파이썬으로 확인해 보려면 L24 실습 노트북 으로 넘어가면 된다.
무작위 마코브 행렬을 잔뜩 만들어 고윳값 1이 늘 있는지 확인하고, 세 상태의 확률분포가
삼각형 위를 움직여 한 점으로 모이는 것을 보며, 작은 웹을 만들어 페이지랭크를 직접
계산해 볼 수 있다.