推荐算法之协同过滤CF

这两天看了一下几个比较重要也很常见的推荐算法,基于内容推荐和基于用户推荐,查阅了不少资料,还是想着将这些整理下来。

Collaborative filtering (CF)算法试图找到一种通过用户行为为其提供一种具体建议的模型。他依据用户的行为数据,比如用户对读过书本的评分来判断他们对这本书的喜爱程度,关键问题在于如果有两个用户对其他物品有相似的评分那么其中一个用户对未评分的商品评分跟另一个用户应该是相近的,值得注意的是,这并没有涉及到商品的其他信息(如,商品描述),也没涉及到用户的其他信息(如,兴趣、人口统计数据)。协同过滤可以分为两类:基于邻域(内存)和基于模型的协同过滤,用户-商品评分对直接用于预测新商品的评分。
基于邻域的协同过滤又分为:基于用户的协同过滤(user-based CF)和基于物品的协同过滤(item-based CF)。

  • User-based CF 推荐自己没有而有相同购买习惯用户有的商品
  • Item-based CF 推荐有被相似购买经历的物品,买商品X的同时购买Y

协同过滤输入数据只需要三个维度:userid ,itemid, score :就是这个人对这个物品的打分,打分就是对一个物品的喜爱程度。

原理图如下:

• 假设
– 用户喜欢那些跟他有相似爱好的用户喜欢的东西
– 具有相似兴趣的用户在未来也具有相似兴趣
• 方法
– 给定用户u,找到一个用户的集合N(u),他们和u具有相似的兴趣
– 将N(u)喜欢的物品推荐给用户.

如图所示:

下面对上面这种情况做更加细致的分析:

1.从用户的历史行为信息里抽取出了UI矩阵。UserA->item:score item:score

2.得到了UI矩阵,就可以生成UI的转置IU矩阵*UI矩阵 得到 II矩阵【行和列都是Item】就是我给你一个itemA->item1:score item2:score 和UI矩阵*IU矩阵得到UU矩阵【行和列都是User】,UserA->user1:score user2:score 

3.将得到的II矩阵放入II矩阵 NoSQL数据库中和UU矩阵放入UU矩阵 NoSQL数据库。

4.若此时用户点击《张学友的爱情片》,这时系统会拿到这个item将《张学友的爱情片》作为key 去查 II 矩阵 NoSQL数据库的其他的item1:score item2:score

5.若此时业务场景为QQ一个用户B,在用户的首页去推荐给其他好友,这时候就会去请求UU矩阵,因为这时候用户作为key,给你推荐相关的其他好友当然也是用户。

6.最终根据推荐返回相似度较高的再经过一些精排的过程,展示前5名在用户的推荐列表中。

1.User-Base CF

原理:

  1. 用户喜欢那些跟他有相似爱好的用户喜欢的东西   【用户与用户之间做比较】

  2. 具有相似兴趣的用户在未来也具有相似的兴趣

方法:

  1. 给定用户u,找到一个用户的群体也就是集合N(U),他们具有相似的兴趣

  2. 将N(u)喜欢的物品推荐给该用户

通俗理解:

User Item
U1 足球,排球,篮球,高尔夫
U2 足球,排球,篮球

    例子一:以上表格U1喜欢足球,排球,篮球,高尔夫,U2也喜欢足球,排球,篮球,但是U1还喜欢高尔夫,由于U1和U2是好友,于是就将高尔夫推荐给U2用户。

例子二:使用UI矩阵解释:假设有四个用户,他们分别喜欢如下电影,那么我们要对c用户来推荐Titanic,这个概率该怎么计算呢,首先我们知道四个用户的Ui矩阵,然后我们根据矩阵公式,转换成UU矩阵,这里要提出一点的是,在转换的过程中要求相似度,怎么求呢 ? 其实就是计算cosin的相似度:

如何通过UI得到UU呢,即如何通过左边得到右边,这里需要通过矩阵的转置计算即通过UI*IU=UU,就拿A--->B来计算:如上图所示A的向量为(5,1,2,2),B向量为(1,5,5,5)(注意这里的问号需要舍弃,不能放进去计算),则A--->B为:

\frac{5*1+1*5+2*5+2*5}{\sqrt{{5}^{2}+{1}^{2}+{2}^{2}+{2}^{2}}\ast \sqrt{{1}^{2}+{5}^{2}+{5}^{2}+{5}^{2}}}=0.59,同理A--->C计算方式也是一样,结果为0.73,这样经过计算,就很容易得到右边的UU矩阵了。

那个最后计算出来的值对于不同的cf有不同的意思,但是最后算出来的都是相似度,对于uu而言,算出的来的是当前用户和其相似的用户对于推荐的这个电影的喜欢程度,可以这么理解下,比如拿你图片的这个例子,对于uu而言,向c用户推荐泰坦尼克,那么我们怎么才能根据c看的其余电影向c推荐泰坦尼克呢,首先我们既然是通过uu来推荐,当然就需要找到和c一样的人,怎么找和c一样的人,那就需要看看c所看的其他电影

我们通过以上计算能得到UU矩阵,然后开始对C用户做数据分析,跟c关系好的,看UU矩阵,我们用BD两个人来给C推荐Titanic,那么途中是如何计算的? 首先看右边的UU矩阵,B和C的相似度为0.97 ,而B对Titanic打了5分,因此喜爱程度为0.97*5,同理D和C的相似度为0.87 ,而D对Titanic打了3分,因此喜爱程度为0.87*3,二者相加除以相加然后除以各相似度之和,因此最终的相似度为右下角的公式。

2.Item-Base CF

假设:

  1. 用户喜欢跟他过去喜欢的物品相似的物品   【从用户的历史行为中进行比较】

  2. 历史上相似的物品在未来也相似

方法:

  1. 给定用户u,找到他过去喜欢的物品集合R(u)

  2. 把和R(u)相似的物品推荐给u

通俗理解:

User Item
U1 计算机图书1,计算机图书2
U1 计算机图书3

例子一:以上表格U1在淘宝上购买了计算机图书1,计算机图书2,基于用户的历史推荐和历史物品相似的物品如计算机图书3等。

    例子二:同样用刚刚那个例子,用户c没有看过Titanic,我们怎么根据用户看过的电影来推荐Titanic,同样通过UI 矩阵我们得到II矩阵,这里计算相似度方法一样得到右边这个II矩阵

如何通过UI得到II呢,即如何通过左边得到右边,这里需要通过矩阵的转置计算即通过IU*UI=II,就拿itemA--->itemB来计算:如上图所示itemA的向量为(5,1,4),itemB向量为(1,5,3)(注意这里的问号需要舍弃,不能放进去计算,问号代表的是未知的),则itemA--->itemB为:

\frac{5*1+1*5+4*3}{\sqrt{5^2+1^2+4^2}*\sqrt{1^2+5^2+3^2}}=0.5738,以此类推我们很容易得到右边的II矩阵,其实也是对电影之间求一个余弦的过程,这里也可以通过画坐标去分析可能会更加直观一些。II矩阵得到了,就能计算下面这个白色地方的公式了,

这里我们就要基于用户C的历史行为来给C推荐Titanic,那么途中是如何计算的? 首先看右边的UU矩阵,Matrix和Titanic的相似度为0.57 ,而C对Matrix打了2分,因此喜爱程度为0.57*2,同理DieHard和Titanic的相似度为0.80 ,而C对DieHard打了3分,因此喜爱程度为0.80*3,依次类推,将用户C所有观看的电影的喜爱程度相加除以相加然后除以各相似度之和,因此最终的相似度为右下角的公式。

通过两种方法,存在一定的差别,但是这个不重要,生活中我们一般是基于用户给用户推荐Top问题,而不是打分情况,即只要排好序就可以。

使用准则:

    一般我们有这么个准则,哪个维度小用哪个,电商网站物品的矩阵远大于用户矩阵,规模太大有时候造成一些慢,相反一样。

下面来比较这两种推荐方式的优缺点,如下:

或许这里大家可能会对冷启动有点疑问,下面我们就列出来一下什么是冷启动:

冷启动分为3类:

1、用户冷启动

  • 提供热门排行榜,等用户数据收集到一定程度再切换到个性化推荐
  • 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化
  • 利用用户社交网络账号,导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品
  • 在用户新登录时要求其对一些物品进行反馈,收集这些兴趣信息,然后给用户推荐相似的物品

2、物品冷启动

  • 给新物品推荐给可能对它感兴趣的用户,利用内容信息,将他们推荐给喜欢过和它们相似的物品的用户
  • 物品必须能够在第一时间展现给用户,否则经过一段事件后,物品的价值就大大降低了
  • UserCF和ItemCF都行不通,只能利用Content based解决该问题,频繁更新相关性数据,这是一个积累用户行为数据的一个过程,刚开始用户量还不是很多的情况下

3、系统冷启动

  • 引入专家知识,通过一定高效方式迅速建立起物品的相关性矩阵,引入专家知识就相当于提前引入一些固化好的逻辑,比如同样是两个30岁的人,而且都是女性,但所处的角色不一样,一个是职场女性,一个是家庭主妇,比如给这两个用户推荐衣服的时候,就需要一些专家知识,就会引入一些系统图谱,提前给它挖掘好的分类

以上就是对协同过滤算法一个简单的分析,如有错误欢迎指正,小编会再接再厉。

猜你喜欢

转载自blog.csdn.net/u013982921/article/details/81259276
今日推荐