推荐系统——协同过滤

在这里插入图片描述

协同过滤

协同过滤算法一般是通过用户之前的喜好或者相似的用户的喜好来推荐商品

基于领域的协同过滤算法一般有两种算法:

  • 基于用户的协同过滤算法(UserCF):基于与用户相似用户的喜好进行推荐
  • 基于物品的协同过滤算法(ItemCF):基于用户喜好的物品寻找相似的物品进行推荐

对于以上两种算法而言,我们要进行相似性的对比,首先需要进行相似度的计算,为相似度的计算可以使用以下方法。

相似性度量方法

相似度度量可以使用很多指标,其本质还是计算不同事物之间的距离,那么距离越大,相似性越小,距离越小,相似性越大,那么,除了学习资料中提到的3个系数之外,我觉得也可以使用欧式距离,曼哈顿距离,切比雪夫距离等等。但在这里我就只说明学习资料中几个系数。其他指标可以参考https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html

  1. 杰卡德相似系数,给出定义

simuv=∣N(u)∩N(v)∣∣N(u)∣∪∣N(v)∣sim_{uv} = \frac{|N(u) \cap N(v)|}{|N(u)| \cup |N(v)|}simuv=N(u)N(v)N(u)N(v)

其中,N(u)代表喜欢物品u的用户的集合

  1. 余弦相似度

余弦相似度可以抽象的想象以下,两个向量在坐标系中的余弦夹角越小,那么它们的角度的余弦值就越接近于1,所以可以给出定义:

simuv=∣N(u)∣∩∣N(v)∣∣N(u)⋅∣N(v)∣sim_{uv} = \frac{|N(u)| \cap |N(v)|}{\sqrt{|N(u) \cdot |N(v)|}}simuv=N(u)N(v)N(u)N(v)

与杰卡德系数相比,余弦相似度的改变在于将分母中的“并”改变为“乘”

python中提供了计算余弦相似度的函数

from sklearn.metrics.pairwise import cosine_similarityi = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]cosine_similarity([a,b])
  1. 皮尔逊相关系数

皮尔逊相关系数在统计学中经常被提到,在这里也很好理解,用来解释两个事物之间的相关性,所以可以作为相似性度量的一个指标。对于相关系数的理解,我们利用概率论与数理统计中的协方差进行理解,下面给出定义:

sim(u,v)=∑i∈I(rui−r‾u)(rvi−r‾v)∑i∈I(rui−r‾u)2∑i∈I(rvi−r‾v)2sim(u,v) = \frac{\sum_{i\in I}(r_{ui}-\overline{r}_u)(r_{vi}-\overline{r}_v)}{\sqrt{\sum_{i\in I}(r_{ui}-\overline{r}_u)^2}\sqrt{\sum_{i\in I}(r_{vi}-\overline{r}_v)^2}}sim(u,v)=iI(ruiru)2iI(rvirv)2iI(ruiru)(rvirv)

其中,r‾u\overline{r}_uru表示为用户打的所有分数的期望/物品被打的所有分的期望。

其中,皮尔逊相关系数可以结合余弦相似度的计算方法

计算r‾u与r‾v→将余弦相似度的计算公式中的分子改成减去r‾u和r‾v计算\overline{r}_u与\overline{r}_v \rightarrow 将余弦相似度的计算公式中的分子改成减去\overline{r}_u和\overline{r}_vrurvrurv

python中也给出了计算皮尔逊相关系数的函数

from scipy.stats import pearsonri = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)

当然,我们也可以直接使用numpy库中的coefcorr函数进行计算

import numpy as npi = [1, 0, 0, 0]
j = [1, 0.5, 0.5 , 0]
np.coefcorr(i, j)

给出一个三个相似性度量系数的比较

杰卡德系数余弦相似度皮尔逊相关系数
利用两个集合之间的交集来显示集合之间的相互覆盖率来体现集合间的相似度利用特征向量之间的夹角来体现两个集合之间的相似度在余弦相似度的基础上利用了期望的信息进行修正,减小了用户评分偏置的影响。

基于用户的协同过滤——UserCF

UserCF的主要思想是对于一个用户,找到与其相似的用户,将该用户喜好的物品推荐给该用户

所以首要目的即找到一个与当前用户相似的用户集合。

给出一个例子进行解释:

物品1物品2物品3物品4物品5
Alice5344?
用户131233
用户243435
用户333154
用户415521

对于这个例子来说,因为在这里物品5对于Alice而言是缺失的,那么每个用户的特征向量其实就只有4个维度,那么我们下面我们分别用余弦相似度和皮尔逊相似度去计算一下用户之间的相似度。

  1. 利用余弦相似度计算
    在这里插入图片描述

  2. 利用皮尔逊相关系数计算

在这里插入图片描述

计算出用户之间的相似度之后,此时我们需要补全二维表格中空缺的那个值,一般可以我们可以取与Alice相似的N个用户的评分的平均值,但是这样子无法保证用户的标准相同,所以在这里我们不采用该种方法,于是我们将用户打分的均值利用进来,有如下公式
Ri,j=Ri‾+∑k=1n(Si,k(Rk,j−R‾k))∑k=1nSj,kR_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}}Ri,j=Ri+k=1nSj,kk=1n(Si,k(Rk,jRk))
其中,Ri,jR_{i,j}Ri,j为用户i对物品j的打分,R‾i\overline{R}_iRi是用户i对所有物品打分的平均值,Si,kS_{i,k}Si,k为用户i与k的相似度(在这里,我们利用用户之间的相似度进行加权求和)。
假设我们取前2个最相似用户,那么如果采用余弦相似度(皮尔逊相关系数也是相同步骤)去计算用户相似度,那么有用户1和用户2与Alice最相似,于是,我们利用他们两个的评分去计算缺失得分。
利用上面的公式,我们可以计算出其得分为4.87
利用计算出的得分,我们可以对多个物品进行排序,其中有

物品1物品2物品3物品4物品5
Alice53444.87

于是推荐顺序为1>5>3=4>2

下面谈谈UserCF的缺点

  1. 对于UserCF而言,要求用户之间相似,但是(比如说利用用户打分的特征向量)不同用户之间的购买物品的重复率可能较低,导致无法找到较相似的用户或者足够数量的用户,所以对于正反馈获取困难的场景,UserCF并不适用
  2. 维护相似度矩阵的开销较大,不适合大用户数据量

基于物品的协同过滤——ItemCF

基于物品的协同过滤,ItemCF,利用用户过去的数据去为用户推荐物品,即利用物品之间的相似性去进行推荐而不是利用用户之间的相似性去推荐商品。算法认为:物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都喜欢物品B(对于物品的打分而言)
还是用UserCF的例子来解释

物品1物品2物品3物品4物品5
Alice5344?
用户131233
用户243435
用户333154
用户415521

在这里,如何评判物品之间的相似度呢,我们以每个用户为该物品打的分为特征。如物品1的特征向量为(3,4,3,1)(3, 4, 3, 1)(3,4,3,1)因为Alice对物品5的打分缺失,所以在这里Alice的打分在计算相似度时并不用计算入。
那么在这里,我们还是利用余弦相似度进行物品相似度的计算
在这里插入图片描述

在这里,我们要计算物品5与其他物品的相似度,所以,观察结果,可以发现物品5与其他几个物品的相似度分别为0.994,0.739,0.723,0.9400.994, 0.739, 0.723, 0.9400.994,0.739,0.723,0.940,所以选择相似度较高的前两个物品,即物品1和4。
同样的,我们利用
Ri,j=Ri‾+∑k=1n(Si,k(Rk,j−R‾k))∑k=1nSj,kR_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}}Ri,j=Ri+k=1nSj,kk=1n(Si,k(Rk,jRk))
去计算缺失数据,此时,Si,jS_{i,j}Si,j的值代表物品i与j的相似度,则最终我们可以计算出来得分为4.6
那么,将得分排序

物品1物品2物品3物品4物品5
Alice53444.6

则选取两个物品进行推荐,我们选择物品1和物品5

协同过滤算法的改进

对于协同过滤算法,我们可以对其的相关度的计算方法进行改进
在这里插入图片描述

对于一号计算相关度的公式,如果物品i很受欢迎,那很多喜欢物品j的人也喜欢物品i,那么wijw_{ij}wij就会变得很大,那么对于物品i而言,很多物品和物品i的相关度都会很大,即存在不合理性,所以我们可以引入N(j)N(j)N(j)来惩罚物品i的热度,如二号所示,但是如果物品i十分受欢迎,导致所有人都会买i,那么wijw_{ij}wij还是会很大,俗称Harry Potter Problem,所以在这里我们控制N(j)N(j)N(j)N(i)N(i)N(i)的权重,来定制不同的惩罚程度,如三号所示。
此外,对于ItemCF而言,我们需要对用户活跃度进行惩罚(存在刷单现象,仅针对ItemCF),所以出现四号的计算方法。

解释一下第四个式子,N(u)N(u)N(u)在这里代表用户uuu的活跃程度,那么对于既喜欢物品iii又喜欢物品jjj的用户而言,如果用户uuu的活跃度越高,那么这个用户的评价的权重就越低。

协同过滤算法的分析

协同过滤算法存在泛化能力弱的问题,导致协同过滤算法无法将相似物品的相似信息推广到其他物品上(这么解释,就是两个物品,我们知道他们很相似,但是为什么相似我们是不知道的,所以无法利用这两个物品之间的相似程度去为其他物品之间是否相似提供信息,我们只能单纯地知道它们相似),从而导致热门物体具有较强的头部效应,导致它和其他很多物品相似;而尾部物品由于特征向量稀疏,导致不经常被推荐。不过话虽然这么说,但是不是有个指标叫新颖程度吗,那尾部物品的新颖程度应该比较高吧,那这样它作为指标的话,尾部物品还是很大程度可以占用一定比例的
个人觉得还是因为协同过滤算法并没有用上语义的信息,只能单纯的依赖其他信息。

参考资料

https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电感检测_几种常用的电流检测方式

RT1720 是一款最高输入电压可达 80V、输出电压可达 60V 的热插拔控制器,它的作用是防止系统受到过高电压和负电压的攻击,同时还能防范过电流可能导致的问题,它的一种应用电路大致如下图所示:为了检测负载电流的大小,RS…

推荐系统——矩阵分解FM

矩阵分解 隐语义模型与矩阵分解 之所以我们提出隐语义模型与矩阵分解,原因就是[[协同过滤]]存在泛化能力弱的问题 而对于隐语义模型而言,我们可以利用隐向量来代表隐藏信息 此外,也可以在一定程度上弥补[[协同过滤]]处理稀疏矩阵能力不足的…

千位分隔符的完整攻略

千位分隔符[1]是很常见的需求,但是输入文本千变万化,如何才能准确添加千分符呢? 纯整数情况 纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了。 观察上面的数字,我们可以得出千分位的特征是到字符…

限制按钮点击_Android | 使用 AspectJ 限制按钮快速点击

前言在Android开发中,限制按钮快速点击(按钮防抖)是一个常见的需求;在这篇文章里,我将介绍一种使用AspectJ的方法,基于注解处理器 & 运行时注解反射的原理。如果能帮上忙,请务必点赞加关注&…

svn不知道这样的主机 怎么解决_家里装修不知道怎么配置净水器,这几招教你轻松解决...

为了保障家庭饮水健康,很多业主都会选择在家中安装一台厨下净水器。但是,如若仅靠它来满足全家人日常洗漱,沐浴和饮用,这势必会极大地影响到全家人的生活品质。这个时候,实阳机电良心建议,全屋净水系统&…

redis系列:通过文章点赞排名案例学习sortedset命令

前言 这一篇文章将讲述Redis中的sortedset类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。 项目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-sortedset 案例 demo功能是文章点赞排名等等&am…

xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践

自定义注释自定义注解指定xml文件模式上一篇文章详细阐述了xml配置文件的各种标签及其含义。其实从标签开始,每一个标签都对应一个实体类。context.class对应标签,而每一个子标签都对应一个属性;如图:标签与实体类的对应关系。有了…

nginx 配置详解_Nginx 配置详解

序言Nginx是lgor Sysoev为俄罗斯访问量第二的http://rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持Fast…

推荐系统——GBDT+LR

[[逻辑回归模型]] 逻辑回归是在[[线性回归]]的基础上添加了一个Sigmoid函数(非线形)映射,从而可以使逻辑回归成为一个优秀的分类算法 逻辑回归假设数据服从[[伯努利分布]],通过[[极大化似然函数]]的方法,运用[[梯度下降…

从燃尽图看项目管理:你的项目哪里出错了?(燃尽图类型全解析)

什么是燃尽图 燃尽图(burn down chart)是在项目完成之前,对需要完成的工作任务的一种可视化表示。理想情况下,该图表是一个向下的曲线,随着项目任务的逐渐完成“烧尽”至零。 燃尽图常常用于敏捷开发中,作为…

springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程

xmake是一个基于Lua的轻量级现代化c/c的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。本文主要详细讲解下,如何通过配置子工程模块,来组织构建一个大规模…

依赖项出现感叹号怎么办_SpringBoot中如何对依赖进行管理?

SpringBoot中的起步依赖(starter)是一组特定功能的依赖项集合,SpringBoot通过starter来进行项目的依赖管理,而不是直接基于单独的依赖项来进行依赖管理。starter其实就是特殊的Maven依赖项或者Gradle依赖项,它把常用的库组合到一起构成了一个…

5g理论速度_5G是什么?5G速度有多快?

原标题:5G是什么?5G速度有多快?5G到底是什么东西?今年5G网络会普及吗?5G网速到底有多快,背后又有哪些黑科技?近日,全球首个5G火车站在上海虹桥火车站启动建设。而根据三大运营商的时…

c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...

3.1数组同类型、同性质、按顺序存放的一组数据集合,易于批量处理。3.1.1一维数组定义int 1.数组名为常量,指向首地址,由系统指定。2.数组长度为整型常量,但不能为03.上例取值image[0]-image[255],取值可以修改。初始化int 输入for…

自动产生fsm代码的工具_代码自动生成工具

构建支持多种数据库类型的代码自动生成工具背景:一般的业务代码中写来写去,无外乎是先建好model,然后针对这个model做些CRUD的操作。(主要针对单表的业务操作)针对于数据库dao、mapper等的代码自动生成已经有了mybatisGenerator这种工具&…

gtest测试框架使用详解_测试框架TestNG使用介绍

近期接触到了一个比较全面的基于Java的接口自动化测试框架,作为一名Java小白,所以打算研究一下,顺带学习学习Java,该测试框架的逻辑控制层使用的HttpClient TestNG。在本期中,给大家分享一下TestNG测试框架的基础知识…

LOJ#6282. 数列分块入门 6

一个动态的插入过程,还需要带有查询操作。 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把现在里面的数全部拿出…

fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...

脚本之家你与百万开发者在一起作者:theOwlAndPussyCat/焦旭光引言电脑里存了很多有意思的Gif动态图片,闲暇想把这些动图全导入微信表情,可是这些动图很多大小超过了微信表情大小1MB的限制,要制作成表情只能压缩图像文件大小。网上…

frontcon函数用不了_C++复制构造函数与析构函数

想用机器人赋能未来,少不了扎实的编程的基本功,让我们跟着清华大学的C语言程序设计课程一起过一遍C的语法知识吧!当定义基本类型的变量时,经常会用已有的变量去初始化新定义的变量,当定义对象的时候也有类似的需求&…

软件项目立项书_2019年度上海市软件和集成电路产业发展专项资金项目立项

上海艾瑞德生物科技有限公司荣获2019年上海市软件和集成电路产业发展专项资金(集成电路和电子信息制造领域)项目立项!上海艾瑞德生物科技有限公司的【医用体外诊断动态光场图像采集电子模块的研发及产业化】喜获2019年上海市软件和集成电路产业发展专项资金(集成电路…