终于有机会写这个系列的博客了,一方面是为了考研复试做准备,另一方面也是对自己之前知识的一个总结,这个项目其实在我大二的时候就已经完成了,可是后面由于考研耽误了,现在重新又捡起来了。整个项目完成度已经很高了,大家只需要按照我博客的内容一步一步操作,你们也可以搭建整个网站,当然,如果自己有服务器,可以直接搭建起来,别人也可以访问,我是在我的自己的虚拟机上面搭建的,想想当时每天最开心的事情就是写写代码,为了这个项目还特意买了一个内存条(从某一方面来说这个项目的配置要求也蛮高的,毕竟这个项目还是很大的),我用这个项目还参加过一些比赛,拿了一些小奖,所以如果有人想用这个作为毕业设计,也完全没有问题,这个系列博文数量虽然暂时没有想好,但是目前估计是10篇博文左右,希望可以找到之前写代码的快乐啊。另外,整个项目的源代码已经所有工具我都免费分享到上面了,如果帮助到大家了,也可以去仓库给我点个Star,谢谢大家!
基于深度学习的监督学习,使用梯度下降、ALS、LFM算法,使用AngularJS2生成前端框架,数据库为MongoDB,使用ElasticSearch作为搜索服务器,Redis作为缓存数据库,其中包括Spark的离线统计服务、Azkaban的工作调度服务、Flume的日志采集服务、Kafka作为消息缓冲服务,全局采用Scala编写,Java作为Tomcat部署使用,实现离线推荐、实时推荐、服务器冷启动问题解决
今天先给大家带来推荐系统相关知识的入门学习,前两篇博文我打算主要对推荐系统的理论进行简单的学习,一方面是为了让读者由浅入深,另一方面是为了也让我对之前的知识做一个总结。今天主要介绍推荐系统的概论以及推荐系统的评测等,下面就开始今天的学习吧!
推荐系统是信息过载所采用的措施,面对海量的数据信息,从中快速推荐出符合用户特点的物品。其中包括两类人:
以前解决这个问题,主要使用的方法为分类目录和搜索引擎,这样做的结果是比较被动,需要用户手动输入或点击才能得到想要的结果,比如hao123、百度、谷歌。这样有弊端,不仅信息量小、不够个性化,而且目标并不明确
这个时候推荐系统应运而生,推荐系统是自动化的通过分析用户的历史行为数据,完成用户的个性化建模,从而主动给用户推荐能够满足他们兴趣和需求的信息的软件系统
推荐引擎需要依赖用户的行为日志,因此一般都作为一个后台应用程序存在于网站中。通过截取网站提供的大量用户行为日志,给用户提供不同的个性化页面或者信息,提高整个网站的点击率和转化率
推荐系统一般都由三个部分组成,前端的交互页面、日志系统以及推荐算法系统。
个性化推荐的成功需要两个条件:1、存在信息过载,用户不能很容易从所有物品中找到喜欢的物品。2、用户大部分时候没有特别明确的需求。下面举一些相关例子以便读者更为直观的了解到什么是推荐系统:
那么现在对我们来说就是什么才是好的推荐系统,什么样的推荐系统会给我们带来最好的推荐结果。一个完整的推荐系统一般都存在三个参与方:用户、物品提供者和提供推荐系统的网站
比如一个图书推荐系统。1、推荐系统需要满足用户的需求,给用户推荐那些令他们感兴趣的图书。2、推荐系统要让各出版社的书都能够推荐给对其感兴趣的用户,而不是只推荐几个大型出版社的书。3、推荐系统应该能够收集到高质量的用户反馈,不断完善推荐的质量,增加用户和网站的交互,提高网站的输入。总之,好的推荐系统是一个能够让三方共赢的系统。
好的推荐系统不仅仅能够准确预测用户的行为,而且能够拓展用户的视野,去帮助用户去“发现”
获取推荐系统评测指标的主要实验方法主要分为三种:离线实验、用户调查、在线实验
离线实验室通过对离线数据集进行训练集和测试集的划分和测试,完成对评测指标的结果收集
①:通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集
②:将数据集按照一定的规则分成训练集和测试集
③:在训练集上训练用户兴趣模型,在测试集上进行预测
④:通过事先定义的离线指标评测算法在测试集上的预测结果
离线实验的优缺点
优点 | 缺点 |
---|---|
不需要有对实际系统的控制权 | 无法计算商业上关心的指标 |
不需要用户参数实验 | 离线实验的指标和商业指标存在差距 |
速度快,可以测试大量算法 |
用户调查需要有一些真实用户,让他们在需要测试的推荐系统上完成一些任务。在他们完成任务时,我们需要观察和记录他们的行为,并让他们回答一些问题。最后,我们需要通过分析他们的行为和答案了解测试系统的性能
它的优点是可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。缺点是招募测试用户代价较大,很难组织大规模的测试用户,因此会使测试结果的统计意义不足
将推荐系统上线进行测试,并和旧的算法系统进行AB测试,使用户流量随机分配到新旧两个系统中,然后统计用户的反馈数据进行进行系统的指标统计和比对
用户进入网站后,流量分配系统决定用户是否需要被进行AB测试,如果需要的话,流量分配系统会给用户打上在测试中属于什么分组的标签。然后用户浏览网页,而用户在浏览网页时的行为都会被通过日志系统发回后台的日志数据库。此时,如果有用户有测试分组的标签,那么该标签也会被发回后台数据库。在后台,实验人员的工作首先是配置流量分配系统,决定满足什么条件的用户参加什么样的测试。其次,实验人员需要统计日志数据库中的数据,通过测评系统生成不同分组用户的实验报告,并比较和评测实验结果
只能通过用户调查或者在线实验获得,比如网站的推荐结果反馈、用户的点击率、用户停留时间和转化率指标等来衡量用户的满意度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力,主要可以通过离线数据集进行分析
很多提供推荐服务的网站都会有一个让用户给物品打分的功能。知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测
评分预测的预测准确度一般通过均方根误差( R M S E RMSE RMSE)和平均绝对误差( M A E MAE MAE)计算。对于预测集中的一个用户 u u u和物品 i i i,令 r u i r_{ui} rui是用户对物品 i i i的实际评分,而 r u i ^ \widehat{r_{ui}} rui 是推荐算法给出的预测评分,那么 R M S E RMSE RMSE的定义为:
R M S E = ∑ u , i ∈ T ( r u i − r u i ^ ) 2 ∣ T ∣ RMSE=\frac{\sqrt{ \sum_{u,i\in T }(r_{ui} - \widehat{r_{ui}})^2 }}{|T|} RMSE=∣T∣∑u,i∈T(rui−rui )2
M A E MAE MAE采用绝对值计算预测误差,它的定义为:
M A E = ∑ u , i ∈ T ∣ r u i − r u i ^ ∣ ∣ T ∣ MAE=\frac{ \sum_{u,i\in T }|r_{ui} - \widehat{r_{ui}}| }{|T|} MAE=∣T∣∑u,i∈T∣rui−rui ∣
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做 T o p N TopN TopN推荐。 T o p N TopN TopN推荐的预测准确率一般通过准确率( p r e c i s i o n precision precision)/召回率( r e c a l l recall recall)度量。令 R ( u ) R(u) R(u)是根据用户在训练集上的行为给用户做出的推荐列表。而 T ( u ) T(u) T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
R e c a l l = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ T ( u ) ∣ Recall=\frac{ \sum_{u\in U }|R(u)\bigcap T(u )| }{\sum_{u\in U }| T(u)|} Recall=∑u∈U∣T(u)∣∑u∈U∣R(u)⋂T(u)∣
推荐结果的准确率定义为:
P r e c i s i o n = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ R ( u ) ∣ Precision=\frac{ \sum_{u\in U }|R(u)\bigcap T(u )| }{\sum_{u\in U }| R(u)|} Precision=∑u∈U∣R(u)∣∑u∈U∣R(u)⋂T(u)∣
覆盖率( c o v e r a g e coverage coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为 U U U,推荐系统给每个用户推荐一个长度为 N N N的物品列表 R ( u ) R(u) R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
C o v e r a g e = ∣ ⋃ u ∈ U R ( u ) ∣ ∣ I ∣ Coverage=\frac{ |\bigcup _{ u\in U}R(u)| }{|I|} Coverage=∣I∣∣⋃u∈UR(u)∣
在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:
H = − ∑ i = 1 n p ( i ) log p ( i ) H=-\sum_{i=1}^{n}p(i)\log p(i) H=−i=1∑np(i)logp(i)
这里 p ( i ) p(i) p(i)是物品 i i i的流行度除所有物品流行度之和。第二个指标是基尼系数( G i n i I n d e x Gini Index GiniIndex):
G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) G=\frac{1}{n-1}\sum_{j=1}^{n}(2j-n-1)p(i_j) G=n−11j=1∑n(2j−n−1)p(ij)
这里, i i i, j j j是按照物品流行度 p ( ) p() p()从小到大排序的物品列表中第 j j j个物品
用户的兴趣是广泛的,为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。尽管用户的兴趣在较长的时间跨度中是一样的,但具体到用户访问推荐系统的某一刻,其兴趣往往是单一的,那么如果推荐列表只能覆盖用户的一个兴趣点,而这个兴趣点不是用户在这个时刻的兴趣点,推荐列表就不会让用户满意。反之,如果推荐列表比较多样,覆盖了用户绝大多数的而兴趣点,那么就会增加用户找到感兴趣物品的概率
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设 s ( i , j ) ∈ [ 0 , 1 ] s(i,j) \in[0,1] s(i,j)∈[0,1]定义了物品 i i i和 j j j之间的相似度,那么用户 u u u的推荐列表 R ( u ) R(u) R(u)的多样性定义如下:
D i v e r s i t y = 1 − ∑ i , j ∈ R ( u ) , i ≠ j s ( i , j ) 1 2 ∣ R ( u ) ∣ ( ∣ R ( u ) ∣ − 1 ) Diversity=1-\frac{\sum _{i,j \in R(u),i\neq j}s(i,j)}{\frac{1}{2}|R(u)|(|R(u)|-1)} Diversity=1−21∣R(u)∣(∣R(u)∣−1)∑i,j∈R(u),i=js(i,j)
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是:把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉
如果推荐结果和用户的历史兴趣不相似,却让用户觉得满意,那么就可以说推荐结果的惊喜度很高
如果用户信任推荐系统,那么会增加用户和推荐系统的交互。特别是在电子商务推荐系统中,让用户对推荐结果产生信任是非常重要的。同样的推荐结果,以让用户信任的方式推荐给用户就更能让用户产生购买欲,而以类似广告形式的推荐方法推荐给用户就可能很难让用户产生购买的意愿
首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。推荐系统需要能够将新加入系统地物品推荐给用户
任何一个能带来利益的算法系统都会被人攻击,这方面最典型的例子就是搜索引擎。搜索引擎的作弊和反作弊斗争异常激烈,这是因为如果能让自己的商品成为热门搜索词的第一个搜索结果,会带来极大的商业利益。推荐系统目前也遇到了同样的作弊问题,而健壮性(即 r o b u s t robust robust,鲁棒性)指标衡量了一个推荐系统抗击作弊的能力
离线实验 | 问卷调查 | 在线实验 | |
---|---|---|---|
用户满意度 | × | √ | ◯ \bigcirc ◯ |
预测准确度 | √ | √ | × |
覆盖率 | √ | √ | √ |
多样性 | ◯ \bigcirc ◯ | √ | ◯ \bigcirc ◯ |
新颖性 | ◯ \bigcirc ◯ | √ | ◯ \bigcirc ◯ |
惊喜度 | × | √ | × |
这篇博文主要介绍了推荐系统有关的理论知识,目的是让读者对推荐系统有一个初步的认识,方便后续的实践操作。下篇博文还是理论知识,但是是重点以及难点,是关于如何利用用户行为数据的,并且包括推荐算法的讲解,是和后面实践操作息息相关的,博客的每一个字和每一个公式都是手打的,写了好久,希望大家好好学习,如果有问题也欢迎和我交流!