文章原创,最近更新:2018-06-21
1.推荐思路
2.User-based CF
3.Item-based CF
4.优化问题
5.小结
推荐算法在现在很多电子商务网站中普遍应用.
推荐系统核心要解决的问题是提高转化率也就是经过分析,要猜测某一个用户更喜欢什么商品,更可能购买什么商品或者更喜欢哪些歌曲文章,在系统中要进行适当形式的推荐如页面飘窗、营销邮件、短信息等。
1.推荐思路
在电子商务网站中有这样的场景,就是系统期望通过分析(或者说猜测)给用户推荐一些商品,从而提高购物的转化率。
给用户推荐一些商品,从而提高购物的转化率。比如在实体店中,会经常在超市或者商场里看到那些卖酸奶的小妹妹会老远就招呼小女孩过去尝尝她们的新品酸奶。
1.1贝叶斯分类
可以尝试使用朴素贝叶斯分类的思路来做一下推荐。通过统计某用户所有购买物品的分布特性,统计该用户购买物品的分布情况。
案例:
如某用户,他在某网站一共购买过100件商品,其中70件是数码产品或小家电,20件是登山用品,10件是其他各类用品。
- 在70件数码产品中,有40件是各类音像制品,5件是手机,5件是笔记本电脑,还有30件是U盘、鼠标、MP3、iPad、音箱、USB充电器等各种外设。
- 20件登山用品里有3件帐篷、3件登山服、3双登山靴、3个登山包、3支登山杖、3顶登山帽、还有2只专用手电。
- 10件各类用品就非常杂了,有零食、箱包、内衣裤、日化用品等。
这种情况下,其实拿来一个新的商品,判断要不要推荐给某人,就看他购买的记录的偏重,可以说购买音像制品的概率是最高的,在全部的100件货物里占了40%,其他类别的分析也是同理。
所以这种情况下,有理由相信,为这个用户推荐一个音像制品要比什么都不推荐是有更高的转化率的,刚刚的统计结果就是根据。
1.2利用搜索记录
在网店里,网店会根据用户搜索过的关键词猜测用户想要买某些产品,所以在列出产品列表的同时也会在右侧给用户推荐一些商品。
目前协同过滤公认的应该是两种思路,第一种是利用早期大家研究比较多的邻居方法。而邻居方法中也有两种视角,我们分别来看一下。
- 第一种,基于用户。也就是说,系统通过分析个用户和哪些用户的特征比较像,然后看看这些用户喜欢买哪类的商品,再从这些商品里挑出一些推荐给该用户。
- 第二种,基于商品。也就是说,系统通过分析用户的购买行为来判断用户喜欢的商品类型,然后从那些用户喜欢的商品类型里挑出一些推荐给用户。
前者称为User-based CF(User-based Collaborative Filtering),或者叫基于用户的协同过滤;后者称为tem-based CF(Item-based Collaborative Filtering),或者叫基于商品的协同过滤
除了邻居方法外,目前研究得比较多是另外类方法,也是第二种思路一一基于模型的推荐算法。
2.User-based CF
当一个用户进入一个网店时,作为网店系统找到那些和该用户兴趣(喜好)类似的人,然后看看他们喜欢什么,就给该用户推荐什么也许是一种不错的选择。
第一步,看能不能找到这样的用户。用户与商品偏好如表所示。
以用户00001为研究对象,要找到和他兴趣最接近的人,怎么做比较好呢?这里需要引入一个概念,叫做余弦相似性。
拓外:
用a和b的向量坐标求a和b夹角大小,代入上面的公式:
再看刚刚的例子,把用户在一些不相干的商品类别的爱好当做一个空间向量,把每个商品类别作为一个维度,就像刚才的x和y坐标那样。我们试着求一下00001这个用户和00002这个用户已知部分的爱好相似程度。
因为知道最相似的是1,最不相似的是-1,所以这个相似度还是很高的。
同理也能够求出00001用户和其他任何一个用户的兴趣相似程度。
之后设置一个相似的阈值,如0.8、0.85.或者其他任何一个值,看看相似度超过这个间值的用户都有什么购物喜好,把他们喜好购买的东西推荐给00001用户作为推荐方案即可。这就是一种思路最为朴素的基于用户的协同过滤算法思路。
3.Item-based CF
这种算法给用户推荐那些和他们之前喜欢的商品相似的商品。这个算法主要通过分析用户的行为来计算物品之间的相似度。
句话概括就是这样:“有很多人喜欢商品A,同时他们也喜欢商品B,所以A和B应该是比较类似的商品。”这就是整个算法的核心思路计算起来可以分成以下两个步骤。
(1)计算商品之间的相似度。
(2)根据物品的相似度和用户的偏好来给用户生成推荐列表。
这里同样用到了余弦相似性的概念,但是公式略有不同,具体如下:
解释一下,如果计算商品A和商品B的相似性,那么就计算这个商值,分子是同时喜欢A和B两个商品的用户数量,分母是喜欢A的用户数量和喜欢B的用户数量的乘积的平方根。
如果要得到产品和用户喜好数量的关系,计算过程如下。
- 用户00001:象棋、扑克牌、篮球
- 用户00002:扑克牌、乒乓球、乒乓球拍
- 用户00003:乒乓球、乒乓球拍用户
- 00004:围棋、扑克牌用户
- 00005:象棋、围棋、足球、扑克牌这是一个文娱用品商店的销售记录,记录了每个用户购买的产品内容,这里只用5个用户来做一个演示。
首先要分别得到每个用户购买物品的邻接矩阵,如用户00001购物邻接矩阵如下图所示。
标注1的小格子代表这两种一起在一个人的购物记录里出现过一次一一注意买过就算,可不是必须出现在同一次购物篮里,这一点和关联分析时所用的 Apriori算法的场景是不同的。
同样能够得到其他几个人的购物邻接矩阵。用户00002购物邻接矩阵如表所示。
用户00003购物邻接矩阵如表所示。
用户00004购物邻接矩阵如表所示。
用户00005购物邻接矩阵如表所示。
所有的这种邻接矩阵都是沿对角线对称的。
下一步把这些矩阵“叠加”在一起,即将每一个矩阵的每个对应的方格数字相加,最后得到如表138所示的中间矩阵C。
从这个中间矩阵里,可以看到同时喜欢象棋和扑克牌的有2个人,同时喜欢乒乓球拍和乒乓球的有2个人,同时喜欢围棋和象棋的有1个人……)由于矩阵是对称的,所以读右上方的三角形就足够了。
这时如果对任意两个商品的相似度做评估,如计算象棋和围棋的相似程度,套用刚才的公式:
分子是同时喜欢围棋和象棋的人,下面两个值N(A)和N(B)就是喜欢围棋和喜欢象棋的人一一这两个值要从前面的购物记录里得到。
象棋和围棋的相似度约为0.5。
再试算一下乒乓球拍和乒乓球的相似度
说明相似度极高,买乒乓球的人必买乒乓球拍,买乒乓球拍的人必买乒乓球全表(商品相似度)如表所示。
计算完中间矩阵C之后,当要对一个用户做推荐时,先把这个用户的历史购买记录都列出来,假设有n个购买记录。然后对这个列表里每一个产品都用查表的方法查一次相似度,这样会得到n个列表,每个列表里都是一个产品和其对应的相似度的关系。把这n个列表做一个排序,相似度高的在前,相似度低的在后。如果要推荐3个商品就取前3个如果要推荐5个商品就取前5个。
4.优化问题
4.1规模和效率
如果商品有100万种商品,每种商品都被人买过至少一次,那么会产生一个100万×100万的矩阵,也就是10000亿个单位的表格。如果每个单位都用4字节的整数来计数,光这个表格就至少要使用364TB的数据一-别说内存了,硬盘放都困难。
那么真的应该挑出100万种商品做这个邻接矩阵的计算吗?未必,而且我也不推荐那样做。可以尝试着只从活跃用户的购物列表去找候选产品,也可以从最近半年被人购买的产品中找候选产品,也可以两者结合来进行。
4.2覆盖率
在Item-based算法中还会存在一种问题,那就是关于覆盖率和多样性的问题.
假设经过计算某用户喜欢的物品里有3本不同的书,3件不同的衣服,3盒不同品牌型号的乒乓球。很可能由于购买乒乓球时就会买乒乓球拍,导致进行商品相似度计算时,给该用户推荐的商品里乒乓球拍的相似度总是最高的,该用户也只会收到系统关于乒乓球拍的商品推荐,而这其实不是我们期望得到的。其次,那些热门商品之间的相似度也会非常高,因为大家在一个时间段内都买这些热门商品的概率比较高,所以这些商品之间的相似度计算出来自然就比较高.
我们期望的不是一个高度收敛的推荐算法,而是商品种类要丰富,也就是商品的覆盖率要高,要保证它的多样性。这里需要用到一个物品相似度的归一化算法。
所谓归一化就是把商品相似度矩阵做如下变化:
也就是对每一行的相似度值和当前行的最大值计算一个比值,把这个比值当作新的结果放在矩阵里,变换之后的归一化商品相似度矩阵如表所示(商品相似度Norm)。
再比如:
比如某一年由于考题设计太难,导致整个年级的学生最高分才59分,即便可以让他们每个人都算挂科一次,但是考试的选拔特性变得不太好,考生之间的档次也看不出来。
这里可以进行一次核算,和刚才的公式一样,让这个最高分的59分换算为100分,其他各位学生的分数同样做这种换算,那么就是套用如下公式
这样做的好处不是为了挽救一些人让他们不要被列入不及格的范畴,而是把原本分布很窄的一个分数区间拉开了,让分数和分数、人和人之间的距离感更好,便于进一步遴选和分类。
5.小结
推荐系统是一个综合的生产过程,几乎所有用来提高转化率的方法都可以用来作为推荐系统的部分。
可以采用在本章中提到的协同过滤算法,可以采用基于用户画像的逻辑回归,也可以使用关键分析中的频繁项集去寻找可推荐的商品。
网友评论