Giao diện
Học phần Giải thuật nền tảng của Khoa học dữ liệu, học kỳ 1 năm học 2026–2027.
Tài liệu đi cùng bộ trang chiếu Bài 03. Các lời giải bài tập được gập để người học thử tính trước khi đối chiếu.
1. Giới thiệu bài học
Một công cụ tìm kiếm phải chọn và sắp xếp các trang phù hợp với truy vấn. Nội dung trang giúp đánh giá mức phù hợp. Cấu trúc liên kết cung cấp thêm tín hiệu về tầm quan trọng của trang. PageRank xây dựng điểm từ cấu trúc này, không tự đo mức phù hợp với từng truy vấn.
Bài học bắt đầu từ một bốn trang có thể tính tay. Từ phép chia điểm theo liên kết, ta xây dựng mô hình xử lý được nút cụt và bẫy liên kết. Sau đó chuyển phép tính sang dạng thưa và chia khối. Phần chi phí giải thích việc chia nhỏ tiết kiệm bộ nhớ ở đâu và vì sao thêm máy chưa chắc giảm thời gian theo cùng tỷ lệ.
Sau bài học, sinh viên cần lập được liên kết và một vòng cập nhật. Giải thích điều kiện hội tụ và dừng. Mô tả Map, Combine, Reduce. Tính các chi phí cơ bản. Và cài đặt, kiểm thử phiên bản Python. Kiến thức sử dụng gồm , phép nhân ma trận–véc tơ, xác suất cơ bản và mô hình MapReduce của Bài 02.
2. Bài toán Xếp hạng trang web
Đầu vào và đầu ra. Đầu vào là
Ví dụ chuẩn xuyên suốt bài giảng. Ta dùng bốn trang trong Hình 5.1 của giáo trình MMDS,
Bậc ra (số liên kết đi khỏi trang) lần lượt là
Thử nghiệm đầu tiên: Đếm liên kết vào. Trên ví dụ, A, B, C, D đều có đúng 2 liên kết vào, nên chuẩn hóa cho mỗi trang
Từ đếm sang chia điểm. Ta cho mỗi trang một lượng điểm rồi để trang nguồn chia đều điểm của mình cho các đích theo bậc ra, thay vì chỉ đếm cạnh vào. Khởi tạo mỗi trang
Cộng tại đích và một vòng hoàn chỉnh. Mọi trang tính đồng thời từ điểm cũ: A chỉ nhận từ B và C, được
Ba điểm phương pháp luận cần giữ:
- Mọi đóng góp xác định bởi điểm cũ và bậc ra của nguồn, không phải bậc vào của đích.
- Đồng bộ: Không dùng điểm mới của trang này khi tính trang khác trong cùng vòng.
- Một vòng chưa phải PageRank. Quy tắc hiện tại còn hai lỗ hổng: Chưa xử lý trang không có liên kết ra, và chưa bảo đảm việc lặp hội tụ trên mọi . Phần 3 xử lý cả hai.
3. Mô hình và thuật toán PageRank
Ma trận liên kết và phép lặp truyền điểm
Cột A là
Phép lặp thô. Điểm là véc tơ cột
Nhân –véc tơ thực hiện đồng thời "chia tại nguồn, cộng tại đích": Thành phần
Điểm ổn định và mối liên hệ với . Điểm ổn định là véc tơ không đổi qua cập nhật,
Một quan sát trên ví dụ. Hai hàng B và C của
Giới hạn của phép lặp thô. Không thể kết luận phép lặp hội tụ trên mọi chỉ từ điều kiện tổng cột bằng 1. Chẳng hạn, một đồ thị có thể khiến điểm dao động theo chu kỳ. Web còn có nút cụt và nhóm trang không có liên kết ra ngoài. Ta sẽ bổ sung bước nhảy và xử lý nút cụt, rồi chứng minh hội tụ cho mô hình đầy đủ dưới đây.
Nút cụt, bước nhảy và phép cập nhật đầy đủ
Nút cụt làm mất điểm. Xóa cạnh C→A khỏi ví dụ: C trở thành nút cụt (không còn liên kết ra, nhưng vẫn nhận cạnh vào). Cột C của dead trong mã thực hành.)
Bẫy liên kết dồn điểm. Thay C→A bằng khuyên C→C (Hình 5.6, biến thể trap): C có bậc ra 1 nên tổng điểm vẫn được giữ, nhưng người đã đến C không bao giờ rời C nếu chỉ đi theo liên kết. Phép lặp thô trên này dồn toàn bộ điểm về C. Một bẫy tổng quát là tập trang có liên kết ra nhưng không có cạnh ra khỏi tập.
Bước nhảy và bù nút cụt. Mô hình đầy đủ sửa cả hai lỗi bằng cách bổ sung hành vi của người lướt ngẫu nhiên. Mỗi bước, với xác suất
Dạng véc tơ tương đương:
Lưu ý về dạng công thức có xử lý nút cụt (Dead ends): Nếu chỉ áp dụng công thức taxation thuần túy
Vết tính một vòng,
- gốc (không nút cụt,
): - A:
. - B, C, D:
. - Tổng bằng 1.
- A:
- Biến thể nút cụt (
): Thành phần chung . - A:
. - B, C, D:
. - Tổng lại bằng 1, tức điểm của C được hoàn lại đầy đủ qua phần bù.
- A:
- Biến thể
trapmột vòng,nhận từ A, C và D: , nên . A , B, D . Tổng .
Bảo toàn khối lượng. Nếu
Hội tụ. Đặt
vì mỗi cột của
Khai triển chi tiết: Khai triển chi tiết: Cận hậu nghiệm (đọc thêm)
Sai số so với nghiệm bị chặn bởi:
Lưu ý
Thuật toán và dừng. Vào: Danh sách kề,
4. Tính PageRank trên đồ thị lớn: Biểu diễn thưa và MapReduce theo khối
Vấn đề quy mô. Quy tắc cập nhật không đổi, nhưng với web thật
Biểu diễn theo nguồn (MMDS 5.2.1). Vì giá trị khác không của cột
- A:
, C, D. - B:
, D. - C:
. - D:
, C.
Nút cụt vẫn giữ bản ghi với
Chia khối (MMDS 5.2.3–5.2.4). Đặt
ghi , . ghi , , . ghi , . chỉ ghi D→C (C không trỏ tới C hay D).
Bậc toàn cục
Map, Combine, Reduce. Map nhận khối
text
Map(B_ab, r_b):
với mỗi (j, dj, dests) trong B_ab:
với mỗi i trong dests:
yield(i, r_b[j] / dj)
Combine(i, values):
yield(i, sum(values))Khóa là trang đích. Combine cộng các đóng góp cùng khóa ngay tại tác vụ Map, giảm dữ liệu phải chuyển. Reduce hoàn thiện:
text
Reduce(i, L_i):
z_i = sum(L_i)
return(i, beta * z_i + (1 - beta + beta * delta) / n)Hai chi tiết quan trọng.
tính một lần từ phân hoạch nguồn (mỗi nút cụt góp đúng một lần), rồi gửi tới các tác vụ Reduce, tránh tính lại từ các khối có bản ghi nguồn lặp. - Tạo bản ghi
cho mọi trang từ danh sách trang, để đích không có liên kết vào nào vẫn xuất hiện khi nhóm theo khóa và nhận phần chung.
Ví dụ gộp tại A. gốc,
Tính đúng. Mọi tác vụ dùng cùng bản chụp cố định của
Mỗi cạnh đóng góp đúng một lần vì nó thuộc đúng một khối. Combine và Reduce chỉ tái nhóm các tổng. Trên số thực chính xác kết quả bằng phép cập nhật tuần tự. Trên số dấu phẩy động, thứ tự cộng khác nhau gây chênh làm tròn nhỏ — không khẳng định tính kết hợp tuyệt đối của số thực máy.
Tổ chức một vòng. Các pha: Dùng
5. Chi phí: Lưu trữ, bộ nhớ, dữ liệu và thời gian
Phần này đánh giá cách tổ chức tính theo khối bằng các đại lượng riêng biệt của mô hình chi phí đầu vào tác vụ trong MMDS 2.5.1. Trong đó,
Dung lượng lưu đĩa
- đặc:
byte. - Danh sách liên kết (mã nguồn ngầm):
, gồm bậc ra cộng mã đích. Mô hình bỏ qua phần phụ trội của định dạng và lưu trữ. - Với
, : 128 và 48 byte. Tỷ số xấp xỉ , có lợi khi . - Con số 48 byte là của biểu diễn toàn cục. Biểu diễn theo khối lặp lại bậc ra và mã nguồn ở nhiều khối, nên không gán nó cho
.
Bộ nhớ một tác vụ
Với
Đầu vào Map
Combine và
Phân biệt
Thời gian. Mô hình: Mỗi cạnh tốn
tốn , tốn , tốn , tốn .
Một máy tuần tự:
Một vòng và cả công việc. Giả định các pha không chồng nhau:
Với
6. Thực hành: Chạy mã pagerank.py
Tệp mã pagerank.py (đi kèm hướng dẫn chạy) cài đặt đúng mô hình phần 3 bằng Python 3, chỉ dùng thư viện chuẩn (argparse, json, math, sys) — không cần pip. Mục đích là kiểm chứng công thức trên một máy, không phải đo hiệu năng hay chứng minh tăng tốc. Không dùng bốn nút để suy kết luận về song song hóa.
Biểu diễn dữ liệu và giao diện. là dict từ tên nút sang danh sách đích:
python
adj = {
"A": ["B", "C", "D"],
"B": ["A", "D"],
"C": ["A"],
"D": ["B", "C"],
}Hàm pagerank(adj, beta=0.8, tol=1e-8, max_iter=100) trả về dict gồm rank (điểm từng nút), converged (trạng thái đạt ngưỡng), iterations (số vòng), delta (độ thay đổi cuối). Điều kiện vào: tol dương. max_iter nguyên dương. Toàn bộ nút được giữ, kể cả nút không có liên kết vào hay nút cụt — nút cụt phải có mặt để tính phần bù.
Mã một vòng. Hàm step dịch trực tiếp quy tắc cập nhật:
python
def step(adj, r, beta):
n = len(adj)
delta = sum(r[j] for j in adj if not adj[j])
common = (1.0 - beta + beta * delta) / n
new = {i: common for i in adj}
for j, targets in adj.items():
if not targets:
continue
share = beta * r[j] / len(targets)
for i in targets:
new[i] += share
return newdelta ở đây là common là phần chung r chỉ được đọc. Điểm mới nằm hoàn toàn trong dict trả về. Lưu ý hai đại lượng cùng họ tên trong tệp: delta trong step là delta trong vòng lặp là
Vòng lặp và dừng. Khởi tạo step, tính r, dừng khi max_iter chưa đạt ngưỡng, kết quả kèm trạng thái chưa đạt, số vòng và
Lệnh chạy. Từ thư mục gốc dự án:
bash
python materials/lec-03/code/pagerank.py --variant base --beta 0.8 --tol 1e-8 --max-iter 100Đổi --variant thành dead hoặc trap cho hai biến thể. Đầu ra là JSON: rank, converged, iterations, delta, rank_sum.
Kết quả chạy với các tham số trên.
- Với
base,beta=0.8,tol=1e-8: Đạt ngưỡng sau 20 vòng,, (nghiệm chính xác lần lượt là và ), cuối , tổng điểm 1.0. - Với
dead: 12 vòng. - Với
trap: 34 vòng, C chiếm.
Sai khác làm tròn nhỏ có thể xuất hiện giữa môi trường chạy. Số vòng không phải hằng số để học thuộc — nó phụ thuộc
Ba lớp kiểm chứng.
- Bất biến: tổng điểm xấp xỉ 1, mọi giá trị không âm.
- Một bước tính tay:
basetừđều, cho , . deadchovà — khớp bảng phần 3. - Trường hợp biên trong README: toàn bộ nút cụt (
, mỗi vòng trả lại phân phối đều, không lỗi chia không) và nút có khuyên lên chính nó. So sánh số thực dùng dung sai abs(got - want) <= 1e-12, không dùng==.
Các lỗi cần kiểm tra khi cài đặt. Cập nhật trực tiếp r[i] += ... khi quét cạnh làm trộn điểm cũ và điểm mới. Bỏ nút không có liên kết vào trước khi chạy làm mất nút khỏi kết quả. Dùng == so sánh float. Ba lỗi này đều trái với bất biến và quy tắc đồng bộ đã nêu.
7. Bài tập tự luyện
Bốn bài sau giữ nguyên đề và của MMDS. Làm trước khi xem gợi ý.
Bài 1 — MMDS 5.1.1 (trang 187–188, Hình 5.7): PageRank không bước nhảy
Tính PageRank của từng trang trong Hình 5.7, không có bước nhảy.
Hình 5.7:
Gợi ý
Đặt
Lời giải
Cột nguồn: Cột
Từ phương trình đầu:
Thế vào phương trình hai:
Tổng:
Kiểm phương trình ba:
Bài 2 — MMDS 5.1.2: Thêm bước nhảy với hệ số 0,8
Tính PageRank của từng trang trong Hình 5.7 với
Gợi ý
không có nút cụt nên
Lời giải
Hai phương trình đầu (nhân 15):
Thay
Nhân phương trình đầu với 7, phương trình sau với 2 rồi cộng:
Tiếp tục:
Kiểm phương trình của
Tổng:
So sánh hai bài: Bước nhảy san phẳng điểm, kéo
Bài 3 — MMDS 5.2.1 (trang 195): Ngưỡng lưu ma trận thưa
Boolean
Gợi ý
Gọi
Lời giải
Cách đặc:
Cách thưa:
Điều kiện tiết kiệm:
Tại điểm bằng nhau hai cách tốn như nhau nên điều kiện phải là bất đẳng thức ngặt. Với
Bài 4: Biểu diễn đồ thị theo danh sách kề (Bài tập 5.2.2)
Dùng phương pháp mục 5.2.1, lập bảng (Nguồn, Bậc ra, Danh sách đích) cho: (a) Hình 5.4. (b) Đồ thị Hình 5.7.
Hình 5.7 đã cho ở Bài 1.
Gợi ý
Mỗi nguồn ghi bậc ra toàn cục rồi toàn bộ danh sách đích. Nguồn không có liên kết ra vẫn được liệt kê với bậc 0. Khuyên cũng là một cạnh và tính vào bậc ra.
Lời giải
Hình 5.4 (A→B, C, D. B→A, D. C→E. D→B, C. E không có liên kết ra, gồm 8 cạnh):
| Nguồn | Bậc ra | Đích |
|---|---|---|
| A | 3 | B, C, D |
| B | 2 | A, D |
| C | 1 | E |
| D | 2 | B, C |
| E | 0 | (rỗng) |
Hình 5.7 (a→a, b, c. B→a, c. C→b, c, gồm 7 cạnh tính cả 2 khuyên):
| Nguồn | Bậc ra | Đích |
|---|---|---|
| a | 3 | a, b, c |
| b | 2 | a, c |
| c | 2 | b, c |
Bài này chỉ yêu cầu biểu diễn, không yêu cầu tính PageRank. Tổng bậc ra là 8 và 7, khớp số cạnh hai hình. Lưu ý Hình 5.7 có 5 cạnh giữa các nút khác nhau cộng 2 khuyên, tổng 7 cạnh, cần lưu ý không đếm khuyên hai lần.
8. Hướng dẫn chấm bài tập
| Bài | Tiêu chí đánh giá | Điểm |
|---|---|---|
| Bài 1 | liên kết | 3 |
| Hệ phương trình cân bằng và điều kiện chuẩn hóa tổng | 3 | |
| Khử tuyến tính và tính ra các giá trị | 2 | |
| Kiểm nghiệm lại phương trình và điều kiện tổng 1 | 2 | |
| Bài 2 | Mô hình có bước nhảy và xác định đúng phần bù chung | 3 |
| Lập và giải hệ phương trình tuyến tính | 4 | |
| Kiểm nghiệm và kết luận độ san phẳng điểm số | 3 | |
| Bài 3 | Viết đúng biểu thức dung lượng cho 2 cách lưu trữ | 4 |
| Thiết lập bất đẳng thức và suy ra ngưỡng mật độ | 4 | |
| Phân tích điều kiện ngặt và trường hợp biên | 2 | |
| Bài 4 | Lập đúng bảng cho Hình 5.4 (kèm nút cụt | 4 |
| Lập đúng bảng cho Hình 5.7 (đếm đúng 2 khuyên) | 4 | |
| Ghi rõ nguồn hình và đối chiếu tổng bậc ra | 2 | |
| Tổng điểm | 10 |
9. Đọc thêm và tài liệu tham khảo
- J. Leskovec, A. Rajaraman, J. D. Ullman, Mining of Massive Datasets, 3rd ed., Cambridge University Press. Chương 5 (Link Analysis), mục 5.1.2–5.1.7 trang 178–188, mục 5.2 trang 189–195. Chương 2, mục 2.5.1 trang 53–54 cho mô hình chi phí. Xem thêm tại MMDS.
- Slide MMDS, tệp
ch05-linkanalysis1.pdf, trang chiếu 42 và 52. Stanford CS246, tệp09-pagerank.pdf, trang chiếu 45 và 54: Phân phối điểm nút cụt, nguồn của phần bù. - Tệp mã thực hành: materials/lec-03/code/pagerank.py và materials/lec-03/code/practice-README.md.