赞
踩
当我们做一些推荐系统网站时,通常需要合适的推荐算法,下面给大家介绍推荐系统中经典的推荐算法——协同过滤算法。在本文中通过Python语言,以一个图书推荐系统为案例,最终实现一个基于用户对图书的评分而对指定的用户个性化推荐的网站系统。(ps:本文中介绍的是算法的简单示例,如需项目功能扩展,可在最下方联系我)
协同过滤是一种常用于推荐系统中的算法,用于预测用户可能感兴趣的物品或内容。它的核心思想是基于用户行为和相似性来进行预测,而不依赖于物品或用户的内容特征。协同过滤算法根据用户和物品之间的交互历史,发现用户之间的相似性或物品之间的相似性,从而为用户生成个性化的推荐列表。
协同过滤算法可以分为两种主要类型:基于用户的协同过滤和基于物品的协同过滤。
协同过滤算法的优点在于它能够捕捉用户和物品之间的复杂关系,从而提供个性化的推荐。然而,它也面临一些挑战,比如“冷启动”问题(新用户或新物品如何进行推荐)、数据稀疏性(用户和物品之间的交互数据可能非常少)、推荐偏差(可能会忽视一些长尾物品)等。
在本文中通过使用Django框架作为网站开发的后端框架。其数据表模型结构如下:
db_user_info
:用户信息表db_book
:书籍表db_rating
:书籍评分表在本文中通过使用基于用户的协同过滤算法,在计算相似度时选用余弦相似度计算公式。余弦相似度衡量两个向量之间的方向一致程度。在这里,向量是用户对共同评价过的图书的评分。余弦相似度计算公式为:
c
o
s
i
n
e
s
i
m
i
l
a
r
i
t
y
=
∑
i
u
s
e
r
1
_
s
c
o
r
e
s
[
i
]
×
u
s
e
r
2
_
s
c
o
r
e
s
[
i
]
∑
i
u
s
e
r
1
_
s
c
o
r
e
s
[
i
]
2
×
∑
i
u
s
e
r
2
_
s
c
o
r
e
s
[
i
]
2
cosine_similarity = \frac{\sum_{i} user1\_scores[i] \times user2\_scores[i]}{\sqrt{\sum_{i} user1\_scores[i]^2} \times \sqrt{\sum_{i} user2\_scores[i]^2}}
cosinesimilarity=∑iuser1_scores[i]2
×∑iuser2_scores[i]2
∑iuser1_scores[i]×user2_scores[i]
代码如下:
def calculate_cosine_similarity(user_ratings1, user_ratings2): # 将用户1的图书评分存入字典,键为图书ID,值为评分 book_ratings1 = {rating.book_id: rating.score for rating in user_ratings1} # 将用户2的图书评分存入字典,键为图书ID,值为评分 book_ratings2 = {rating.book_id: rating.score for rating in user_ratings2} # 找出两个用户共同评价过的图书 common_books = set(book_ratings1.keys()) & set(book_ratings2.keys()) if len(common_books) == 0: return 0.0 # 无共同评价的图书,相似度为0 # 提取共同评价图书的评分,存入NumPy数组 user1_scores = np.array([book_ratings1[book_id] for book_id in common_books]) user2_scores = np.array([book_ratings2[book_id] for book_id in common_books]) # 计算余弦相似度 cosine_similarity = np.dot(user1_scores, user2_scores) / ( np.linalg.norm(user1_scores) * np.linalg.norm(user2_scores)) return cosine_similarity
其中,user1_scores 和 user2_scores 是两个用户的评分向量,i 是共同评价过的图书的索引。实现步骤如下:
首先遍历所用其他的用户,对于每个其他用户计算与目标用户的余弦相似度。如果相似度大于0,那么遍历其他用户评价的图书,创建推荐记录包括加权评分和相似度。然后按照分数大小降序排列。将对应的图书名称信息等返回给用户。
Python网站开发、项目订制、请扫下方名片
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。