推荐算法:基于物品的协同过滤与余弦相似矩阵(附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中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python