1. 问题介绍
协同过滤算法是一种常用的推荐系统算法,在电商、音乐、电影等领域有着广泛应用。其核心思想是根据用户与其他用户或物品之间的相似性,将用户的行为数据转化为对物品的推荐结果。本文将详细介绍协同过滤算法的原理、公式推导、计算步骤以及Python代码实现。
2. 算法原理
协同过滤算法基于两个重要的假设:1) 用户有相似的品味;2) 如果某个用户A在过去喜欢某两个物品,而另一个用户B也喜欢其中一个物品,那么用户B很有可能也会喜欢另一个物品。
基于上述假设,协同过滤算法可以分为两种类型:基于用户的协同过滤(User-based Collaborative Filtering,简称UBCF)和基于物品的协同过滤(Item-based Collaborative Filtering,简称IBCF)。
-
UBCF:该方法根据用户与其他用户之间的相似性,推荐与该用户相似的其他用户喜欢的物品。核心计算过程是通过计算用户之间的相似度,然后根据相似度为目标用户推荐物品。
-
IBCF:该方法基于物品之间的相似性,推荐与目标用户已喜欢的物品相似的其他物品。核心计算过程是通过计算物品之间的相似度,然后根据相似度为目标用户推荐物品。
3. 公式推导
首先我们来推导UBCF的公式表示。对于两位用户$u$和$v$,其相似度可以使用皮尔逊相关系数(Pearson correlation coefficient)来计算,公式如下:
$$
Sim(u, v) = \frac{\sum_{i \in I_{uv}}(r_{ui} – \overline{r_u})(r_{vi} – \overline{r_v})}{\sqrt{\sum_{i \in I_{uv}}(r_{ui} – \overline{r_u})^2}\sqrt{\sum_{i \in I_{uv}}(r_{vi} – \overline{r_v})^2}}
$$
其中,$I_{uv}$表示用户$u$和用户$v$的共同评价物品集合,$r_{ui}$表示用户$u$对物品$i$的评分,$\overline{r_u}$表示用户$u$的平均评分。
根据相似度计算出的用户之间的相似度矩阵,可以通过以下公式预测目标用户$u$对物品$i$的评分:
$$
\hat{r}{ui} = \overline{r_u} + \frac{\sum{v \in N(u)}Sim(u, v)(r_{vi} – \overline{r_v})}{\sum_{v \in N(u)}|Sim(u, v)|}
$$
其中,$N(u)$表示与用户$u$相似的用户集合。
类似地,我们来推导IBCF的公式表示。对于两件物品$i$和$j$,其相似度可以使用余弦相似度(Cosine similarity)来计算,公式如下:
$$
Sim(i, j) = \frac{N_{ij}}{\sqrt{N_i \cdot N_j}}
$$
其中,$N_{ij}$表示同时被物品$i$和物品$j$评价的用户数,$N_i$和$N_j$分别表示评价物品$i$和物品$j$的用户数。
根据相似度计算出的物品之间的相似度矩阵,可以通过以下公式预测目标用户$u$对物品$i$的评分:
$$
\hat{r}{ui} = \frac{\sum{j \in R(u)}Sim(i, j)r_{uj}}{\sum_{j \in R(u)}|Sim(i, j)|}
$$
其中,$R(u)$表示用户$u$评价过的物品集合。
4. 计算步骤
基于上述公式推导,我们可以总结出协同过滤算法的计算步骤:
- 对于UBCF:
- 计算用户之间的相似度矩阵;
- 对于目标用户,根据相似度预测其对未评价物品的评分;
-
根据预测评分进行推荐。
-
对于IBCF:
- 计算物品之间的相似度矩阵;
- 对于目标用户,根据相似度和用户评价过的物品的评分,预测其对未评价物品的评分;
- 根据预测评分进行推荐。
5. Python代码实现
下面是一个基于UBCF的协同过滤算法的Python代码示例。我们使用开源数据集MovieLens(ml-100k),其中包含了用户对电影的评分数据。具体实现采用Python的numpy库。
import numpy as np
def ubcf_recommendation(user_id, similarity_matrix, ratings_matrix, k):
user_ratings = ratings_matrix[user_id] # 获取目标用户的评分向量
unrated_items = np.where(user_ratings == 0)[0] # 获取目标用户未评价的物品索引
if len(unrated_items) == 0:
return "No recommendations available."
similarities = similarity_matrix[user_id] # 获取目标用户与其他用户的相似度向量
rated_users = np.where(similarities > 0)[0] # 获取与目标用户相似的用户索引
recommendations = []
for item_id in unrated_items:
item_ratings = ratings_matrix[:, item_id] # 获取该物品的所有评分向量
relevant_users = np.where(item_ratings > 0)[0] # 获取评价过该物品的用户索引
if len(relevant_users) == 0:
continue
weighted_sum = 0
for user in rated_users:
if user in relevant_users:
weighted_sum += similarities[user] artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls item_ratings[user]
predicted_rating = weighted_sum / np.sum(np.abs(similarities[rated_users]))
recommendations.append((item_id, predicted_rating))
recommendations.sort(key=lambda x: x[1], reverse=True) # 根据预测评分进行排序
return recommendations[:k] # 返回top-k个推荐物品
# 加载数据集
ratings = np.loadtxt('ratings.csv', dtype=int, delimiter=',') # 评分矩阵,每一行为一个用户对多个物品的评分
# 计算用户之间的相似度矩阵
similarity_matrix = np.zeros((ratings.shape[0], ratings.shape[0]))
for i in range(ratings.shape[0]):
for j in range(i+1, ratings.shape[0]):
items_i = ratings[i] != 0
items_j = ratings[j] != 0
common_items = items_i & items_j # 目标用户i和用户j共同评价的物品索引
if np.sum(common_items) > 0:
similarity = np.corrcoef(ratings[i, common_items], ratings[j, common_items])[0, 1]
similarity_matrix[i, j] = similarity_matrix[j, i] = similarity
# 对目标用户进行推荐
user_id = 0 # 目标用户的索引
k = 5 # 推荐物品数量
recommendations = ubcf_recommendation(user_id, similarity_matrix, ratings, k)
print("Recommended items for user", user_id, ":")
for rec in recommendations:
print("Item", rec[0], "- predicted rating:", rec[1])
以上代码首先加载数据集,然后根据公式计算用户之间的相似度矩阵。接下来,定义一个函数ubcf_recommendation
来根据相似度矩阵和评分矩阵,为目标用户进行推荐。最后,在主函数中指定目标用户的索引和推荐物品的数量,调用ubcf_recommendation
函数并打印推荐结果。
6. 代码细节解释
-
ratings
: 评分矩阵,每一行表示一个用户对多个物品的评分,0表示未评价。 -
similarity_matrix
: 相似度矩阵,每一行表示一个用户与其他用户的相似度。 -
ubcf_recommendation
: 基于UBCF的推荐函数。根据相似度矩阵、评分矩阵、目标用户索引和推荐物品数量,计算并返回推荐结果。 -
unrated_items
: 目标用户未评价的物品索引。 -
similarities
: 目标用户与其他用户的相似度向量。 -
rated_users
: 目标用户与其相似的用户索引。 -
recommendations
: 推荐结果列表,每个元素为一个物品ID和预测评分。 -
weighted_sum
: 评价过该物品的用户中,根据相似度加权后的评分和。 -
relevant_users
: 评价过该物品的用户索引。 -
predicted_rating
: 对目标用户的物品预测评分。 -
recommendations.sort()
: 根据预测评分对推荐结果进行排序。
总结
本文详细介绍了协同过滤算法是如何将用户行为数据转化为推荐结果的。首先,介绍了协同过滤算法的原理和两种类型(UBCF和IBCF)的特点。然后,推导了UBCF和IBCF的公式表示,并给出了计算步骤。最后,提供了一个基于UBCF的Python代码示例,并解释了代码的细节。通过阅读本文,读者可以深入了解协同过滤算法在推荐系统中的应用以及具体的实现细节。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/823923/
转载文章受原作者版权保护。转载请注明原作者出处!