UserCF(User Collaboration Filter),又称 基于用户的协同过滤算法。
协同过滤:就是指众多的用户可以齐心协力,通过不断地和网站互动,使 自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。
而基于用户是指通过分析用户对商品的行为(如浏览、收藏、加入购物车、购买……)计算出哪些用户是兴趣相似的,然后把兴趣相似的用户所关注的商品相互推荐。
举个例子:
由上表可以看出用户A和用户C比较相似,所以把用户A感兴趣的商品4推荐给用户C。
步骤一般分为两步:
再举个详细点的例子:
假设我们这么一些数据(用户(字母)商品(数字)_行为,):
我们可以给不同的行为赋予不同的评分(假设浏览1分、收藏3分、加入购物车5分、购买10分),得到以下数据:
这样看着比较累,而且也不方便计算,可以把它转换为矩阵形式,称之为 评分矩阵 :
计算相似度
计算相似度的方式有很多,如余弦相似度、切比雪夫距离、欧里几得距离、曼哈顿距离、杰卡德距离、皮尔森系数……计算相似度的方式不同计算出来的相似度也不同。
这里只介绍余弦相似度,其他的请自行百度。
假设有二维向量a,b如下图所示
则他们的余弦相似度为
推广到多维向量a(a1,a2,a3,a4……),b(b1,b2,b3,b4……)
有了公式就能计算出用户相似度了:
推荐列表 = 相似度矩阵 X 评分矩阵
由于用户已经对推荐列表中的一些商品有过行为,所以还要把这些商品给滤除掉
得到最终的推荐列表,其数值代表的意义是用户对商品的感兴趣程度:
ItemCF(Item Collaboration Filter),又称 基于商品(物品)的协同过滤算法。
其原理与UserCF类似,是基于用户对商品的偏好找到相似的商品,然后推荐相似的商品品给他。
计算过程也非常相似,区别在于计算时把UserCF的 评分矩阵转置 ,再计算商品与商品之间的相似度得到 商品之间的相似度矩阵 。
最后的 推荐列表 = 商品之间的相似度矩阵 X 评分矩阵转置
对于电子商务,用户数量一般大大超过商品数量,此时Item CF的计算复杂度较低。
比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性进进超过了网站首页对该用户的综合推荐。可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。基于物品的协同过滤算法,是目前电子商务采用最广泛的推荐算法。
在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。在社交网络站点中,User CF 是一个更好错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。
推荐多样性和精度,各有千秋。
参考:
Spark基于用户的协同过滤算法 https://www.toutiao.com/a6498952374487368205/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=15393016323&utm_medium=toutiao_android
推荐系统_itemCF和userCF
http://blog.csdn.net/u011263983/article/details/51498458
参考书本: 项亮, 推荐系统实践. 2012
本文系阅读笔记
1.网站用户基数增多,矩阵难以构造,时空复杂度增加。
2.难以对推荐结果做出解释。
该算法会因为你购买过《数据挖掘导论》而给你推荐《机器学习》。不过, ItemCF 算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。 该算法认为,物品 A 和物品 B 具有很大的相似度是因为喜欢物品 A 的用户大都也喜欢物品B 。
基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,比如给用户推荐《天龙八部》的解释可以是因为用户之前喜欢《射雕英雄传》。
基于物品的协同过滤算法主要分为两步。
(1) 计算物品之间的相似度。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
具体公式(ij直接的相似度):
N(i)表示喜欢物品i的用户数。
但是如果物品j很热门,几乎每个人都喜欢,则关系度会接近于1。(如可能很多人都会买《新华字典》或《哈利波特》)
为了避免推荐热门物品,则有公式:
这个公式惩罚了物品j的权重,减轻了热门物品会和很多物品相似的可能性。
尽管上面的公式分母已经考虑到了 j 的流行度,但在实际应用中,热门的 j 仍然会获得比较大的相似度。因此可在分母上进行惩罚。
但不能完全解决,两个不同领域的最热门物品之间往往具有比较高的相似度。这个时候,仅仅靠用户行为数据是不能解决这个问题的,因为用户的行为表示这种物品之间应该相似度很高。此时,我们只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权重等。这些就不是协同过滤讨论的范畴了。
可以首先建立用户-物品倒排表,即每一个用户建立一个包含他喜欢的物品的列表。
比如电影,一般来说,同系列的电影、同主角的电影、同风格的电影、同国家和地区的电影会有比较大的相似度。
在得到物品之间相似度后,itemCF运用以下公式计算用户u对一个物品j的兴趣:
S(j,K) 与物品j最相似的K个物品的集合
为物品相似度。 即用户u对物品i的兴趣程度,这里可看做有过行为为1。
对既属于用户喜欢的物品,又在与j物品相似的物品集合内的每一个物品,得到权重相加和(即相似度乘感兴趣程度)。
精度(准确率和召回率) 可以看到 ItemCF 推荐结果的精度也是不和 K 成正相关或者负相关的,因此选择合适的 K 对获得最高精度是非常重要的。
流行度 和 UserCF 不同,参数 K 对 ItemCF 推荐结果流行度的影响也不是完全正相关的。
随着 K 的增加(流行物品相对增多),结果流行度会逐渐提高,但当 K 增加到一定程度,流行度就不会再有明显变化。
覆盖率 K 增加会降低系统的覆盖率(流行率增加)。
A.
假设有这么一个用户,他是开书店的,并且买了当当网上 80% 的书准备用来自己卖。那么,他的购物车里包含当当网 80% 的书。假设当当网有 100 万本书,也就是说他买了 80 万本。从前面对 ItemCF 的讨论可以看到,这意味着因为存在这么一个用户,有 80 万本书两两之间就产生了相似度,也就是说,内存里即将诞生一个 80 万乘 80 万的稠密矩阵。
John S. Breese 在论文中提出了一个称为 IUF ( Inverse User Frequence ),即用户活跃度对数的倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加 IUF参数来修正物品相似度的计算公式:ItemCF-IUF算法
同ItemCF相比,降低了流行度,提高了推荐结果的覆盖率。
B.
物品相似度归一化。
Karypis 在研究中发现如果将 ItemCF 的相似度矩阵按最大值归一化,可以提高推荐的准确率。
其研究表明,如果已经得到了物品相似度矩阵 w ,那么可以用如下公式得到归一化之后的相似度矩阵 w' :
相似度的归一化可以提高推荐的多样性。[解释看原书]