协同过滤(Collaborative Filtering)算法是一种利用用户历史行为数据和物品属性之间的关系,预测用户对未知物品喜好程度的算法。它基于一个假设,即如果两个用户在过去喜欢的物品相似,那么他们在未来也可能会喜欢相似的物品。
协同过滤算法可以分为两种类型:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤
基于用户的协同过滤算法是通过对用户历史行为数据进行挖掘,找出具有相似兴趣爱好的用户群体,然后推荐这些用户喜欢的物品给目标用户。具体实现方式是计算目标用户与其他用户之间的相似度,然后选取相似度最高的用户作为邻居,最后根据邻居的评分数据生成推荐列表。
基于物品的协同过滤
基于物品的协同过滤算法是通过对物品属性之间的相似度进行计算,找出具有相似属性的物品,然后将这些物品推荐给目标用户。具体实现方式是计算物品之间的相似度,然后选取相似度最高的物品作为邻居,最后根据邻居的评分数据生成推荐列表。
协同过滤算法在面对大规模数据时,计算相似度矩阵的时间和空间复杂度较高,因此在实际应用中需要采用优化算法,如基于近似矩阵分解的协同过滤算法等。
import numpy as np
# 物品相似度计算函数(余弦相似度)
def cosine_similarity(item1, item2):
mask = np.logical_and(item1 != 0, item2 != 0) # 只考虑共同被用户评价过的物品
if np.sum(mask) == 0: # 如果没有共同被用户评价过的物品,相似度为0
return 0
return np.dot(item1, item2) / (np.linalg.norm(item1) * np.linalg.norm(item2))
# 推荐函数
def recommend(user_id, ratings, k=2):
n_items = ratings.shape[1]
similarities = np.zeros(n_items)
for i in range(n_items):
similarities[i] = cosine_similarity(ratings[:, user_id], ratings[:, i])
top_k_items = np.argsort(similarities)[-k:] # 相似度最高的k个物品
recommendations = np.zeros(n_items)
for i in top_k_items:
recommendations[i] = np.sum(ratings[:, i]) # 推荐物品的分数为用户对该物品的评分之和
return np.argsort(recommendations)[::-1] # 返回按推荐分数降序排列的物品索引
def main():
# 创建物品-用户评分矩阵
ratings = np.array([
[5, 3, 0, 1],
[4, 0, 4, 4],
[1, 1, 3, 2],
[0, 0, 4, 5],
[2, 2, 0, 0]
])
user_id = 0
recommended_items = recommend(user_id, ratings)
print(f"用户 {user_id} 的推荐物品顺序为:{recommended_items}")
if __name__ == "__main__":
main()
创建了一个简单的物品-用户评分矩阵 ratings,其中行表示物品,列表示用户,数值表示评分(0表示未评价)。然后定义了物品相似度计算函数 cosine_similarity,使用余弦相似度来计算物品之间的相似度。 通过 recommend 函数来进行推荐。该函数接受用户ID、评分数据和可选参数k(指定要考虑的邻居数量,默认为2),计算用户对各个物品的评分与其他物品的相似度,并选择相似度最高的k个物品作为邻居。然后根据邻居物品的评分计算推荐物品的分数,并返回按分数降序排列的物品索引。
# 推荐函数
def recommend(user_id, ratings, k=2):
n_items = ratings.shape[1]
similarities = np.zeros(n_items)
for i in range(n_items):
similarities[i] = cosine_similarity(ratings[:, user_id], ratings[:, i])
top_k_items = np.argsort(similarities)[-k:] # 相似度最高的k个物品
recommendations = np.zeros(n_items)
for i in top_k_items:
recommendations[i] = np.sum(ratings[:, i]) # 推荐物品的分数为用户对该物品的评分之和
return np.argsort(recommendations)[::-1] # 返回按推荐分数降序排列的物品索引
推荐函数 recommend 的输入参数为用户ID、评分数据和可选参数k,其中k指定要考虑的邻居数量(即相似度最高的前k个物品)。