1. Khái niệm
SVD (Singular Value Decomposition) là kỹ thuật phân tách một ma trận thành tích của các ma trận nhỏ hơn.
1.1 Full SVD
Giả sử ta có ma trận (kích thước ) thì sẽ được phân tách thành:
-
: Ma trận trực chuẩn chứa các vector kỳ dị bên trái (kích thước ).
-
: Ma trận đường chéo chứa các giá trị kỳ dị (kích thước ).
-
: Ma trận trực chuẩn chứa các vector kỳ dị bên phải (kích thước ).
-
Các cột của và đều trực giao với nhau và là vector đơn vị.
-
Hai vector trực giao với nhau nếu tích chấm của chúng bằng 0. Một vector là vector đơn vị nếu độ dài bằng 1.
-
Chuyển vị của ma trận trực chuẩn là nghịch đảo của nó: , tức là và .
1.2 Reduced SVD / Compact SVD
- Đây là dạng phân rã kỳ dị rút gọn, chỉ giữ lại các giá trị kỳ dị khác 0 và bỏ các cột dư thừa của và để giảm kích thước và tối ưu lưu trữ.
Công thức:
- : Ma trận đường chéo kích thước ( là rank của ma trận ).
- : Kích thước .
- : Kích thước .
1.3 Semi-Orthonormal Matrices (Ma trận bán trực chuẩn)
- Trong Full SVD: và là ma trận trực chuẩn, tức là , , .
- Trong Reduced SVD: và không vuông nên chỉ thỏa mãn .
- Tuy nhiên và .
- Như vậy, và được gọi là Semi-Orthonormal Matrices (ma trận bán trực chuẩn).
2. Khái niệm User-Based Collaborative Filtering
Là kỹ thuật dự đoán sản phẩm mà người dùng có thể thích dựa vào điểm số do những người dùng khác có cùng sở thích đánh giá.
Bước 1: Tính độ tương đồng giữa các người dùng với người dùng mục tiêu .
Độ tương đồng giữa hai người dùng và :
-
: Điểm đánh giá của người dùng cho sản phẩm
-
: Điểm đánh giá của người dùng cho sản phẩm
-
: Điểm đánh giá trung bình của người dùng
-
: Tập các mục mà người dùng đã đánh giá
-
: Một sản phẩm mà cả và đều đã đánh giá
-
Giá trị
- Gần : và đánh giá giống nhau
- Gần : và đánh giá ngược nhau
- : Không có mối liên hệ
Bước 2: Xếp hạng các mặt hàng dựa trên tương đồng
Điểm dự đoán cho người dùng với sản phẩm :
- : Dự đoán điểm của cho
- : Trung bình điểm của
- : Độ tương đồng giữa và
- : Điểm thực tế của cho
Tuy nhiên, trong SVD Recommendation System, ta tập trung vào mối quan hệ tương thích giữa các user để gợi ý.
3. Ứng dụng SVD cho hệ thống gợi ý sản phẩm cho người dùng (User-Based)
Ý tưởng:
Sử dụng Compact SVD để phân rã ma trận thành:
- (): vector biểu diễn user
- (): chứa giá trị kỳ dị
- (): vector biểu diễn sản phẩm
Lý do dùng Compact SVD:
Giảm chiều dữ liệu, chỉ giữ lại thành phần quan trọng.
Dự đoán cho user mới ():
Tính vector biểu diễn:
Sau đó tính cosine similarity giữa và từng dòng :
- : rất giống nhau
- : ngược nhau
- : không liên quan
Chọn user tương đồng nhất để đề xuất sản phẩm mà họ đánh giá cao.
Ví dụ: Ma trận người dùng x sản phẩm
Sản phẩm A | Sản phẩm B | Sản phẩm C | Sản phẩm D | |
---|---|---|---|---|
User1 | 5 | 4 | 0 | 1 |
User2 | 4 | 0 | 0 | 1 |
User3 | 1 | 1 | 0 | 5 |
User4 | 0 | 0 | 5 | 4 |
User5 | 0 | 1 | 5 | 4 |
Ta có:
Code ví dụ SVD cho user-based recommendation:
import numpy as np
# Tạo ma trận người dùng x sản phẩm
A = np.array([ [5, 4, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [0, 0, 5, 4], [0, 1, 5, 4]
]) # Thực hiện SVD đầy đủ
U, S, Vt = np.linalg.svd(A, full_matrices=False) # Chọn k = 2 (rút gọn SVD)
k = 2
U_r = U[:, :k] # Lấy 2 cột đầu của U
S_r = np.diag(S[:k]) # Chuyển S thành ma trận đường chéo (2x2)
V_r_T = Vt[:k, :] # Lấy 2 hàng đầu của V^T print("Ma trận U_r (Người dùng):\n", np.round(U_r, 2))
print("\nMa trận Σ_r (Giá trị kỳ dị):\n", np.round(S_r, 2))
print("\nMa trận V_r^T (Sản phẩm):\n", np.round(V_r_T, 2))
Kết quả ví dụ:
Dự đoán cho người dùng mới có đánh giá:
Tính vector biểu diễn:
r = np.array([[5, 0, 3, 4]])
S_r_inv = np.linalg.inv(S_r)
U_new = r @ V_r_T.T @ S_r_inv
print("\nMa trận U mới (Người dùng):\n", np.round(U_new, 2))
Giả sử
Tính Cosine Similarity với từng user có sẵn:
cosine_similarities = []
for i, U_i in enumerate(U_r): cos_alpha = np.dot(U_new, U_i).item() / (np.linalg.norm(U_new) * np.linalg.norm(U_i)) cosine_similarities.append((i + 1, round(cos_alpha, 2)))
print("\nCosine Similarity với người dùng khác:")
for user, cos_sim in cosine_similarities: print(f"Người dùng {user}: {cos_sim}")
Kết quả:
Cos similarity của người dùng mới và người dùng 3 là , rất gần .
=> Người dùng mới rất giống user 3, nên có thể đề xuất sản phẩm D (vì user 3 đánh giá D rất cao).
4. Các phương pháp chọn giá trị cho Compact SVD
Việc chọn tối ưu rất quan trọng vì ảnh hưởng khả năng lưu giữ thông tin gốc sau khi giảm chiều.
4.1 Phương pháp tích lũy (Explained Variance)
- Giữ lại càng nhiều phương sai của dữ liệu gốc càng tốt.
- Chọn sao cho tổng phương sai tích lũy đạt ngưỡng (thường 90% hoặc 95%).
Công thức:
- : Bình phương giá trị kỳ dị thứ .
- : Tổng số thành phần kỳ dị.
- Chọn sao cho .
4.2 Phương pháp khuỷu tay (Elbow Method)
- Chọn tại điểm giá trị kỳ dị bắt đầu giảm chậm lại.
Độ suy giảm giá trị kỳ dị:
Chọn:
- Khi vẽ biểu đồ, điểm này là "khuỷu tay".
4.3 Phương pháp dựa trên kinh nghiệm (Heuristic)
- Nếu số đặc trưng nhỏ :
- Nếu số chiều nhỏ hơn 10, giữ nguyên số chiều.
- Nếu lớn hơn 10, chọn .
- Nếu số đặc trưng lớn :
- Trong thực tế, thường trong khoảng .
- Nếu số user lớn , chọn .
Phương pháp | Cách tiếp cận | Ưu điểm | Nhược điểm |
---|---|---|---|
Explained Variance | Chọn sao cho tổng phương sai >90% | Giữ tối đa thông tin | Có thể không có rõ ràng |
Elbow Method | Tìm "khuỷu tay" trên đồ thị kỳ dị | Trực quan, dễ áp dụng | Không phải lúc nào cũng rõ ràng |
Heuristic | Quy tắc 10-100 hoặc 20% | Dễ, nhanh, dễ áp dụng | Không tối ưu từng bộ dữ liệu |