어떤 페이지를 중요하다고 판단할 수 있을까? PageRank는 중요한 페이지에서 링크를 받은 페이지에 더 높은 점수를 부여한다. 이렇게 순환하는 정의를 정상벡터 방정식으로 바꾸어 순위를 계산한다.
체크박스로 링크를 편집해 보자(행 → 열 방향). 노드는 드래그하여 배치를 바꿀 수 있다. 노드의 크기가 곧 PageRank다.
링크 이동확률을 담은 행렬 $M$. 확률 $1-d$의 균등 순간이동을 더한 Google 행렬 $G=dM+(1-d)J$. PageRank는 $Gr=r$을 만족하는 정상분포 $r$.
링크를 최소 개수로 바꾸어 F를 1위로 만들어 보자. 몇 개면 되는가? "받는 링크"와 "주는 링크" 중 무엇이 순위를 올리는가?
한 노드가 링크를 받기만 하고 아무 데도 주지 않으면(모든 나가는 체크 해제) 순위가 어떻게 되는가? 감쇠 d를 0.99로 올리면?
D·E·F가 서로만 링크하는 "동맹"을 만들면 셋의 순위가 오르는가? 이 구조는 실제 링크 스팸이 순위를 높이는 원리를 보여 준다.
// 인접 리스트: 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인지 확인한다. 링크 하나를 바꾸면 순위는 어떻게 달라지는가?