推荐系统(1)--splitting approaches for context-aware recommendation

开篇语:

大一的时候,在实验室老师和师兄的带领下,我开始接触推荐系统。时光匆匆,转眼已是大三,由于大三课甚是少,于是便有了时间将自己所学的东西做下总结。第一篇博客,献给过去三年里带我飞的老师和师兄们,感谢你们的无私帮助与教导!

协同过滤算法:

在传统的协同过滤算法中,算法是基于如图一的用户评分矩阵对用户进行推荐的,其核心思想大致是利用相似用户或者相似商品的信息对用户进行推荐,拿图一举例,在这里我们要预测小红对《了不起的盖茨比》这部电影的评分是多少(1-5),一个最简单的想法就是从所有用户中找到跟小红的品味相似的人,一眼望过去,小明跟小红的品味最相近(都是小李子的粉丝?都比较喜欢看煽情一点的电影?),所以我们可以预测小红对《了不起的盖兹比》这部电影的评分应该是比较高的,所以在做电影推荐的时候,我们可以把《了不起的盖茨比》这部电影推荐给小红,这种利用相似用户的信息进行推荐的算法叫做user-based(基于用户的)协同过滤算法,这种而相对应的,就有item-based(基于商品的)协同过滤算法,基于商品协同过滤算法思想大致是,那些跟用户喜欢的商品相似的商品,在某种程度上说用户也应该喜欢,放在这里的话,小红喜欢《泰坦尼克号》这部电影,由于《泰坦尼克号》跟《了不起的盖茨比》比较相似,那么小红也理所当然地喜欢《了不起的盖茨比》这部电影。有关协同过滤算法,这篇博客进行了详细的介绍。

(图一)

为了引出下文,这里插个没啥剧情没啥品味的小故事:

A公司利用协同过滤算法,为其下的每个用户生成个性化的推荐之后,公司的营业额一天比一天高,而随着数据越来越丰富,A公司除了拥有用户对商品的评分这些数据外,还拥有各种上下文信息(如小红是在什么时候看的这场电影,是跟什么人一起看的,看完之后心情如何等等),老板希望把这些上下文的信息都给利用上,但上面已经讲到,传统的协同过滤算法仅仅是基于用户对商品的评分对用户进行推荐的,那么,有没有什么办法让A公司在不换掉这套算法的前提下,把这些上下文信息给利用上呢?

Splitting:

splitting的分类:

splitting方法分为item-splitting,user-splitting,UI-splitting三种。

splitting的基本思想:

对于某个事物X,如果它随着环境(上下文)的改变,X也发生很大的变化,则应该认为X在不同的环境(上下文)中是属于不同的事物,因此我们应该把它们分割开来,当成不同的事物对待。

splitting的做法:

这里以item-splitting来举例说明,item-splitting嘛,翻译成中文就是“项目-分割”,字面意思就是对一个项目(商品)进行分割,将其分割成几份,既然要分割,我们要拿什么来分割?怎么分割?分割成几份?

分割???~~~

言归正传,先来看第一个和第二个问题,拿什么来分割,怎么分割?看回前面的小故事,我们会很自然而然地想到,这时候我们会用到上下文的信息来对item进行分割,在这里,我们看图二和图三中的两个矩阵:

(图二)

(图三)

图三是用户对泰坦尼克号的评分,而图二是用户在看这部电影时的一些上下文信息,item-splitting方法的思想是利用某个上下文条件对项目尝试进行分割,尝试分割成两个向量后,如果这两个向量有显著地不同,则应该把原来这个项目进行分割,假设上面的上下文条件中,“是否跟恋人”这个上下文条件可以让泰坦尼克号这个列向量在分割之后有显著地不同,则应该将其划分为两个向量,如图四:

(图四)

在图四中,依据“是否跟恋人”这个上下文条件对《泰坦尼克号》这个列向量进行分割后,形成了两个不同的向量(跟恋人,不跟恋人),在item-splitting方法中,对应的其实是两个不同的电影。

在这里,引入一个新的问题,如何判断一个向量在分割成两个向量之后,这两个向量有显著的不同,即如何评判泰坦尼克号(跟恋人)和泰坦尼克号(不跟恋人)这两个列向量有显著的不同?

论文[1]中详细地讲解了splitting的整个过程,在这里摘取其中一个评判两个向量是否有显著不同的公式:

(图五)

该公式是两个样本的t检验,在p值满足阈值(通常是p<=0.05满足)的情况下,t值越大,这两个向量越不同,其中,Ui是该电影的平均分,Si为该电影的评分方差,ni为该电影有多少个非零值,下标C和非C表示不同的上下文(跟恋人和不跟恋人)。

item-splitting的算法伪代码(摘自论文[1])如图六所示:

(图六)

将图一的矩阵在执行item-splitting后,假设除了《了不起的盖茨比》外,其他两部电影都被splitting了,则将会变成如图七的矩阵:

(图七)

利用上下文信息得到如图七的矩阵后,可以在该矩阵上套用传统的协同过滤算法。

最后看一下上面说到的分割成几份的问题,在上述过程中,对于每个item,我们都是划分成2份,即是这个上下文的和不是这个上下文的,那么,我们可以将其划分成更多份吗?比如对于图二中的天气这一个上下文维度,对每个项目划分成4份,即晴,下雨,阴天,下雪这四个,可以是可以,但论文[1]有提到这样划分不仅会带来时间成本的增加,也会导致评分矩阵过度稀疏,也会造成过拟合的问题。

splitting方法的优缺点及思考:

首先说下优点,splitting方法可以把有价值的上下文信息融入到传统的协同过滤算法中,从而提升推荐的效果。

再来说下缺点,从上面的伪代码来分析,我们可以知道,在上下文的维度很高,且每个维度有很多值的情况下,整个splitting过程是十分耗时的,而且splitting耗费的这些时间不一定能很大幅度的提升推荐的效果,注意我上面说splitting的优点的时候, 有特别地说明“有价值的上下文信息”,但是,什么上下文信息是有价值的呢?这又与业务背景有关,有人专门对上下文的选取做过研究,发现并不是所有的上下文信息都能提升推荐的效果的,有时候引入不恰当的上下文,反而会降低推荐的效果,因此,对于splitting过程中要用什么上下文才能提升推荐效果,这也需要我们对业务背景有一定的了解。

在这里推荐一个github上的有关上下文推荐系统相当不错的项目:

https://github.com/irecsys/CARSKit

参考学习资料:

[1]L. Baltrunas and F. Ricci. Experimental evaluation of context-dependent collaborative filtering using item splitting.2013.

[2]Yong Zheng,Robin Burke,Bamshad Mobasher.Splitting Approaches for Context-Aware Recommendation: An Empirical Study.2014

时间: 2024-08-09 02:09:25

推荐系统(1)--splitting approaches for context-aware recommendation的相关文章

转:一些论文的概括!

摘要: 月中在香港参加recsys2013会议,文章不少,对我有价值的并不算多,再跟目前工作相关的就更少了.这里过滤了几篇我觉得比较有意思的文章,加上了自己的理解,作为导读. A Fast Parallel SGD for Matrix Factorization... 月中在香港参加recsys2013会议,文章不少,对我有价值的并不算多,再跟目前工作相关的就更少了.这里过滤了几篇我觉得比较有意思的文章,加上了自己的理解,作为导读. A Fast Parallel SGD for Matrix

《转》推荐系统经典论文文献及业界应用

转载自http://semocean.com 列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的推荐系统相关的工具:同时给出参加过及未参加过的业界推荐引擎应用交流资料(有我网盘的链接), 材料组织方式参考了厂里部分同学的整理. 因为推荐引擎不能算是一个独立学科,它与机器学习,数据挖掘有天然不可分的关系,所以同时列了一些这方面有用的工具及书籍,希望能对大家有所帮助. Survey方面的文章及资料 Adomavicius G, Tuzhilin A. Toward

JPA和事务管理

很重要的一点是JPA本身并不提供任何类型的声明式事务管理.如果在依赖注入容器之外使用JPA,事务处理必须由开发人员编程实现. 123456789101112UserTransaction utx = entityManager.getTransaction(); try { utx.begin(); businessLogic(); utx.commit(); } catch(Exception ex) { utx.rollback(); throw ex; }这种方式的事务管理使事务范围可以在

Spring @Transactional工作原理

本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的.之后的文章将介绍: propagation(事务传播)和isolation(隔离性)等属性的使用 事务使用的陷阱有哪些以及如何避免 JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理.如果在依赖注入容器之外使用JPA,事务处理必须由开发人员编程实现. 1 2 3 4 5 6 7 8 9 10 11 12 UserTransaction utx = entityManager.ge

Building the Unstructured Data Warehouse: Architecture, Analysis, and Design

Building the Unstructured Data Warehouse: Architecture, Analysis, and Design earn essential techniques from data warehouse legend Bill Inmon on how to build the reporting environment your business needs now! Answers for many valuable business questio

openstack 中 log模块分析

1 . 所在模块,一般在openstack/common/log.py,其实最主要的还是调用了python中的logging模块: 入口函数在 def setup(product_name, version='unknown'):     """Setup logging."""     if CONF.log_config_append:         _load_log_config(CONF.log_config_append)    

关于Spring框架的 @Transactional工作原理介绍

最近做的项目有特别留意到spring的  @Transactional,于是,在网上查找一番. 本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的.之后的文章将介绍: propagation(事务传播)和isolation(隔离性)等属性的使用 事务使用的陷阱有哪些以及如何避免 JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理.如果在依赖注入容器之外使用JPA,事务处理必须由开发人员编程实现. 1 2 3 4 5 6 7 8 9

veeValidate

网站 http://vee-validate.logaretm.com/index.html#about 自定义为空时候的提示 Field-specific Custom Messages You might need to provide different messages for different fields, for example you might want to display an error message for the email field when its requ

响应式网页设计【转载】

概念 响应式网页设计最初是由 Ethan Marcotte 提出的一个概念:为什么一定要为每个用户群各自打造一套设计和开发方案?Web设计应该做到根据不同设备环境自动响应及调整.当然响应式Web设计不仅仅是关于屏幕分辨率自适应以及自动缩放的图片等等,它更像是一种对于设计的全新思维模式:我们应当向下兼容.移动优先. 背景 PC互联网加速向移动端迁移:2012年12月底我国网民规模达到5.64亿,互联网普及率为42.1%,手机用户占网民总数的74.5%.预计到2015年,移动互联网的数据流量将超越P