推荐系统算法02:通俗易懂协同过滤算法实现

协同过滤算法是一种经典的推荐算法,其基本思想是根据用户历史行为和兴趣,发现用户与物品之间的相似性,从而给用户推荐可能感兴趣的物品。

具体来说,协同过滤算法分为两种类型:基于用户的协同过滤和基于物品的协同过滤。

基于用户的协同过滤算法首先利用用户历史行为数据,构建用户-物品评分矩阵。然后,根据该矩阵中用户之间的相似性,计算当前用户与其他用户的相似度得分。最后,根据相似度得分,选择与当前用户最相似的K个用户,将这些用户评分高的物品推荐给当前用户。

基于物品的协同过滤算法与基于用户的协同过滤算法类似,但是它是基于物品之间的相似性来进行推荐的。具体来说,该算法首先利用用户历史行为数据,构建用户-物品评分矩阵。然后,根据该矩阵中物品之间的相似性,计算当前用户已评分物品与其他物品的相似度得分。最后,根据相似度得分,选择与当前用户已评分物品最相似的K个物品,将这些物品推荐给当前用户。

协同过滤算法的优点是能够根据用户行为和兴趣进行推荐,具有很好的个性化效果。同时,该算法也比较简单,易于实现和理解。但是,协同过滤算法也存在一些缺点,比如当数据集稀疏时,推荐的准确性和覆盖率可能较低;同时,当推荐物品数量较大时,算法的效率可能较低。

以下是一个基于Python的简单示例,演示了如何使用基于用户的协同过滤算法进行电影推荐。

import numpy as np

# 构建用户-电影评分矩阵
ratings = np.array([
    [4, 5, 0, 4, 0],
    [0, 4, 3, 0, 4],
    [3, 0, 0, 4, 3],
    [0, 3, 4, 0, 5],
    [5, 0, 3, 5, 0]
])

# 计算用户相似度矩阵
user_similarities = np.zeros((ratings.shape[0], ratings.shape[0]))
for i in range(ratings.shape[0]):
    for j in range(i+1, ratings.shape[0]):
        mask = (ratings[i] > 0) & (ratings[j] > 0)
        if np.sum(mask) > 0:
            similarity = np.sum(ratings[i][mask] * ratings[j][mask]) / np.sqrt(np.sum(ratings[i][mask]**2) * np.sum(ratings[j][mask]**2))
            user_similarities[i][j] = similarity
            user_similarities[j][i] = similarity

# 对每个用户进行电影推荐
for user_id in range(ratings.shape[0]):
    # 找到与该用户最相似的K个用户
    k = 2
    similarities = user_similarities[user_id]
    nearest_neighbors = similarities.argsort()[::-1][1:k+1]
    
    # 获取这些相似用户的电影评分
    neighbor_ratings = ratings[nearest_neighbors]
    
    # 计算推荐分数
    scores = np.sum(neighbor_ratings, axis=0)
    
    # 对未评分的电影进行推荐
    unrated_movies = np.where(ratings[user_id] == 0)[0]
    recommended_movies = scores.argsort()[::-1][:len(unrated_movies)]
    
    # 打印推荐结果
    print("User", user_id, "recommended movies:", recommended_movies)

矩阵说明:

ratings = np.array([
    [4, 5, 0, 4, 0],
    [0, 4, 3, 0, 4],
    [3, 0, 0, 4, 3],
    [0, 3, 4, 0, 5],
    [5, 0, 3, 5, 0]
])

用户-电影评分矩阵是协同过滤算法的基础,用于记录每个用户对每个电影的评分情况。在该矩阵中,每行代表一个用户,每列代表一部电影,矩阵中的每个元素表示相应用户对相应电影的评分。

例如,上述代码中构建的评分矩阵ratings是一个5×5的矩阵,代表了5个用户对5部电影的评分情况。具体来说,第一行表示第一个用户对5部电影的评分情况,其中4表示该用户对第一部电影的评分为4分,5表示该用户对第二部电影的评分为5分,0表示该用户未对第三部电影进行评分,4表示该用户对第四部电影的评分为4分,0表示该用户未对第五部电影进行评分。类似地,可以理解其他行和列的含义。

用户-电影评分矩阵是协同过滤算法的重要数据来源,其构建需要从真实数据中提取相应的用户-电影评分信息。在实际应用中,这个过程可能会面临一些挑战,比如数据稀疏性、数据的预处理和清洗等等。因此,在实际使用协同过滤算法时,需要对用户-电影评分矩阵进行适当的处理和优化,以提高推荐效果和算法的性能。

在上面的示例中,首先构建了一个5个用户和5部电影的评分矩阵。然后,计算了每个用户之间的相似度得分,并根据相似度得分为每个用户进行了电影推荐。具体来说,对于每个用户,我们首先找到与其最相似的K个用户,然后根据这些相似用户的电影评分,计算推荐分数。我们找到该用户未评分的电影,将推荐分数最高的几部电影推荐给该用户。

上述代码运行结果:

User 0 recommended movies: [4 2]
User 1 recommended movies: [3 0]
User 2 recommended movies: [2 3]
User 3 recommended movies: [3 0]
User 4 recommended movies: [1 4]

猜你喜欢

转载自blog.csdn.net/weixin_41194129/article/details/130283202