연결 탐구 4 · 페이지랭크

링크가 만드는 고유벡터 순위

어떤 페이지를 중요하다고 판단할 수 있을까? PageRank는 중요한 페이지에서 링크를 받은 페이지에 더 높은 점수를 부여한다. 이렇게 순환하는 정의를 정상벡터 방정식으로 바꾸어 순위를 계산한다.

1미니 웹 만들기 — 6페이지짜리 인터넷

체크박스로 링크를 편집해 보자(행 → 열 방향). 노드는 드래그하여 배치를 바꿀 수 있다. 노드의 크기가 곧 PageRank다.

2무작위 서퍼 — 반복으로 찾는 정상분포

링크 이동확률을 담은 행렬 $M$. 확률 $1-d$의 균등 순간이동을 더한 Google 행렬 $G=dM+(1-d)J$. PageRank는 $Gr=r$을 만족하는 정상분포 $r$.

0.85
반복 0회 변화량 —
수렴을 보장하는 순간이동 $0<d<1$일 때 모든 성분이 양수인 Google 행렬. 고윳값 1의 유일한 정상벡터와 절댓값 1보다 작은 나머지 고윳값. 반복에서 사라지는 나머지 성분. 남는 PageRank 성분.

3링크 구조와 순위의 관계 실험

1

도전 1 · F를 1등으로

링크를 최소 개수로 바꾸어 F를 1위로 만들어 보자. 몇 개면 되는가? "받는 링크"와 "주는 링크" 중 무엇이 순위를 올리는가?

2

도전 2 · 블랙홀 실험

한 노드가 링크를 받기만 하고 아무 데도 주지 않으면(모든 나가는 체크 해제) 순위가 어떻게 되는가? 감쇠 d를 0.99로 올리면?

활동

도전 3 · 링크 동맹

D·E·F가 서로만 링크하는 "동맹"을 만들면 셋의 순위가 오르는가? 이 구조는 실제 링크 스팸이 순위를 높이는 원리를 보여 준다.

수행평가 2 · 링크 구조와 순위

The $25,000,000,000 Eigenvector: The Linear Algebra behind Google — K. Bryan & T. Leise (2006)
SIAM Review 48(3) · 웹 공개 PDF · 학부 1학년 수준의 설명 중심 논문
§1–3을 읽고, §4의 존재성과 유일성 증명에 도전해 보자. ① 이 페이지에서 만든 6노드 웹의 순위를 손으로 검증한다. ② 감쇠 계수 d의 역할을 기약성과 비주기성으로 설명한다. ③ 링크 스팸이 수학적으로 가능한 이유와 대응 방법을 논한다.
The Anatomy of a Large-Scale Hypertextual Web Search Engine — Brin & Page (1998)
WWW7 · 웹 공개 · PageRank를 처음 제안한 논문
§2.1의 PageRank 정의를 읽는다. 나머지 시스템 설계 부분은 선택해서 읽는다.
starter-pagerank.js — 나만의 웹 순위 계산기
// 인접 리스트: links[i] = i번 페이지가 링크하는 페이지들
const links = [[1, 2], [2], [0], [0, 2], [2, 3], [4]];  // ★ 내 웹으로 교체!
const n = links.length, d = 0.85;                        // ★ 감쇠 인자
let r = new Array(n).fill(1 / n);                        // 균등 분포에서 출발
for (let it = 0; it < 100; it++) {                       // 파워 이터레이션
  const next = new Array(n).fill((1 - d) / n);
  for (let i = 0; i < n; i++) {
    const out = links[i].length;
    if (out === 0) { for (let j = 0; j < n; j++) next[j] += d * r[i] / n; }
    else links[i].forEach(j => next[j] += d * r[i] / out);
  }
  r = next;
}
console.log("PageRank:", r.map(x => x.toFixed(4)));
// r의 합이 1인지 확인한다. 링크 하나를 바꾸면 순위는 어떻게 달라지는가?