Charpter001
推荐系统解决的问题:
如何在海量的数据中推荐出具有参考意义的信息,基于用户的历史信息;
从物品的角度出发,推荐系统可以更好地发掘物品的长尾(long tail)
长尾概念:绝大部分的信息都是不热门的,绝大部分的物品都是不热门的
发掘出那些不热门的信息,发掘出那些不热门的物品作为个性化推荐给用户
个性化推荐的意义:个性化推荐系统在这些网站中的主要作用是通过分析大量用户行为日志,给不同用户提供不同的个性化页面展示,来
提高网站的点击率和转化率
推荐系统应用的组成:由前台的展示页面、后台的日志系统以及推荐算法系统3部分构成
简单的推荐系统的算法:基于物品的推荐,基于用户的推荐
推荐算法的应用:个性化推荐算法的应用
基于社交网络的推荐
基于位置的推荐系统
个性化广告等
推荐系统的评测:
1:好的推荐系统不仅仅能够准确预测用户的行为(precision High),
而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西(新颖度)
推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户,也就是发掘出长尾信息的价值(发掘长尾信息)
2:推荐系统评估:
离线实验,用户调查,在线测试
3:评价指标:
准确性:1:评分预测(对于拥有评分的系统)
2:topN(给用户一个个性化的推荐列表)
衡量topN的指标通过准确率(precision)/召回率(recall)
precision和recall和机器学习中的计算方式相同
Python实现使用set集合方式,通过选取PR curver曲线的方式
3:覆盖率:描述一个推荐系统对物品长尾发掘能力
推荐系统能够推荐出来的物品占总物品集合的比例
指标:信息熵,基尼信息(系统的流行度越平均,基尼信息就越小)
4:多样性:描述了推荐列表中物品与物品的相似性,1-相似性
5:新颖度、
charpter002
用户的数据来进行推荐系统的实现:
基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法
用户日志的获得:显性反馈(有评分和判断信息)和隐性反馈,根据反馈的方向又可以分为正反馈和负反馈两种方式
用户日志的内容分类:根据有无上下文可以分为:
没有上下文的显性数据,隐形反馈数据,有上下文的显性反馈数据,隐性反馈数据;
用户数据行为分析基础知识:
用户活跃度和物品流行度的分布:长尾分布;(绝大部分的用户都是不活跃的,绝大部分的物品都是不流行的)
用户活跃度和物品流行度的关系:新用户始终是对流行的物品感兴趣,老用户往往对不太流行的物品感兴趣
推荐系统的算法:
基于邻域的方法(neighborhood-based)、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph)
基于领域的方法:基于用户的协同过滤,基于物品的协同过滤
一般带有评分的数据都是采用字典存储的 {"hufanglei":{"movie1":score,"movie2":score2,"movie3":score3,"movie4":score4}
书中给出了相应的代码来定义准确度,查准率,查全率,新颖度等代码
基于领域的协同过滤算法:是推荐系统中用的最多的算法,分为基于用户的协同过滤,基于物品的协同过滤算法;
基于用户的协同过滤算法:
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
如何计算两个用户之间的相似性:
相似性计算方式:采用对于物品的相似性计算;
def UserSimilarity(train):#train 数据结构是{“userName”:set([]),"userName2":set([])}
W = dict()
for u in train.keys():
for v in train.keys():
if u == v:
continue
W[u][v] = len(train[u] & train[v])
W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)
return W
计算用户之间的相似度时,计算复杂度较高,如果用户的数量很大,计算复杂度为O(n^2)
因此可以建立物品到用户的倒排表,每个物品的列表中保存着每一个对该物品发生过行为的用户;
def getDict(train):#train:{"":[],"":[]},自己手写了代码不同于书本的数据结构
all_goods=set()
mapDict=defaultdict(set)
for item in train.values():
all_goods=all_goods|set(item)#得到所有的物品列表
for good in all_goods:
for key in train.keys():
if(good in train[key]):
mapDict[good].add(key)
return mapDict
def get_the_similarity(GPmap,train):#构建用户之间的相似性计算,输出还是字典的形式{"a":{"b":1,"c":1}}数值表示相关性的值
names=train.keys()
ppmap=defaultdict(dict)
for name in names:#对于所有的用户都要建立
temp=dict()
for key in GPmap.keys():
if(name in GPmap[key]):#如果用户对同一物品感兴趣
for name1 in GPmap[key]:
if(name==name1):
continue
else:
if(name1 not in temp.keys()):
temp[name1]=1
else:
temp[name1]+=1
ppmap[name]=temp
return ppmap
然后计算两两用户之间的相似性;根据相似性区推荐物品
(3):算法改进:
在相似度计算的时候考虑到物品的热门程度,在相似性计算中加入惩罚因子,用于惩罚热门物品的影响
物品越热门,相应的权重就越小;
基于物品的协同过滤算法:是业界使用最多的推荐系统算法;
基于用户协同过滤算法的缺陷:用户数据量过大,导致相应的计算复杂度很高
基于物品推荐算法:主要通过分析用户的行为记录计算物品之间的相似度
基于物品的协同过滤算法主要分为两步。
(1) 计算物品之间的相似度。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表
(1):相似度计算公式:
对于i,j两个物品,相似度的计算公式是根据两个物品之间的用户交集的个数/总的用户的个数
同样计算的过程中首先是用户-物品倒排表
(2)算法优化:
用户活跃度对物品相似度的影响:同样使用一个指数来惩罚用户的活跃度系数
两种协同过滤算法的比较和差异:
UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
其他推荐系统的算法:
基于隐语义模型
基于图的模型
charpter003
推荐系统的冷启动问题
用户冷启动问题:日志中没有用户的信息,需要对用户进行个性化推荐
物品冷启动问题:要对一个新物品进行推荐,如何将一个新的物品推荐给对它感兴趣的用户
系统冷启动问题:如何在新开发的网站上进行推荐服务(还没有用户,还没有用户行为,只有一些物品的信息)
不同的冷启动问题:
提供非个性化推荐:
1:最简单的方式是热门推荐,热门排行版
2:利用用户注册时提交的用户的年龄,性别等粗粒度数据的个性化推荐
3:利用用户的社交网络的账号登入,导入用户的好友信息,然后根据好友的推荐
4:要求用户在登入时对物品进行反馈,然后根据物品进行推荐
5:对于新加入的物品,可以利用内容的信息,将它们推荐给喜欢过和它们相似物品的用户
6:系统冷启动时,可以利用专家的知识,通过一定的高效方式迅速建立物品的相关度表
基于注册信息的个性化推荐:
1:获取用户的注册信息
2:根据用户的注册信息对用户进行分类
3:给用户推荐他所属分类的用户的喜爱的产品
简单基于人口统计学的例子,比如 胡方磊,年龄25,职业学生,性别 男
离线三张表,一张 性别,电视剧表,一张职业,电视剧表,一张 年龄电视剧表
三张表根据一定的权重进行组合,即可得到相应的推荐的电视剧;
基于选择合适的物品启动用户的兴趣:
具体的思想就是针对新用户,通过给用户一个推荐的选项,让用户进行评价;
利用物品的内容的信息:
物品冷启动,将一个新物品如何推荐给对应的用户;
对于userCF来说:物品冷启动 对userCF不敏感,但是对于itemCF物品冷启动就是致命的;
通过将物品内容的向量化表示成一个样本空间;所以完全只是考虑了物品本身的特征,忽略了用户的行为;
协同过滤和基于内容的推荐:
如果用户的行为强烈受某一内容属性的影响,那么内容过滤的算法还是可以在精度上超过协同过滤算法的。
不过这种强的内容特征不是所有物品都具有的,而且需要丰富的领域知识才能获得,所以很多时候内容过滤算法的精度比协同过滤算法差。
不过,这也提醒我们,如果能够将这两种算法融合,一定能够获得比单独使用这两种算法更好的效果