推荐算法 - 协同过滤算法

news/2024/11/27 7:49:37/

协同过滤算法是常见的一种推荐算法,通过分析用户历史行为和对物品的偏好,从而预测用户可能喜欢或购买的物品。协同过滤算法主要分为两部分:基于用户的协同过滤(User-Based Collaborative Filtering)和基于物品的协同过滤(Item-Based Collaborative Filtering)。

基于用户的协同过滤算法

这种算法假设用户的兴趣可以由相似兴趣的其他用户来推测出来。算法的流程主要包括以下几个步骤:

  1. 计算用户之间的相似度。可以使用余弦相似度、皮尔逊相关系数等指标来计算用户之间的相似度。一般来说,相似度越高的用户,则他们之间的行为和偏好也越相似。

  2. 找到与目标用户最相似的 K 个用户。选择其中某个相似用户 U,则将该用户对其未评分过的物品按照相似度加权求和,作为对目标用户对该物品的推荐得分。

  3. 针对所有未被目标用户评分的物品,计算得分并进行排序,将得分最高的多个物品推荐给目标用户。

基于物品的协同过滤算法

与基于用户的协同过滤算法类似,这种算法则假设物品之间的相似度可以用来推测用户的评分和喜好。算法的流程主要包括以下几个步骤:

  1. 计算物品之间的相似度。可以使用余弦相似度、改进的余弦相似度等指标来计算物品之间的相似度。

  2. 针对目标用户评分过的物品,找出与之相似的物品作为备选推荐物品。

  3. 统计所有备选推荐物品的得分和,并将得分最高的多个物品推荐给目标用户。

代码示例

下面是一个基于 Python 的用户协同过滤算法示例,假设我们有如下的用户评分矩阵:

Item 1Item 2Item 3Item 4Item 5
User 1532
User 2424
User 35421
User 42154
User 5325

首先,我们定义一个函数来计算两个用户之间的相似度,这里使用皮尔逊相关系数:

from math import sqrt# 计算两个用户的皮尔逊相关系数
def pearson_correlation(user1, user2, ratings):# 找到共同评价过的物品common_items = {}for item in ratings[user1]:if item in ratings[user2]:common_items[item] = 1# 如果没有共同评价过的物品,则返回 0.0if len(common_items) == 0:return 0.0# 计算每个用户对共同评价物品的评分平均值avg1 = sum([ratings[user1][item] for item in common_items]) / float(len(common_items))avg2 = sum([ratings[user2][item] for item in common_items]) / float(len(common_items))# 计算皮尔逊相关系数numerator = sum([(ratings[user1][item]-avg1)*(ratings[user2][item]-avg2) for item in common_items])denominator = sqrt(sum([(ratings[user1][item]-avg1)**2 for item in common_items])) * sqrt(sum([(ratings[user2][item]-avg2)**2 for item in common_items]))if denominator == 0:return 0.0else:return numerator / denominator

然后,我们定义一个函数来计算某个用户与其他所有用户之间的相似度,并返回一个由相似度和用户组成的元组列表:

# 找到与指定用户最相似的 top_n 个用户
def find_similar_users(user, ratings, top_n):scores = [(pearson_correlation(user, other, ratings), other)for other in ratings if other != user]scores.sort(reverse=True)  # 按照相似度从高到低排序return scores[0:top_n]     # 返回 top n 个相似用户

接下来,我们可以定义一个函数来预测某个用户对某个物品的评分。这个函数会基于与该用户相似度最高的 top_n 个用户的评分来进行加权平均:

# 对指定用户未评价的所有物品进行评分预测
def predict_ratings(user, ratings, top_n):# 给出一个默认值(这里设为 3.0),表示用户没看过这部电影时的评分totals = {}sim_sums = {}for other in ratings:if other == user:continuesim = pearson_correlation(user, other, ratings)if sim <= 0:  # 忽略相似度为 0 或负数的用户,避免无用计算continuefor item in ratings[other]:if item not in ratings[user] or ratings[user][item] == 0:# 只对未评价的物品进行预测totals.setdefault(item, 0)totals[item] += ratings[other][item] * simsim_sums.setdefault(item, 0)sim_sums[item] += simrankings = [(total/sim_sums[item], item) for item, total in totals.items()]rankings.sort(reverse=True)  # 按照评分从高到低排序return rankings

最后,我们可以调用上述函数来为某个用户推荐电影。比如,如果要为 User 1 推荐一部电影,可以这样写:

# 假设ratings是一个由用户评分组成的字典,格式为{用户:{电影1:评分1,电影2:评分2...}}
# 获取与User 1最相似的前5个用户
similar_users = find_similar_users('User 1', ratings, 5) 
# 预测User 1对电影的评分
predicted_rating = predict_ratings('User 1', ratings, similar_users) 
# 推荐评分最高的电影
recommendations = sorted(predicted_rating.items(), key=lambda x: x[1], reverse=True) 
# 输出推荐的电影
print(recommendations[0][0]) 

http://www.ppmy.cn/news/116715.html

相关文章

文件夹加密超级大师的金钻加密和闪电加密有什么区别?

作为一款专业的文件夹加密软件&#xff0c;文件夹加密超级大师提供了5种文件加密类型&#xff0c;其中金钻加密和闪电加密在加密后效果看似差不多&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就来了解一下吧。 闪电加密更快速 当我们想要加密那些超级庞大的文件夹时…

TCP、UDP、IP、RTP头长度

各种协议的数据包头长度如下&#xff1a; UDP 头&#xff08;8 字节&#xff09; 源端口&#xff08;2 字节&#xff09;目标端口&#xff08;2 字节&#xff09;UDP 数据包长度&#xff08;2 字节&#xff09;校验和&#xff08;2 字节&#xff09; RTP 头&#xff08;12 字节…

刷机命令android手机刷机后,wifi无法使用的解决方法

刷机命令android手机刷机后&#xff0c;wifi无法使用的解决方法 https://blog.csdn.net/wxz1179503422/article/details/83031909

wifi连接如何adb,或者提示由于目标计算机积极拒绝 无法连接

步骤&#xff1a;电脑wifi连接adb 1.查看手机wifi的ip:wifi最好是电脑发出的wifi 2.cmd命令行 adb connect 192.168.191.2:5555 换成自己的ip adb devices 如果提示积极拒绝&#xff1a; 1.数据线连接电脑&#xff0c; 先adb shell 后setprop service.adb.tcp.p…

n8000 android8,三星发布最新android 8.0升级计划 最快11月部分升级

原标题&#xff1a;三星发布最新android 8.0升级计划 最快11月部分升级 近日不少主流机型都已经预装android 8.0操作系统&#xff0c;可是去年的那些主流机型还处于旧系统状态&#xff0c;手机厂商开始加紧为主流机型加入安卓8.0升级计划。现在最新消息&#xff0c;三星发布最新…

SAMSUNG,三星,N8000升级

本文是对《三星(Samsung) Galaxy NOTE N8000成功刷入Android 11&#xff08;亲自动手实践成功的记录&#xff09;》的有益补充。他的地址是https://blog.csdn.net/xiamiaogogogo/article/details/115563677?spm1001.2014.3001.5501 转发若有不妥&#xff0c;请告诉我删除便是…

三星n8000平板_三星平板电脑n8000怎么样

无论是学生还是已经在自己的工作岗位上奋斗的人&#xff0c;都已经离不开手机和电脑这两件电子产品了&#xff0c;基本上是这两件东西给人活着的意义&#xff0c;他们越来越相似&#xff0c;但是他们又各自有各自的优缺点。比如手机太小&#xff0c;一些要在电脑上运行的游戏或…

三星n8000平板_Samsung GALAXY Note 10.1 3G版 N8000

cn GT-N8000ZWACHN GT-N8000 {"softwares":[],"manuals":[{"description":"快速入门指南 (Android Icecream Sandwitch)","fileName":"GT-N8000_QSG_Open_China_Chi_Rev.1.1_120721_Screen.pdf","fileModifi…