推荐算法:基于物品的协同过滤与余弦相似矩阵(附python源码与项目)

本文主要是介绍推荐算法:基于物品的协同过滤与余弦相似矩阵(附python源码与项目),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、个性化推荐算法简介

项目地址

demo1传送门

demo2传送门

1、基于⽤户的协同过滤算法(UserCF)

该算法利⽤⽤户之间的相似性来推荐⽤户感兴趣的信息,个⼈通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的⽬的进⽽帮助别⼈筛选信息,回应不⼀定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。

但两个问题,⼀个是稀疏性,即在系统使⽤初期由于系统资源还未获得⾜够多的评价,很难利⽤这些评价来发现相似的⽤户。

另⼀个是可扩展性,随着系统⽤户和资源的增多,系统的性能会越来越差。

用户协同算法讲解传送门

2.基于物品的协同过滤算法(ItemCF)

内容过滤根据信息资源与⽤户兴趣的相似性来推荐商品,通过计算⽤户兴趣模型和商品特征向量之间的向量相似性,主动将相似度⾼的商品发送给该模型的客户。

由于每个客户都独⽴操作,拥有独⽴的特征向量,不需要考虑别的⽤户的兴趣,不存在评价级别多少的问题,能推荐新的项⽬或者是冷门的项⽬。

这些优点使得基于内容过滤的推荐系统不受冷启动和稀疏问题的影响。

二、基于物品的协同过滤算法以及流程

1、算法核心

通过分析用户行为记录(评分、购买、点击、浏览等行为)来计算两个物品的相似度,同时喜欢物品A和物品B的用户数越多,就认为物品A和物品B越相似。

2、流程
1.构建⽤户–>物品的对应表
2.构建物品与物品的关系矩阵(同现矩阵)
3.通过求余弦向量夹角计算物品之间的相似度,即计算相似矩阵
4.根据⽤户的历史记录,给⽤户推荐物品
3、构建用户与物品的对应关系表

如下表,⾏表⽰⽤户,列表⽰物品(电影),数字表⽰⽤户喜欢该物品的程度(评分)

用户\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
A512
B423.5
C24
D43
E43
4、构建物品与物品的关系矩阵(共现矩阵)

共现矩阵C表⽰同时喜欢两个物品的⽤户数,是根据⽤户物品对应关系表计算出来的。

如根据上⾯的⽤户物品关系表可以计算出如下的共现矩阵C:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香1111
逃学威龙1112
追龙11
他人笑我太疯癫2
喜欢你12
暗战12
5、计算相似矩阵

两个物品之间的相似度如何计算?

设|N(i)|表⽰喜欢物品i的⽤户数,|N(i)⋂N(j)|表⽰同时喜欢物品i,j的⽤户数,则物品i与物品j的相似度为:

在这里插入图片描述

利用公式计算物品之间的余弦相似矩阵如下:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香0.410.70.50.5
逃学威龙10.410.580.82
追龙0.710.58
他人笑我太疯癫0.82
喜欢你0.51.0
暗战0.51.0
6、给用户推荐物品

根据⽤户的历史记录,给⽤户推荐物品。

最终推荐的是什么物品,是由预测兴趣度决定的。

物品j预测兴趣度=⽤户喜欢的物品i的兴趣度×物品i和物品j的相似度

例如:A⽤户喜欢唐伯虎点秋香逃学威龙1追龙 ,兴趣度分别为5,1,2

在用户A的评分电影列表中只有唐伯虎点秋香喜欢你有相似度,推荐喜欢你的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有唐伯虎点秋香暗战有相似度,推荐暗战的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有逃学威龙1他人笑我太疯癫有相似度,推荐他人笑我太疯癫的预测兴趣度=1 x 0.82 =0.82

三、python实现代码

from math import sqrt
import operatordef similarity(data):# 1 构造物品:物品的共现矩阵N = {}  # 喜欢物品i的总⼈数C = {}  # 喜欢物品i也喜欢物品j的⼈数for user, item in data.items():for i, score in item.items():N.setdefault(i, 0)N[i] += 1C.setdefault(i, {})for j, scores in item.items():if j != i:C[i].setdefault(j, 0)C[i][j] += 1print("---1.构造的共现矩阵---")print('N:', N)print('C', C)# 2 计算物品与物品的相似矩阵W = {}for i, item in C.items():W.setdefault(i, {})for j, item2 in item.items():W[i].setdefault(j, 0)W[i][j] = C[i][j] / sqrt(N[i] * N[j])print("---2.构造的相似矩阵---")print(W)return Wdef recommandList(data, W, user, k=3, N=10):'''# 3.根据⽤户的历史记录,给⽤户推荐物品:param data: 用户数据:param W: 相似矩阵:param user: 推荐的用户:param k: 相似的k个物品:param N: 推荐物品数量:return:'''rank = {}for i, score in data[user].items():  # 获得⽤户user历史记录,如A⽤户的历史记录为{'唐伯虎点秋香': 5, '逃学威龙1': 1, '追龙': 2}for j, w in sorted(W[i].items(), key=operator.itemgetter(1), reverse=True)[0:k]:  # 获得与物品i相似的k个物品if j not in data[user].keys():  # 该相似的物品不在⽤户user的记录⾥rank.setdefault(j, 0)rank[j] += float(score) * w  # 预测兴趣度=评分*相似度print("---3.推荐----")print(sorted(rank.items(), key=operator.itemgetter(1), reverse=True)[0:N])return sorted(rank.items(), key=operator.itemgetter(1), reverse=True)[0:N]if __name__ == '__main__':# ⽤户,电影,评分data = {'用户A': {'唐伯虎点秋香': 5, '逃学威龙1': 1, '追龙': 2},'用户B': {'唐伯虎点秋香': 4, '喜欢你': 2, '暗战': 3.5},'用户C': {'逃学威龙1': 2, '他人笑我太疯癫': 4},'用户D': {'喜欢你': 4, '暗战': 3},'用户E': {'逃学威龙1': 4, '他人笑我太疯癫': 3}}W = similarity(data)  # 计算物品相似矩阵recommandList(data, W, '用户A', 3, 10)  # 推荐

输出:

---1.构造的共现矩阵---
N: {'唐伯虎点秋香': 2, '逃学威龙1': 3, '追龙': 1, '喜欢你': 2, '暗战': 2, '他人笑我太疯癫': 2}
C {'唐伯虎点秋香': {'逃学威龙1': 1, '追龙': 1, '喜欢你': 1, '暗战': 1}, '逃学威龙1': {'唐伯虎点秋香': 1, '追龙': 1, '他人笑我太疯癫': 2}, '追龙': {'唐伯虎点秋香': 1, '逃学威龙1': 1}, '喜欢你': {'唐伯虎点秋香': 1, '暗战': 2}, '暗战': {'唐伯虎点秋香': 1, '喜欢你': 2}, '他人笑我太疯癫': {'逃学威龙1': 2}}
---2.构造的相似矩阵---
{'唐伯虎点秋香': {'逃学威龙1': 0.4082482904638631, '追龙': 0.7071067811865475, '喜欢你': 0.5, '暗战': 0.5}, '逃学威龙1': {'唐伯虎点秋香': 0.4082482904638631, '追龙': 0.5773502691896258, '他人笑我太疯癫': 0.8164965809277261}, '追龙': {'唐伯虎点秋香': 0.7071067811865475, '逃学威龙1': 0.5773502691896258}, '喜欢你': {'唐伯虎点秋香': 0.5, '暗战': 1.0}, '暗战': {'唐伯虎点秋香': 0.5, '喜欢你': 1.0}, '他人笑我太疯癫': {'逃学威龙1': 0.8164965809277261}}
---3.推荐----
[('喜欢你', 2.5), ('暗战', 2.5), ('他人笑我太疯癫', 0.8164965809277261)]

关注我,我们一起成长~~

这篇关于推荐算法:基于物品的协同过滤与余弦相似矩阵(附python源码与项目)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674493

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地