问题背景
当用户在浏览商品详情页的时候,从行为上分析,意味着用户对这个款式和类型的商品感有兴趣,如何准确推荐这些用户感兴趣的商品成了一大问题,在其他电商平台中,经常会有“浏览此商品的顾客也同时浏览”或者“看了又看”的推荐商品场景,如下图Amazon的Customers who bought this item also bought,给顾客推荐“浏览过这个商品的顾客们所买的商品”。那么是怎么进行的呢?
浏览过这个商品的顾客们所买的商品.png问题分析
根据网上找到的相关资料,这个方式为基于物品的协同过滤算法,通过分析的用户行为数据,计算物品之间的相似度,预测用户喜欢的商品,推荐给用户。
原理-基于物品的协同过滤
协同过滤算法分为以下两类
-
基于用户的协同过滤算法(user-based collaboratIve filtering)
-
基于物品的协同过滤算法(item-based collaborative filtering)
简单的说就是:人以类聚,物以群分。这里主要介绍基于物品的协同过滤算法。
基于物品的协同过滤算法,用于计算商品之间的相似度,即对商品 aa 有过行为的用户还对哪些商品有过行为。这里的行为可以是CLICK、FAV、CART和ORDER,代表用户对商品的态度和偏好。如果对商品 aa 有过行为的用户中大部分还对商品 bb 有过行为,则认为商品 aa 和商品 bb 比较相似。
基于物品的协同过滤.png算法
以商品 aa 和商品 bb 为例,如何计算商品之间的相似度呢:
我们使用下面的公式定义物品的相似度:
其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)&N(j)|是同时喜欢物品i和物品j的用户数。
从上面的定义看出,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,两个物品相似度越高,说明这两个物品共同被很多人喜欢。
这里面蕴含着一个假设:就是假设每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。
举例,用户A对物品a、b、d有过行为,用户B对物品b、c、e有过行为,等等;
依此构建用户——物品倒排表:物品a被用户A、E有过行为,等等;
建立物品相似度矩阵C:
image.png其中,C[i][j]记录了同时喜欢物品i和物品j的用户数,这样我们就可以得到物品之间的相似度矩阵W。
那个上面得出来公式应该是
也许到这里会有疑问,怎么跟第一条的公式不一样?之所会这样,是因为考虑到下面几种情况,加入了相关的优化:
1.如果物品J很热门,很多人喜欢,那么第二条公式中的Wij就会无限接近于1。因此,为了避免推荐出热门的物品,需要对物品J的权重进行惩罚:
第一次公式优化2.如果一个用户,他是做代理商的,在网站上浏览了很多商品,也进行了加入购物车行为,那么这个用户在系统中就产生了很多的相似度,但是实际上这个用户并不是真的感兴趣,真正的贡献度并不如一个普通用户。因此应该增加IUF参数来修正物品相似度的计算公式:
第二次公式优化3.特殊用户的行为不纳入计算商品相似度的数据集范围中;
4.对于用户行为稀少的新商品,在上述基于物品的协同过滤算法中被过滤掉了,因此,在最终的推荐结果中不会出现这些商品。
5.行为的权重,不同的行为在计算相似度的时候,权重分配应该不一样;
网友评论