Hệ thống Gợi ý Sản phẩm bằng Phân rã Ma trận SVD & SGD
Trong các sàn thương mại điện tử, ma trận đánh giá giữa Người dùng (Users) và Sản phẩm (Items) có độ thưa rất cao (hơn 99% các ô chưa được đánh giá). Thuật toán Phân rã ma trận xấp…
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: latent factors, stochastic gradient descent, l2 regularization, dot product.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu và tự cài đặt thuật toán Phân rã Ma trận (Matrix Factorization / Funk SVD) cho hệ thống gợi ý lọc cộng tác (Collaborative Filtering).
- Học các vector đặc trưng tiềm ẩn (Latent Factor Vectors) Pu và Qi thông qua thuật toán Hạ độ dốc Ngẫu nhiên (Stochastic Gradient Descent - SGD).
- Tích hợp độ lệch người dùng (bu), độ lệch sản phẩm (bi) và trung bình toàn cục (μ) có điều quy chuẩn L2 (Regularization).
- Xây dựng phương thức sinh danh sách gợi ý sản phẩm phù hợp nhất cho người dùng mục tiêu.
Mô tả bài toán
Trong các sàn thương mại điện tử, ma trận đánh giá giữa Người dùng (Users) và Sản phẩm (Items) có độ thưa rất cao (hơn 99% các ô chưa được đánh giá). Thuật toán Phân rã ma trận xấp xỉ ma trận đánh giá R ≈ P QT, từ đó dự đoán mức độ yêu thích của khách hàng đối với các sản phẩm chưa từng xem.
Hãy xây dựng lớp:
class MatrixFactorizationRecommender:
def __init__(self, n_factors: int = 4, lr: float = 0.05, reg: float = 0.02, epochs: int = 50, random_state: int = 42):
...
def fit(self, ratings: list[tuple[int, int, float]], n_users: int, n_items: int) -> "MatrixFactorizationRecommender":
...
def predict(self, user_id: int, item_id: int) -> float:
...
def recommend(self, user_id: int, top_n: int = 3, candidate_items: list[int] = None) -> list[tuple[int, float]]:
...Công thức dự đoán điểm đánh giá: rui = μ + bu[u] + bi[i] + P[u] · Q[i] Trong đó:
- μ: Điểm đánh giá trung bình của toàn bộ tập dữ liệu huấn luyện.
- bu[u]: Độ lệch của người dùng u (xu hướng đánh giá khắt khe hay dễ dãi).
- bi[i]: Độ lệch của sản phẩm i (chất lượng chung của sản phẩm).
- P[u] ∈ RK: Vector tiềm ẩn của người dùng u.
- Q[i] ∈ RK: Vector tiềm ẩn của sản phẩm i.
Quy tắc cập nhật SGD trên mỗi mẫu (u, i, rui):
- Sai số: eui = rui - rui.
- Cập nhật độ lệch:
bu[u] ← bu[u] + lr × (eui - reg × bu[u]) bi[i] ← bi[i] + lr × (eui - reg × bi[i])
- Cập nhật vector tiềm ẩn:
P[u] ← P[u] + lr × (eui × Q[i] - reg × P[u]) Q[i] ← Q[i] + lr × (eui × Pold[u] - reg × Q[i])
Quy định khởi tạo:
- Thiết lập
np.random.seed(random_state). - Khởi tạo P và Q bằng
np.random.normal(0.0, 0.1, (n_users, n_factors))và(n_items, n_factors). - Khởi tạo bu và bi bằng các mảng 0 kích thước
n_usersvàn_items. - Giới hạn giá trị dự đoán trong khoảng [1.0, 5.0]: clip(rui, 1.0, 5.0).
Phương thức recommend(user_id, top_n, candidate_items):
- Nếu
candidate_itemslàNone, ứng viên là toàn bộ các sản phẩm từ 0 đếnn_items - 1mà người dùng CHƯA từng đánh giá trong tậpratings. - Tính điểm dự đoán cho tất cả ứng viên.
- Trả về danh sách
top_nsản phẩm có điểm dự đoán cao nhất:[(item_id, round(score, 4)), ...], sắp xếp giảm dần theo điểm, hòa điểm thì ưu tiênitem_idnhỏ hơn.
Input
- Các tham số truyền vào hàm/lớp MatrixFactorizationRecommender 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 MatrixFactorizationRecommender hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số lượng người dùng, sản phẩm: 1 ≤ U, I ≤ 1000.
- Số lượt đánh giá: 1 ≤ N ≤ 20,000.
- Tuyệt đối không dùng thư viện ngoài ngoại trừ
numpy.
Ví dụ 1
Input
MatrixFactorizationRecommender(ratings=[[0, 0, 5.0], [0, 1, 4.0], [1, 0, 4.5], [1, 2, 5.0], [2, 1, 4.0], [2, 2, 4.5], [2, 3, 1.0]], n_users=3, n_items=4, n_factors=2, epochs=40, test_user=0, test_item=2, top_n=2)Output
[2, 3]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
MatrixFactorizationRecommender(ratings=[[0, 0, 5.0], [1, 1, 5.0], [2, 2, 1.0]], n_users=3, n_items=3, n_factors=2, epochs=20, test_user=0, test_item=1, candidate_items=[1, 2], top_n=2)Output
[1, 2]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.
