Collaborative filtering user-based và item-based

Ma trận user item, láng giềng gần nhất, tương đồng Pearson cosine, dự đoán xếp hạng và ví dụ phim Avatar trong bài này.
Trung bìnhThuật toán ~60 phút

Ôn lại trước khi học

Giới thiệu

Bài này học gợi ý theo hành vi cộng đồng giống bạn. Cách này giúp điền điểm vào ô trống ma trận.

Kiến thức cần nhớ

Ma trận ô trống

  • Hàng là người, cột là món, ô là điểm đã chấm.
  • Việc cần là đoán điểm ô trống để gợi món cao.
  • User-based: tìm người giống bạn rồi xin món họ thích.
  • Ví dụ đời thường: bạn cùng gu khen phim nào thì mình thử phim đó.

Dự đoán có trừ trung bình

  • Trừ mức khó tính của mỗi người trước khi nhân trọng số.
  • Nhân với độ giống rồi cộng lại, cuối cộng mức của bạn.
  • Không trừ thì người chấm chặt thiệt thòi mãi.
  • Ví dụ đời thường: 4 sao của người khó tính bằng 5 sao người dễ tính.

User so với item

  • User-based trực quan nhưng hồ sơ đổi liên tục, khó mở rộng.
  • Item-based ổn định vì quan hệ món đổi chậm, tính trước được.
  • Đo giống bằng cosine hoặc Pearson trừ trung bình.
  • Ví dụ đời thường: Avatar 2009 gợi phim cùng nhóm người chấm.
PháiMạnhYếu
User-basedBắt gu nhanhNặng khi đông người
Item-basedỔn định, mở rộngCần tính trước offline

Ví dụ

  • Input: 2 người chỉ chung 1 phim mà giống tuyệt đối -> Output: kết luận nhiễu, cần ngưỡng.
  • Câu này cho thấy mẫu chung ít thì không tin được.
  • Input: người chấm chặt toàn điểm thấp, hệ không trừ trung bình -> Output: không gợi gì, chẩn đoán lệch.
  • Câu này cho thấy chuẩn hóa trung bình là bắt buộc.

💻 Bài tập

Ngôn ngữ: Python 3 với NumPy. Dữ liệu MovieLens 100K. Nộp vào day-059/.

Bài 1: User-based CF

def similarity(R, u, v, kind="pearson", min_common=3) -> float:
    """R: ma trận user x item, 0 là chưa chấm. Chỉ tính trên phim cả 2 cùng chấm.
       Ít hơn min_common phim chung thì trả 0."""
def predict_user_based(R, u, i, k=20) -> float:
    """r_hat = mean_u + sum(sim * (r_vi - mean_v)) / sum(|sim|), lấy k người giống nhất đã chấm i."""
Ma trận nhỏ 4 user x 5 phim tự tạo -> tính tay 1 dự đoán và so với code
User chấm chặt (toàn 1-2 sao) -> dự đoán vẫn nằm quanh mức của họ, không bị kéo lên 4

Bài 2: Item-based CF

  1. Tính trước ma trận độ giống giữa các phim (adjusted cosine: trừ mean của user).
  2. predict_item_based(R, u, i, k=20): dùng k phim giống i nhất mà u đã chấm.
  3. recommend(u, n): dự đoán mọi phim chưa xem, trả top n.

Bài 3: So sánh và đo (nâng cao)

Chia ngẫu nhiên 80/20 rating.

phương_pháp          RMSE    MAE    thời_gian_dự_đoán_test
global_mean          ...
user_mean            ...
user_based k=20      ...
item_based k=20      ...
  1. Thử k = 5, 10, 20, 50, 100 cho item-based. Vẽ RMSE theo k.
  2. Thử min_common = 1 và 5. Tìm ví dụ cặp user có Pearson = 1 chỉ vì 1-2 phim chung.

✅ Tiêu chí hoàn thành

  • Dự đoán tay trên ma trận nhỏ khớp code.
  • Bảng RMSE có 4 phương pháp, CF thắng baseline.
  • Có ví dụ độ giống nhiễu khi quá ít phim chung.
  • Giải thích được vì sao item-based dễ tính trước hơn user-based.

❓ Câu hỏi ôn tập

  • Ma trận user item hàng cột là gì?
  • User-based và item-based khác nhau sao?
  • Vì sao phải trừ điểm trung bình?
  • Ma trận thưa gây khó gì?

🌕 Bạn đã hoàn thành ngày 59. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.