Thuật toán Xếp hạng Đồ thị Liên kết PageRank với Power Iteration
Trong đồ thị web, một liên kết từ trang A tới trang B được coi là một "phiếu bầu" tín nhiệm cho trang B. Tuy nhiên, phiếu bầu từ các trang có uy tín cao sẽ có trọng số lớn hơn phiế…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: adjacency matrix, stochastic matrix, dangling nodes, l1 convergence.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu sâu mô hình chuỗi Markov và thuật toán PageRank kinh điển của Larry Page và Sergey Brin.
- Xử lý hiện tượng Nút cụt (Dangling Nodes / Dead Ends) - các trang web không có liên kết trỏ ra ngoài làm rò rỉ xác suất.
- Kết hợp Hệ số giảm xóc (Damping Factor d) mô phỏng hành vi ngẫu nhiên của người duyệt web (Random Surfer Model).
- Triển khai phương pháp Lặp lũy thừa (Power Iteration) vector hóa bằng NumPy cho tới khi hội tụ sai số chuẩn L1.
Mô tả bài toán
Trong đồ thị web, một liên kết từ trang A tới trang B được coi là một "phiếu bầu" tín nhiệm cho trang B. Tuy nhiên, phiếu bầu từ các trang có uy tín cao sẽ có trọng số lớn hơn phiếu bầu từ các trang ít tên tuổi.
Công thức lặp PageRank cho đồ thị gồm N đỉnh: r(t+1) = d · ( r(t) P ) + 1 - dN 1 Trong đó:
- r(t) ∈ R1 × N: Vector phân phối xác suất tại bước t.
- d: Hệ số giảm xóc (thường chọn d = 0.85).
- P: Ma trận chuyển trạng thái ngẫu nhiên (Row-Stochastic Transition Matrix).
- Nếu đỉnh i có bậc ra ki > 0: Pij = Aijki.
- Nếu đỉnh i là nút cụt (ki = 0): Pij = 1N cho mọi j (người dùng ngẫu nhiên chọn một trang bất kỳ trên toàn bộ mạng).
Hãy viết hàm: compute_pagerank(adj_matrix: np.ndarray, damping: float = 0.85, max_iter: int = 100, tol: float = 1e-6) -> np.ndarray
Yêu cầu thực hiện:
- Kiểm tra đầu vào:
adj_matrixphải là mảng 2D hình vuông kích thước N × N (N ≥ 1). Nếu không, némValueError("adj_matrix must be a 2D square matrix").dampingphải thỏa mãn 0.0 < damping < 1.0. Nếu không, némValueError("damping must be in (0, 1)").- Khởi tạo:
- Khởi tạo vector PageRank ban đầu phân phối đều: r(0) = [ 1N, 1N, …, 1N ].
- Xây dựng Ma trận Chuyển trạng thái P:
- Tính bậc ra của từng hàng: ki = ∑j=1N Aij.
- Với hàng ki > 0: chia từng phần tử cho ki.
- Với hàng ki == 0 (nút cụt): gán toàn bộ hàng bằng 1N.
- Vòng lặp Power Iteration:
- Ở mỗi bước lặp, tính vector mới:
rnew = damping × (r · P) + 1.0 - dampingN
- Kiểm tra điều kiện hội tụ: ∑i=1N |rnew[i] - r[i]| < tol.
- Nếu thỏa mãn, dừng lặp sớm.
- Nếu chưa hội tụ, gán r = rnew và lặp tiếp tối đa
max_iterlần. - Chuẩn hóa đầu ra:
- Đảm bảo ∑i=1N r[i] == 1.0 (chia cho tổng nếu có sai số dấu phẩy động).
- Trả về mảng 1D
np.ndarraykích thước N kiểunp.float64.
Input
- Các tham số truyền vào hàm/lớp compute_pagerank hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp compute_pagerank hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số lượng đỉnh đồ thị: 1 ≤ N ≤ 2000.
- Các giá trị trong
adj_matrixlà các số thực không âm ≥ 0.
Ví dụ 1
Input
compute_pagerank(adj_matrix=[[0, 1, 0], [0, 0, 1], [1, 0, 0]], damping=0.85)Output
[0.3333, 0.3333, 0.3333]Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
compute_pagerank(adj_matrix=[[0, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]], damping=0.85)Output
[0.4797, 0.4453, 0.0375, 0.0375]Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
