python-050Đọc toàn bộ đề miễn phí

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…

PythonNâng cao40 phút

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ủ đề

machine learningrecommender systemsmatrix factorizationsgdcollaborative filtering

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_users và 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_items là None, ứng viên là toàn bộ các sản phẩm từ 0 đến n_items - 1 mà người dùng CHƯA từng đánh giá trong tập ratings.
  • Tính điểm dự đoán cho tất cả ứng viên.
  • Trả về danh sách top_n sả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ên item_id nhỏ 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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.