Skip to content

Dashboard

Xây dựng hệ thống Recommender System cơ bản

Created by Admin

1. GIỚI THIỆU

Recommender System là một trong những ứng dụng phổ biến nhất của khoa học dữ liệu ngày nay. Chúng được sử dụng để dự đoán "rating" hoặc "preference" mà người dùng sẽ dành cho một mặt hàng. Hầu hết mọi công ty công nghệ lớn đều đã áp dụng chúng dưới nhiều hình thức. Hầu hết mọi công ty công nghệ lớn đều đã áp dụng chúng dưới một số hình thức.

  • Amazon sử dụng nó để đề xuất sản phẩm cho khách hàng
  • Netflix sử dụng gợi ý phim cho người dùng
  • YouTube sử dụng nó để đề xuất các video và quyết định video sẽ phát tiếp theo trên chế độ tự động phát
  • Facebook sử dụng nó để gợi ý kết bạn, đề xuất các trang để thích và mọi người theo dõi. Qua bài viết lần này, chúng ta sẽ tìm hiểu tổng quan cách thức hoạt động và xây dựng một hệ thống Recommender System. Từ đó ứng dụng vào thực tế với bộ dữ liệu của Movilens, sử dụng Python kèm các thư viện NumPy, Pandas, Scikit-Learn để xây dựng hệ thống Recommender System cơ bản

2. TỔNG QUAN VỀ RECOMMENDER SYSTEM

Một hệ thống gợi ý phim thường được chia thành 3 quá trình chính:

  • Bước 1: Tìm các đặc trưng (features) có ảnh hưởng đến việc đánh giá của người dùng, thông qua việc phân tích và thăm dò dữ liệu
  • Bước 2: Phân tích và áp dụng giải thuật filtering phù hợp
  • Bước 3: Tiến hành training mô hình Nhìn chung, hệ thống Recommender System có thể được chia thành 4 loại chính:
  • Simple Recommenders: Đưa ra các đề xuất tổng quát cho mọi người dùng, dựa trên mức độ phổ biến và/hoặc thể loại phim. Ý tưởng cơ bản đằng sau hệ thống này là những bộ phim nổi tiếng hơn và được giới phê bình đánh giá cao hơn sẽ có xác suất được khán giả bình thường thích cao hơn. Một ví dụ có thể là IMDB Top 250.
  • Content-based Recommenders: Đề xuất các mặt hàng tương tự dựa trên một mặt hàng cụ thể. Hệ thống này sử dụng siêu dữ liệu mục, chẳng hạn như thể loại, đạo diễn, mô tả, diễn viên, v.v. cho phim, để đưa ra các đề xuất này. Ý tưởng chung đằng sau các hệ thống giới thiệu này là nếu một người thích một mặt hàng cụ thể, họ cũng sẽ thích một mặt hàng tương tự với nó. Và để khuyến nghị điều đó, nó sẽ sử dụng siêu dữ liệu mục trước đây của người dùng. Một ví dụ điển hình có thể là YouTube, nơi dựa trên lịch sử của bạn, nó gợi ý cho bạn những video mới mà bạn có thể xem.
  • Collaborative filtering Recommenders: Những hệ thống này được sử dụng rộng rãi và chúng cố gắng dự đoán “ratings” hoặc “preference” mà người dùng sẽ đưa ra một mặt hàng dựa trên xếp hạng trước đây và sở thích của những người dùng khác. Bộ lọc cộng tác không yêu cầu siêu dữ liệu mục giống như các bộ lọc dựa trên nội dung của nó.
  • Hybrid Recommenders: Hybrid Filtering là sự kết hợp của hai giải thuật Content-based Filtering và Collaborative Filtering: Hybrid Filtering được sử dụng mềm dẻo khi hệ thống Collaborative Filtering không có các hành vi (ratings), khi đó hệ thống sẽ sử dụng Content-based Filtering và ngược lại, khi Content-based Filtering không có các feature cần thiết trong việc đánh giá thì hệ thống sẽ sử dụng Collaborative Filtering để thay thế. Trong bài viết này, chúng ta sẽ tập trung giới thiệu và xây dựng 2 loại RS phổ biến là Content-based và Collaborative Filtering với Python và bộ dữ liệu Movilens

3. Xây dựng Content-based Filtering

Thuật toán

Với contented-based Recommender System, hệ thống sẽ đánh giá các đặc tính của items được recommended. Hệ thống sẽ gợi ý các item dựa trên hồ sơ (profiles) của người dùng hoặc dựa vào nội dung, thuộc tính (attributes) của những item tương tự như item mà người dùng đã chọn trong quá khứ. Ví dụ: một người rất thích ăn cam, vậy thì hệ thống gợi ý một loại trái cây tương tự với cam, ở đây là bưởi để đề xuất. Cách tiếp cận này yêu cầu việc sắp xếp các items vào từng nhóm hoặc đi tìm các đặc trưng của từng item. Một ví dụ khác, khi người dùng xem phim Cảnh sát hình sự, hệ thống sẽ đề xuất phim Chạy án, cùng thuộc thể loại hình sự với bộ phim người dùng thích. Chính vì vậy, hệ thống chỉ cần biết người dùng xem phim nào chứ không cần dữ liệu về ratings, giúp nó hoạt động ngay cả khi người dùng không có thói quen đánh giá phim. Và tất nhiên nó chỉ đề xuất các bộ phim có tính chất tương tự mà không đề xuất đa dạng phim hay các bộ phim được cộng đồng xem phim đánh giá cao.

Thiết kế

a. Khởi tạo dữ liệu

Ta sử dụng dữ liệu của Movilens, cụ thể là file movies.csv: chứa thông tin về bộ phim (id phim, tên phim, thể loại). Một phim có thể có nhiều thể loại được ngăn cách bởi “|” hoặc không thuộc thể loại loại nào Để đọc file .csv của Movielens, ta sử dụng module read_csv của Pandas để đọc file và lưu thành dataframe.

import pandas
from pandas import read_csv

def get_dataframe_movies_csv(text):
    """
    đọc file csv của movilens, lưu thành dataframe với 3 cột user id, title, genres
    """
    movie_cols = ['movie_id', 'title', 'genres']
    movies = pandas.read_csv(text, sep=',', names=movie_cols, encoding='latin-1')
    return movies

b. Thiết lập ma trận TF - IDF

  • Mỗi item làm 1 bộ phim
  • Dựa trên thể loại của mỗi item, chúng ta cần xây dựng một bộ hồ sơ (profile) cho mỗi item. Profile này được biểu diễn dưới dạng toán học là một feature vector. Trong những trường hợp đơn giản, feature vector được trực tiếp trích xuất từ item:
    • Lọc ra các thể loại film
    • Xây dựng ma trận với với số dòng tương ứng với số lượng film và số cột tương ứng với số từ được tách ra từ "genres"
  • Xây dựng feature vector cho mỗi item dựa trên ma trận thể loại phim và feature TF-IDF
  • Về bản chất, TF - IDF là một thước đo thống kê đánh giá mức độ liên quan của một từ với một tài liệu trong bộ sưu tập tài liệu. Điều này được thực hiện bằng cách nhân hai số liệu: số lần một từ xuất hiện trong tài liệu và nghịch đảo tần suất tài liệu của từ trên một tập hợp tài liệu (hiểu đơn giản thì điểm TF-IDF là tần suất xuất hiện của một từ trong một tài liệu)
  • Sử dụng Class TfIdfVectorizer tạo ra ma trận TF - IDF:
    • Nhập module Tfidf bằng scikit-learning
    • Thay thế các giá trị not-a-number bằng một chuỗi trống
from sklearn.metrics.pairwise import linear_kernel
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas
from pandas import isnull, notnull

def tfidf_matrix(movies):
    """
        Dùng hàm "TfidfVectorizer" để chuẩn hóa "genres" với:
        + analyzer='word': chọn đơn vị trích xuất là word
        + ngram_range=(1, 1): mỗi lần trích xuất 1 word
        + min_df=0: tỉ lệ word không đọc được là 0
        Lúc này ma trận trả về với số dòng tương ứng với số lượng film và số cột tương ứng với số từ được tách ra từ "genres"
    """
    tf = TfidfVectorizer(analyzer='word', ngram_range=(1, 1), min_df=0)
    new_tfidf_matrix = tf.fit_transform(movies['genres'])
    return new_tfidf_matrix

c. Tính độ tương đồng giữa các item

− Tiếp theo, ta sử dụng độ tương tự cosine để tính toán một đại lượng số biểu thị sự giống nhau giữa hai phim. Chọn điểm tương tự cosine vì nó không phụ thuộc vào độ lớn và tương đối dễ dàng để tính toán (đặc biệt khi được sử dụng kết hợp với điểm TF - IDF).

def cosine_sim(matrix):
    """
            Dùng hàm "linear_kernel" để tạo thành ma trận hình vuông với số hàng và số cột là số lượng film
             để tính toán điểm tương đồng giữa từng bộ phim với nhau
    """
    new_cosine_sim = linear_kernel(matrix, matrix)
    return new_cosine_sim

− Chúng tôi sử dụng module linear_kernel () của sklearn thay vì cosine_similities () tốc độ xử lý của linear_kernal nhanh hơn. Kết quả thu được của chúng tôi là ma trận có hình dạng 9743x9743, có nghĩa là điểm tương đồng của mỗi tổng quan về cosine của mỗi bộ phim với mọi tổng quan của bộ phim khác. Do đó, mỗi bộ phim sẽ là một vectơ cột 1x9743 trong đó mỗi cột sẽ là một điểm tương đồng với mỗi bộ phim.

d. Kết quả

Sau khi đã có ma trận điểm tương đồng của các bộ phim, chúng tôi lấy ra được top bộ phim có điểm tương đồng cao nhất so với bộ phim được so sánh với các bước:

  • Lấy chỉ mục của bộ phim với tiêu đề của nó.
  • Nhận danh sách điểm tương đồng cosine của phim cụ thể đó với các bộ phim.
  • Sắp xếp danh sách các bộ giá trị nói trên dựa trên điểm số tương tự
  • Trả về các tiêu đề tương ứng với chỉ số của các phần tử trên cùng.
import pandas as pd
import function_package.content_base_function

class CB(object):
    """
        Khởi tại dataframe "movies" với hàm "get_dataframe_movies_csv"
    """
    def __init__(self, movies_csv):
        self.movies = function_package.read_data_function.get_dataframe_movies_csv(movies_csv)
        self.tfidf_matrix = None
        self.cosine_sim = None

    def build_model(self):
        """
            Tách các giá trị của genres ở từng bộ phim đang được ngăn cách bởi '|'
        """
        self.movies['genres'] = self.movies['genres'].str.split('|')
        self.movies['genres'] = self.movies['genres'].fillna("").astype('str')
        self.tfidf_matrix = function_package.content_base_function.tfidf_matrix(self.movies)
        self.cosine_sim = function_package.content_base_function.cosine_sim(self.tfidf_matrix)

    def refresh(self):
        """
             Chuẩn hóa dữ liệu và tính toán lại ma trận
        """
        self.build_model()

    def fit(self):
        self.refresh()

    def genre_recommendations(self, title, top_x):
        """
            Xây dựng hàm trả về danh sách top film tương đồng theo tên film truyền vào:
            + Tham số truyền vào gồm "title" là tên film và "topX" là top film tương đồng cần lấy
            + Tạo ra list "sim_score" là danh sách điểm tương đồng với film truyền vào
            + Sắp xếp điểm tương đồng từ cao đến thấp
            + Trả về top danh sách tương đồng cao nhất theo giá trị "topX" truyền vào
        """
        titles = self.movies['title']
        indices = pd.Series(self.movies.index, index=self.movies['title'])
        idx = indices[title]
        sim_scores = list(enumerate(self.cosine_sim[idx]))
        sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
        sim_scores = sim_scores[1:top_x + 1]
        movie_indices = [i[0] for i in sim_scores]
        return sim_scores, titles.iloc[movie_indices].values

    def print_recommendations(self, text, top_x):
        """
            In ra top film tương đồng với film truyền vào
        """
        print(self.genre_recommendations(text, top_x))

4. Xây dựng Collaborative Filtering

Như chúng tôi đã trình bày ở trên, content-based chỉ đề xuất các bộ phim có tính chất tương tự mà không đề xuất đa dạng phim hay các bộ phim được cộng đồng xem phim đánh giá cao. Bên cạnh đó, contented-based Recommender System trên có hai nhược điểm:

  • Thứ nhất, khi xây dựng mô hình cho một user, các hệ thống Content-based không tận dụng được thông tin từ các users khác. Những thông tin này thường rất hữu ích vì hành vi mua hàng của các users thường được nhóm thành một vài nhóm đơn giản; nếu biết hành vi mua hàng của một vài users trong nhóm, hệ thống sẽ suy luận ra hành vi của những users còn lại.
  • Thứ hai, không phải lúc nào chúng ta cũng có bản mô tả cho mỗi item. Việc yêu cầu users gắn tags còn khó khăn hơn vì không phải ai cũng sẵn sàng làm việc đó; hoặc có làm nhưng sẽ mang xu hướng cá nhân. Các thuật toán NLP cũng phức tạp hơn ở việc phải xử lý các từ gần nghĩa, viết tắt, sai chính tả, hoặc được viết ở các ngôn ngữ khác nhau. Những nhược điểm phía trên có thể được giải quyết bằng Collaborative Filtering. Để có thể xây dựng được một hệ thống Collapborative Filtering, chúng ta 2 hướng tiếp cận:
  • Một là xác định mức độ quan tâm của mỗi user tới một item dựa trên mức độ quan tâm của users gần giống nhau (similar users) tới item đó còn được gọi là User-user collaborative filtering.
  • Hai là thay vì xác định user similarities, hệ thống sẽ xác định item similarities. Từ đó, hệ thống gợi ý những items gần giống với những items mà user có mức độ quan tâm cao. Sau đây chúng ta sẽ tiếp cận theo hướng user-user.

Thuật toán

Ý tưởng cơ bản của thuật toán này là dự đoán mức độ yêu thích của một user đối với một item dựa trên các users khác “gần giống” với user đang xét. Việc xác định độ “giống nhau” giữa các users có thể dựa vào mức độ quan tâm (rating) của các users này với các items khác mà hệ thống đã biết trong quá khứ Ví dụ: Hai users A, B đều thích các phim về cảnh sát hình sự (tức là đều đánh giá các bộ phim thuộc thể loại này 4 -> 5 sao). Dựa vào lịch sử xem phim của B, ta thấy B thích bộ phim “Người phán xử”, vậy nhiều khả năng A cũng thích phim này, từ đó hệ thống sẽ đề xuất “Người phán xử” cho A.

Thiết kế

a. Khởi tạo ma trận dữ liệu user - item

Đối với Collaborative filtering, chúng tôi sử dụng 3 thành phần dữ liệu là user, movies và ratings (1), cụ thể:

  • Users: là danh sách người dùng
  • Movies: là danh sách các phim, mỗi phim có thể kèm theo thông tin mô tả.
  • Ratings: là số điểm user đánh giá cho các bộ phim Để lưu trữ được 3 thành phần dữ liệu trên, chúng tôi tiếp tục sử dụng module read_csv của Pandas để lưu trữ, chúng tôi gọi là ma trận user – items. Cụ thể, ma trận user - items biểu diễn mức độ quan tâm (rating) của user với mỗi item. Ma trận này được xây dựng từ dữ liệu (1).
import pandas
from pandas import read_csv
def get_dataframe_ratings_base(text):
    """
    đọc file base của movilens, lưu thành dataframe với 3 cột user id, item id, rating
    """
    r_cols = ['user_id', 'item_id', 'rating']
    ratings = pandas.read_csv(text, sep='\t', names=r_cols, encoding='latin-1')
    Y_data = ratings.values
    return Y_data

Ma trận này có rất nhiều các giá trị miss. Nhiệm vụ của hệ thống là dựa vào các ô đã có giá trị trong ma trận trên (dữ liệu thu được từ trong quá khứ), thông qua mô hình đã được xây dựng, dự đoán các ô còn trống (của user hiện hành), sau đó sắp xếp kết quả dự đoán (ví dụ, từ cao xuống thấp) và chọn ra Top-N items theo thứ tự rating giảm dần, từ đó gợi ý chúng cho người dùng.

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
class CF(object):
    """
    class Collaborative Filtering, hệ thống đề xuất dựa trên sự tương đồng
    giữa các users với nhau, giữa các items với nhau
    """
    def __init__(self, data_matrix, k, dist_func=cosine_similarity, uuCF=1):
        """
        Khởi tạo CF với các tham số đầu vào:
            data_matrix: ma trận Utility, gồm 3 cột, mỗi cột gồm 3 số liệu: user_id, item_id, rating.
            k: số lượng láng giềng lựa chọn để dự đoán rating.
            uuCF: Nếu sử dụng uuCF thì uuCF = 1 , ngược lại uuCF = 0. Tham số nhận giá trị mặc định là 1.
            dist_f: Hàm khoảng cách, ở đây sử dụng hàm cosine_similarity của klearn.
            limit: Số lượng items gợi ý cho mỗi user. Mặc định bằng 10.
        """
        self.uuCF = uuCF  # user-user (1) or item-item (0) CF
        self.Y_data = data_matrix if uuCF else data_matrix[:, [1, 0, 2]]
        self.k = k
        self.dist_func = dist_func
        self.Ybar_data = None
        # số lượng user và item, +1 vì mảng bắt đầu từ 0
        self.n_users = int(np.max(self.Y_data[:, 0])) + 1
        self.n_items = int(np.max(self.Y_data[:, 1])) + 1

b. Chuẩn hóa ma trận user - item

Để có thể sử dụng ma trận này vào việc tính toán, chúng tôi cần thay những dấu ‘?’ bởi một giá trị. Đơn giản nhất có thể thay giá trị ‘0’ hay một cách khác là ‘2.5’ – giá trị trung bình giữa 0 và 5. Tuy nhiên, cách tính này có độ chính xác thấp vì những giá trị này sẽ hạn chế với những users dễ hoặc khó tính. Thay vào đó, nhóm sử dụng giá trị trung bình cộng ratings của mỗi user bằng cách trừ ratings của mỗi user cho giá trị trung bình ratings tương ứng của user đó và thay dấu ‘?’ bằng giá trị 0. Mục đích của cách xử lý này là:

  • Phân loại ratings thành 2 loại: giá trị âm (user không thích item) và dương (user thích item). Các giá trị bằng 0 là những item chưa được đánh giá.
  • Số chiều của Utility matrix thường rất lớn, trong khi lượng ratings biết trước thường rất nhỏ so với kích thước của ma trận. Nếu thay dấu ‘?’ bằng ‘0’ thì chúng ta có thể sử dụng sparce matrix, tức ma trận chỉ lưu các giá trị khác 0 và vị trí của giá trị đó. Như vậy, việc lưu trữ sẽ tối ưu hơn
def normalize_matrix(self):
        """
        Tính similarity giữa các items bằng cách tính trung bình cộng ratings giữa các items.
        Sau đó thực hiện chuẩn hóa bằng cách trừ các ratings đã biết của item cho trung bình cộng
        ratings tương ứng của item đó, đồng thời thay các ratings chưa biết bằng 0.
        """
        users = self.Y_data[:, 0]
        self.Ybar_data = self.Y_data.copy()
        self.mu = np.zeros((self.n_users,))
        for n in range(self.n_users):
            ids = np.where(users == n)[0].astype(np.int32)
            item_ids = self.Y_data[ids, 1]
            ratings = self.Y_data[ids, 2]
            # take mean
            m = np.mean(ratings)
            if np.isnan(m):
                m = 0  # để tránh mảng trống và nan value
            self.mu[n] = m
            # chuẩn hóa
            self.Ybar_data[ids, 2] = ratings - self.mu[n]
        self.Ybar = sparse.coo_matrix((self.Ybar_data[:, 2],
                                       (self.Ybar_data[:, 1], self.Ybar_data[:, 0])), (self.n_items, self.n_users))
        self.Ybar = self.Ybar.tocsr()

c. Tính độ tương đồng giữa các item

Sau khi chuẩn hóa ma trận Utility, ta tính toán độ tương đồng giữa các users. Chúng tôi sử dụng hàm cosine similarity (hàm có sẵn của thư viện sklearn của Python):

def similarity(self):
        """
        Tính độ tương đồng giữa các user và các item
        """
        self.S = self.dist_func(self.Ybar.T, self.Ybar.T)

d. Dự đoán ratings của user

Nhóm sẽ dự đoán ratings của một user với mỗi item dựa trên k users gần nhất (neighbor users), tương tự như phương pháp K-nearest neighbors (KNN). Trong đó, N(u, i) là tập k users gần nhất (có độ tương đồng cao nhất) với user u và đã từng đánh giá item i. Ví dụ, chúng tôi dự đoán normalized rating của user u1 cho item i1 với k = 2 là số users gần nhất.

  • Bước 1: Xác định các users đã rated cho i1, đó là u0, u3, u5
  • Bước 2: Lấy similarities của u1 với u0, u3, u5. Kết quả lần lượt là: {u0, u3, u5: {0.83, -0.4, -0.23}. Với k = 2. Chọn 2 giá trị lớn nhất là 0.83 và -0.23, tương ứng với các users u0, u5. Hai users này có normalized ratings với i1 là: {u0, u5} {0.75, 0.5}
  • Bước 3: Tính normalized ratings theo (2): Thực hiện dự đoán cho các trường hợp missing ratings (chưa có dự đoán), ta sẽ thu được ma trận normalized ratings matrix như ví dụ: Cuối cùng, cộng lại các giá trị ratings với ratings trung bình (ở bước chuẩn hóa) theo từng cột. Chúng ta sẽ thu được ma trận hoàn thiện.
def __pred(self, u, i, normalized=1):
        """
        Dự đoán ra ratings của các users với mỗi items.
        """
        # tìm tất cả user đã rate item i
        ids = np.where(self.Y_data[:, 1] == i)[0].astype(np.int32)
        users_rated_i = (self.Y_data[ids, 0]).astype(np.int32)
        sim = self.S[u, users_rated_i]
        a = np.argsort(sim)[-self.k:]
        nearest_s = sim[a]
        r = self.Ybar[i, users_rated_i[a]]
        if normalized:
            # cộng với 1e-8, để tránh chia cho 0
            return (r * nearest_s)[0] / (np.abs(nearest_s).sum() + 1e-8)

        return (r * nearest_s)[0] / (np.abs(nearest_s).sum() + 1e-8) + self.mu[u]

    def pred(self, u, i, normalized=1):
        """
        Xét xem phương pháp cần áp dùng là uuCF hay iiCF
        """
        if self.uuCF: return self.__pred(u, i, normalized)
        return self.__pred(i, u, normalized)

e. Kết quả

Sau khi chúng tôi đã dự đoán được ratings của các bộ phim mà người dùng sẽ đánh giá, chúng tôi lấy ra được top bộ phim mà user sẽ thích theo các bước:

  • Lấy id người dùng
  • Nhận danh sách rating của người dùng đối với các bộ phim chưa xem
  • Sắp xếp danh sách các bộ giá trị rating đó
  • Trả về các tiêu đề tương ứng với chỉ số của các phần tử trên cùng
def recommend_top(self, u, top_x):
        """
        Determine top 10 items should be recommended for user u.
        . Suppose we are considering items which
        have not been rated by u yet.
        """
        ids = np.where(self.Y_data[:, 0] == u)[0]
        items_rated_by_u = self.Y_data[ids, 1].tolist()
        item = {'id': None, 'similar': None}
        list_items = []

        def take_similar(elem):
            return elem['similar']
        for i in range(self.n_items):
            if i not in items_rated_by_u:
                rating = self.__pred(u, i)
                item['id'] = i
                item['similar'] = rating
                list_items.append(item.copy())

        sorted_items = sorted(list_items, key=take_similar, reverse=True)
        sorted_items.pop(top_x)
        return sorted_items

Vậy là ta đã xây dựng thành công Collaborative Filtering với hướng tiếp cận user-user. Bạn đã có thể thử một hướng tiếp cận khác đó chính là item-item.Trong phương pháp này, thay vì tính similarity giữa các users như trong uuCF, chúng ta sẽ tính similarity giữa các items, rồi gợi ý cho users những items gần giống với item mà user đó đã thích. Lợi ích của phương pháp này là:

  • Vì số lượng items thường rất nhỏ so với số lượng users nên kích thước ma trận Similarity sẽ nhỏ hơn rất nhiều, giúp tối ưu hơn cả về mặt lưu trữ và tốc độ tính toán.
  • Thường thì mỗi item được đánh giá bởi rất nhiều users, và con số này thường lớn hơn nhiều so với số items mà mỗi user đánh giá. Vì vậy, số giá trị đã biết trong một vector biểu diễn item sẽ lớn hơn nhiều so với một vector biểu diễn user. Trong trường hợp có thêm một số dữ liệu về ratings, giá trị trung bình ratings của iiCF sẽ ít thay đổi hơn so với uuCF, vì vậy sẽ ít phải cập nhật Similarity Matrix hơn. Về mặt tính toán, iiCF có thể thực hiện theo uuCF bằng cách chuyển vị ma trận Utility, coi như items đánh giá users. Sau khi tính được kết quả, chúng ta lại thực hiện chuyển vị một lần nữa sẽ thu được kết quả cuối cùng.

5. TỔNG KẾT

Như vậy, chúng tôi đã trình bày tổng quan về cách thức hoạt động của một hệ thống Recommender System, cách xây dựng một mô hình Recommender System cơ bản. Chúng tôi đã ứng dụng được nó vào thực tế với bộ dữ liệu của Movilens, sử dụng các thư viện NumPy, Pandas, Scikit-Learn để xây dựng 2 ví dụ minh họa hệ thống đề xuất phim với hai hướng tiếp cận là Content-based Recommender và Collaborative filtering Recommender với cả 2 hướng tiếp cận là user – user và item - item. Vì bài viết có hạn, các bạn có thể tham khảo source code và các tài liệu liên quan dưới để hiểu rõ hơn về Recommender System Source code demo

6. TÀI LIỆU THAM KHẢO

Source: https://viblo.asia/p/xay-dung-he-thong-recommender-system-co-ban-aWj53j3el6m