关于商品推荐
你肯定有过这种有趣的经历,就是登入某些网站或者APP时,发现曾经在百度或者其他搜索引擎上搜索过的东西会出现在这些网站或APP的广告位上,又或者这些网站或APP上的的广告位上会出现一些与当前页面内容的关键词相关的内容推荐。这是网站的JavaScript代码读取了浏览器的本地Cookies(通常可以用来存储浏览器上的表单信息、用户名、搜索关键词等信息)和当前页面的文本信息,并做了相应的关键词提取,最后根据这些关键词来猜测用户可能感兴趣的内容再推荐到广告位上。
这是最早的一些较为简单的商品或广告推荐思路,但是你可能很快就发现它们的“愚蠢”之处,即搜索并购买了一些产品之后它依然不停地进行类似产品的推荐。比如购买了洗衣机还推荐洗衣机,买了空调还推荐空调(都不是一些高频回购的商品)。即便是在网站或APP能够得知我购买洗衣机和空调的成交记录的情况下仍然这样做,确实让我们觉得系统很弱智。
由此在这里向大家讲解目前较为常见的,更加智能的个性化商品推荐算法。
两种个性化商品推荐算法
首先要说明的是,我们所有的推荐算法,最终目的都是为了给用户推荐他可能感兴趣的商品,从而提高销售和转化率,忘记这个目的的所有算法设计都是自嗨。
目前常见的商品推荐算法是协同过滤,公认比较常用的方法俗称“邻居方法”。邻居方法中有两种视角。第一种是基于用户。第二种是基于商品。
基于用户的协同过滤,称为User-based CF(User-based Collaborative Filtering)。系统通过分析一个用户和哪些用户(参考用户)的特征比较相似,然后看看这些参考用户喜欢买哪类的商品,再从这些商品里挑出一些推荐给该用户。
基于商品的协同过滤,称为Item-based CF(Item-based Collaborative Filtering)。系统通过数据分析和挖掘用户的购买行为,来判断用户喜欢的商品类型,然后从那些用户喜欢的商品类型里挑出一些推荐给用户。
User-based CF 基于用户的协同过滤
算法核心思路:当用户进入一个电商平台时,作为电商平台系统找到那些和该用户兴趣/喜好类似的人,然后看看他们喜欢什么,就给该用户推荐什么。简而言之,A和B两个用户相似,然后给A推荐B喜欢的东西。
假设有用户ID为1001到1006的六个用户,他们对几种商品进行了浏览、收藏、购买、添加到购物车、评论、分享等操作。
为了得到用户对某类别产品的兴趣度,我们可以设计这样一个简单的模型,给不同的用户行为赋予不同的分值,比如浏览行为赋予0.1分。整体的行为分值如表:
满分10分,加到10后则不再累加。
然后,我们得到1001-1006六位用户对各种商品的偏好程度(得分)表:
其中表格的数字是用户对该商品“兴趣程度”的一个量化值,0为没兴趣,10为非常有兴趣。空白代表这个商品在系统内,还没有任何依据来判断兴趣如何。
以用户“1006”为研究对象,现在要找到和他兴趣最接近的人,该如何实现?这里便需要对商品的多维向量进行近似求法。
多维向量空间的相似性一般有两种求法,一种是欧几里得距离或曼哈顿距离,另一种是余弦相似度。这里用的是第二种余弦相似度来进行度量。
余弦函数相信大家都不陌生,就是中学时候学的cosine函数cos(θ)。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角的余弦值来评估他们的相似度。具体公式如下:
这里的Ai和Bi分别代表向量A和B的各分量。
给出的相似性范围从-1到1:结果为-1时意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。
用简单的话来说,最相似的是1,最不相似的是-1。
回到刚刚的例子,把用户在一些不相干的商品类别的爱好当做一个空间向量,把每个商品类别作为一个维度,我们列的例子中就有手机、平板、笔记本电脑、智能手表、自拍杆、红酒、白酒共7个维度。我们试着求一下1006这个用户和1005这个用户已知部分的爱好相似程度:
由于1006用户没有红酒和白酒的记录,所以没有用1005用户的红酒和白酒两个维度的分数来计算相似度。
因为“最相似的是1,最不相似的是-1”。所以1005和1006两个用户的相似度还是很高的。同理也能够求出1006用户和其他任何一个用户的兴趣相似程度。
之后设置一个相似的阈值,如0.8、0.85……或者其他任何一个值,看看相似度超过这个阈值的用户都有什么购物喜好,把他们喜好购买的东西推荐给1006用户作为推荐方案即可(例如例子中,1005和1006的喜好高度相似,就可以将1005的喜欢的红酒和白酒推荐给1006)。这就是一种思路最为朴素的基于用户的协同过滤算法思路。
补充:
除了上述通过分析用户的行为来设计这个用户相似度外,还可以考虑通过用户的画像思维来补充和完善这个用户协调过滤算法。用户属性表如表所示。
用户属性表
我们所有的产品几乎都会有这种用户属性表,这也是构建用户画像的常见方法,利用这种列表同样也能够去观察哪些用户之间更相似,然后找到相似的用户,再把这些用户比较喜好的,感兴趣的产品推荐给他。方法有很多,基本逻辑相同。以后有机会开一个用户画像专题再细讲。
Item-based CF 基于商品的协同过滤
基于物品的协同过滤算法最早由著名的电商公司亚马逊提出的。这种算法给用户推荐那些和他们之前喜欢的商品相似的商品。
一般,推荐算法核心思想是,给用户推荐那些和他们之前喜欢的物品相似的物品。
比如,内容推荐算法的“基于内容的协同过滤”,用户A之前阅读过《香港最后一个童话破灭——许志安出轨了》,该算法会根据此行为给你推荐《震惊!许志安给马明戴绿帽了》,但是基于物品的协同过滤有点不同,Item-based CF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。
Item-based CF算法认为,“有很多人喜欢商品A,同时他们也喜欢商品B,所以A和B应该是比较类似的商品。”
计算起来可以分成以下两个步骤:
计算商品之间的相似度。
根据物品的相似度和用户的偏好来给用户生成推荐列表。
(一)计算物品之间的相似度。
这里同样用到了余弦相似性来求物品的相似度,但是公式略有不同:
其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)&N(j)|是同时喜欢物品i和物品j的用户数。
从上面的定义看出,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,两个物品相似度越高,说明这两个物品共同被很多人喜欢。
这里面蕴含着一个假设:就是假设每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。
举例说明,首先我们假定有5个用户,分别为A、B、C、D、E,他们的商品购买记录分别如下:
这是一个文娱用品商店的销售记录,记录了每一个用户购买的产品内容,这里只用5个用户来做一个演示。
首先要分别得到每个用户购买物品的邻接矩阵,如用户A购物邻接矩阵如表所示:
用户A购物邻接矩阵
这个矩阵就是根据刚刚看到的用户A的购买记录得到的,由于红酒、啤酒和显示器同时出现在他的购物列表里,所以“红酒和啤酒”、“红酒和显示器”、“啤酒和显示器”两两“邻接”,也就是说这些标注1的小格子代表这两种一起在一个人的购物记录里出现过一次——注意买过就算,不是必须出现在同一次购物篮里。
同理能够得到其他B、C、D、E几人的购物邻接矩阵(所有的邻接矩阵都是沿对角线对称的。)。然后将A、B、C、D、E五人的邻接矩阵,通过矩阵“叠加”的方式,即将每一个矩阵的每个对应的方格数字相加,最后得到中间矩阵C,过程如下:
叠加过程
最终的叠加结果——中间矩阵C:
中间矩阵C
从这个中间矩阵C里,可以看到同时喜欢红酒和啤酒的有2个人,同时喜欢鼠标和键盘的有2个人,同时喜欢白酒和红酒的有1个人……由于矩阵是对称的,我为大家都划出了对角线,大家看表格对角线的一边就行。
这时便可以计算任意两个商品的相似度做评估了,如计算鼠标和键盘的相似程度,套用刚才的公式:
说明相似度极高,买键盘的人必买鼠标,买鼠标的人必买键盘。
再试算一下红酒和白酒的相似度:
说明相似度极高,买键盘的人必买鼠标,买鼠标的人必买键盘。
现在,再试算一下红酒和白酒的相似度:
以此类推,便可计算出所有商品之间的相似度。
(二)根据物品的相似度和用户的历史行为给用户生成推荐列表:
得到相似度后,便可以计算基于相似度的商品推荐列表了。
计算完中间矩阵之后,当要对一个用户做推荐时,先把这个用户的历史购买记录都列出来,假设有n个购买记录。然后对这个列表里每一个产品都用查表的方法查一次相似度,这样会得到n个列表,每个列表里都是一个产品和其对应的相似度的关系。把这n个列表做一个排序,相似度高的在前,相似度低的在后。如果要推荐3个商品就取前3个,如果要推荐5个商品就取前5个。
大概的推荐算法思路说到这大概就说完了,因为我们不是技术,产品经理了解到这个层面就差不多了。深挖一层还可以根据相似度和历史行为计算出用户对物品的感兴趣度,然后再给用户生成推荐列表。就是在相似度的维度上,在增加一个感兴趣的维度,作为推荐商品的衡量指标,思路相似,这里不再展开。
优缺点说明
优点是推荐都是基于用户的行为数据去不断学习和完善,在过程中发现用户的潜在商品兴趣,能给用户“制造惊喜”的同时,也在为自己制造惊喜。这是一个持续成长的过程,而推荐不过是其中的一个短程跑道,设计者的目光应该长远些,将最终的目放在构建行业的大数据库和用户画像的产业生态上。
缺点则是启动的门槛高,用户量不够时,商品量太少时几乎无法开展;并且学习量不够时推荐结果较差,就会导致文初说的“愚蠢”现象出现,这也是很多时候人工智能被大家吐槽为“人工智障”的原因之一。
总而言之
关于个性化推荐的算法,在网上有很多资料,也有很多其他的实现方法,区区在下,所知实在有限。这里只是尝试以产品经理的角度,用较简单的语言来将自己学到的推荐算法原理剖析给大家听。
关于产品经理要不要懂技术的问题,也是老生常谈了,高论很多,不敢多赞一词。只说一句,产品经理在算法产品的设计中,绝不能一句“做个性化推荐”就完事的,你须深入算法内部,了解算法,然后结合产品特点来优化和设计。