问题介绍
在过滤算法中,协同过滤和基于内容过滤是两种常见的推荐系统算法。它们的目标都是根据用户的历史行为来预测用户对未知物品的喜好程度。两种算法的主要区别在于它们对用户和物品的表示方式和相似度度量的不同。
协同过滤算法
协同过滤算法基于用户-物品之间的相互作用来进行推荐。其核心思想是,如果两个用户对一些物品有相似的喜好,那么这些物品对其中一个用户而言也是有吸引力的。协同过滤算法主要分为两种类型:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤算法
基于用户的协同过滤算法首先构建一个用户-物品评分矩阵,其中行表示用户,列表示物品,每个元素表示用户对物品的评分。用户之间的相似度可以通过计算它们的评分向量之间的余弦相似度来度量。
算法原理
- 计算用户之间的相似度。对于每对用户i和j,可以通过计算它们的评分向量之间的余弦相似度来度量它们的相似度。假设用户i的评分向量为$$P_i$$,用户j的评分向量为$$P_j$$,则余弦相似度可通过以下公式计算:
$$
\text{similarity}(i,j) = \frac{{P_i \cdot P_j}}{{\|P_i\|_2 \|P_j\|_2}}
$$
其中$$\cdot$$表示向量的点积,$$\|P_i\|_2$$表示向量$$P_i$$的2范数。
- 预测用户对未知物品的评分。对于用户i未评分的物品,可以通过以下公式来预测用户i对物品k的评分:
$$
\hat{r}{ik} = \frac{{\sum\limits{j \in N_i} \text{similarity}(i,j) \cdot r_{jk}}}{{\sum\limits_{j \in N_i} |\text{similarity}(i,j)|}}
$$
其中$$N_i$$表示与用户i最相似的k个用户的集合,$$r_{jk}$$表示用户j对物品k的实际评分。
计算步骤
- 构建用户-物品评分矩阵。
- 计算用户之间的相似度矩阵。
- 对于每个用户未评分的物品,根据公式计算预测评分。
- 为每个用户生成Top-N推荐列表。
Python代码示例
import numpy as np
def user_based_collaborative_filtering(ratings, k=5):
# 构建用户-物品评分矩阵
rating_matrix = np.zeros((ratings.shape[0], ratings.shape[1]))
for rating in ratings:
user_id = rating[0]
item_id = rating[1]
score = rating[2]
rating_matrix[user_id, item_id] = score
# 计算用户之间的相似度矩阵
similarity_matrix = np.zeros((ratings.shape[0], ratings.shape[0]))
for i in range(ratings.shape[0]):
for j in range(ratings.shape[0]):
if i != j:
similarity_matrix[i, j] = np.dot(rating_matrix[i], rating_matrix[j]) / (
np.linalg.norm(rating_matrix[i]) 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 np.linalg.norm(rating_matrix[j]))
# 预测用户对未知物品的评分
predicted_ratings = np.zeros((ratings.shape[0], ratings.shape[1]))
for i in range(ratings.shape[0]):
for j in range(ratings.shape[1]):
if rating_matrix[i, j] == 0:
numerator = 0
denominator = 0
similarities = similarity_matrix[i].argsort()[::-1][:k]
for similarity_index in similarities:
similarity = similarity_matrix[i, similarity_index]
rating = rating_matrix[similarity_index, j]
numerator += similarity 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 rating
denominator += abs(similarity)
predicted_ratings[i, j] = numerator / denominator
return predicted_ratings
代码细节解释
- 构建用户-物品评分矩阵需要将原始评分数据转换为一个二维数组,其中行表示用户,列表示物品,元素表示用户对物品的评分。
- 计算用户之间的相似度矩阵需要遍历所有用户对,并通过余弦相似度公式计算相似度。
- 预测用户对未知物品的评分需要对每个用户未评分的物品进行计算。计算过程中,先找出与该用户最相似的k个用户,然后根据公式计算预测评分。
基于内容过滤算法
基于内容过滤算法是一种基于物品属性进行推荐的方法。它通过比较物品之间的相似性来进行推荐,而不依赖于用户行为数据。基于内容过滤算法的核心思想是,如果两个物品在属性上相似,那么它们对同一个用户而言也是有相似吸引力的。
算法原理
- 提取物品的属性特征。对于每个物品,可以通过提取它们的属性特征向量来表示。
- 计算物品之间的相似度。可以使用余弦相似度等方法来计算物品之间的相似度。
- 针对用户的喜好和物品的属性特征,推荐相似的物品。
基于内容过滤算法的核心在于如何提取物品的属性特征和计算物品之间的相似度。这些过程通常需要基于具体应用场景进行定制。
Python代码示例
import numpy as np
def content_based_filtering(items, k=5):
# 计算物品之间的相似度矩阵
similarity_matrix = np.zeros((len(items), len(items)))
for i in range(len(items)):
for j in range(len(items)):
if i != j:
similarity_matrix[i, j] = np.dot(items[i], items[j]) / (np.linalg.norm(items[i]) 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 np.linalg.norm(items[j]))
# 根据相似度矩阵生成Top-N推荐列表
recommended_items = []
for i in range(len(items)):
similarities = similarity_matrix[i].argsort()[::-1][:k]
for similarity_index in similarities:
if similarity_index != i and similarity_index not in recommended_items:
recommended_items.append(similarity_index)
if len(recommended_items) == k:
break
return recommended_items
总结
协同过滤和基于内容过滤是两种常见的过滤算法。协同过滤算法根据用户-物品之间的相互作用进行推荐,而基于内容过滤算法根据物品的属性特征进行推荐。两种算法的区别主要在于对用户和物品的表示方式以及相似度度量的不同。协同过滤算法通过计算用户之间的相似度来预测用户对未知物品的评分,而基于内容过滤算法则根据物品的属性特征计算物品之间的相似度。在实际应用中,可以选择合适的算法来根据具体场景进行推荐。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/823704/
转载文章受原作者版权保护。转载请注明原作者出处!