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ái | Mạnh | Yếu |
|---|---|---|
| User-based | Bắt gu nhanh | Nặng khi đông người |
| Item-based | Ổn định, mở rộng | Cầ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
- Tính trước ma trận độ giống giữa các phim (adjusted cosine: trừ mean của user).
predict_item_based(R, u, i, k=20): dùngkphim giốnginhất màuđã chấm.recommend(u, n): dự đoán mọi phim chưa xem, trả topn.
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 ...
- Thử
k = 5, 10, 20, 50, 100cho item-based. Vẽ RMSE theok. - Thử
min_common = 1và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.