写在正文之前
最近在做推荐系统,在项目组内做了一个分享。今天有些时间,就将逻辑梳理一遍,将ppt内容用文字沉淀下来,便于接下来对推荐系统的进一步研究。推荐系统确实是极度复杂,要走的路还很长。
A First Glance
为什么需要推荐系统——信息过载
随着互联网行业的井喷式发展,获取信息的方式越来越多,人们从主动获取信息逐渐变成了被动接受信息,信息量也在以几何倍数式爆发增长。举一个例子,PC时代用google reader,常常有上千条未读博客更新;如今的微信公众号,也有大量的红点未阅读。垃圾信息越来越多,导致用户获取有价值信息的成本大大增加。为了解决这个问题,我个人就采取了比较极端的做法:直接忽略所有推送消息的入口。但在很多时候,有效信息的获取速度极其重要。
由于信息的爆炸式增长,对信息获取的有效性,针对性的需求也就自然出现了。推荐系统应运而生。
亚马逊的推荐系统
最早的推荐系统应该是亚马逊为了提升长尾货物的用户抵达率而发明的。已经有数据证明,长尾商品的销售额以及利润总和与热门商品是基本持平的。亚马逊网站上在线销售的商品何止百万,但首页能够展示的商品数量又极其有限,给用户推荐他们可能喜欢的商品就成了一件非常重要的事情。当然,商品搜索也是一块大蛋糕,亚马逊的商品搜索早已经开始侵蚀谷歌的核心业务了。
在亚马逊的商品展示页面,经常能够看见:浏览此商品的顾客也同时浏览。
这就是非常典型的推荐系统。八卦一下:”剁手族”的兴起,与推荐系统应该有一定关系吧,哈哈。
推荐系统与大数据
大数据与云计算,在当下非常热门。不管是业内同事还是其他行业的朋友,大数据都是一个常谈的话题。就像青少年时期热门的话题:“性”。大家都不太懂,但大家都想说上几句。业内对于大数据的使用其实还处于一个比较原始的探索阶段,前段时间听一家基因公司的CEO说,现在可以将人类的基因完全导出为数据,但这些数据毫无规律,能拿到这些数据,但根本不知道可以干什么。推荐系统也是利用用户数据来发现规律,相对来说开始得更早,运用上也比较成熟。
冷启动问题
推荐系统需要数据作为支撑。但亚马逊在刚刚开始做推荐的时候,是没有大量且有效的用户行为数据的。这时候就会面临着“冷启动”的问题。没有用户行为数据,就利用商品本身的内容数据。这就是推荐系统早期的做法。
基于内容的推荐:
tag 给商品打上各种tag:运动商品类,快速消费品类,等等。粒度划分越细,推荐结果就越精确
商品名称,描述的关键字 通过从商品的文本描述信息中提取关键字,从而利用关键字的相似来作推荐
同商家的不同商品 用户购买了商店的一件商品,就推荐这个商店的其他热销商品
利用经验,人为地做一些关联 一个经典的例子就是商店在啤酒架旁边摆上纸尿布。那么,在网上购买啤酒的人,也可以推荐纸尿布?
由于内容的极度复杂性,这一块儿的规则可以无限拓展。基于内容的推荐与用户行为数据没有关系,在亚马逊早期是比较靠谱的策略。但正是由于内容的复杂性,也会出现很多错误的推荐。比如:小明在网上搜索过保时捷汽车模型。然后推荐系统根据关键字,给小明推荐了价值200万的保时捷911......
用户行为数据—到底在记录什么
在游戏里面,我们的人物角色是一堆复杂的数据,这叫做数据存储;这些数据以一定的结构组合起来,这叫做数据结构。同样地,在亚马逊眼里,我们就是一张张表格中一大堆纷繁复杂的数字。举一个栗子:
小明早上9点打开了亚马逊,先是浏览了首页,点击了几个热销的西装链接,然后在搜索栏输入了nike篮球鞋,在浏览了8双球鞋后,看了一些购买者的评价,最终选定了air jordan的最新款。
这就是一条典型的用户行为数据。亚马逊会将这条行为拆分成设定好的数据块,再以一定的数据结构,存储到亚马逊的用户行为数据仓库中。每天都有大量的用户在产生这样的行为数据,数据量越多,可以做的事情也就越强大。
user-item 用户偏好矩阵
收集数据是为了分析用户的偏好,形成用户偏好矩阵。比如在网购过程中,用户发生了查看,购买,分享商品的行为。这些行为是多样的,所以需要一定的加权算法来计算出用户对某一商品的偏好程度,形成user-item用户偏好矩阵。
数据清理
当我们开始有意识地记录用户行为数据后,得到的用户数据会逐渐地爆发式增长。就像录音时存在的噪音一样,获取的用户数据同样存在着大量的垃圾信息。因此,拿到数据的第一步,就是对数据做清理。其中最核心的工作,就是减噪和归一化:
减噪:用户行为数据是在用户的使用过程中产生的,其中包含了大量的噪音和用户误操作。比如因为网络中断,用户在短时间内产生了大量点击的操作。通过一些策略以及数据挖掘算法,来去除数据中的噪音。
归一化:清理数据的目的是为了通过对不同行为进行加权,形成合理的用户偏好矩阵。用户会产生多种行为,不同行为的取值范围差距可能会非常大。比如:点击次数可能远远大于购买次数,直接套用加权算法,可能会使得点击次数对结果的影响程度过大。于是就需要归一算法来保证不同行为的取值范围大概一致。最简单的归一算法就是将各类数据来除以此类数据中的最大值,以此来保证所有数据的取值范围都在[0,1]区间内。
降维算法——SVD奇异值分解
通过记录用户行为数据,我们得到了一个巨大的用户偏好矩阵。随着物品数量的增多,这个矩阵的列数在不断增长,但对单个用户来说,有过行为数据的物品数量是相当有限的,这就造成了这个巨大的用户偏好矩阵实际上相当稀疏,有效的数据其实很少。SVD算法就是为了解决这个问题发明的。
将大量的物品提取特征,抽象成了3大类:蔬菜,水果,休闲服。这样就将稀疏的矩阵缩小,极大的减少了计算量。但这个例子仅仅是为了说明SVD奇异值分解的原理。真正的计算实施中,不会有人为的提取特征的过程,而是完全通过数学方法进行抽象降维的。通过对矩阵相乘不断的拟合,参数调整,将原来巨大的稀疏的矩阵,分解为不同的矩阵,使其相乘可以得到原来的矩阵。这样既可以减少计算量,又可以填充上述矩阵中空值的部分。
协同过滤算法
我一直在强调用户行为数据,目的就是为介绍协同过滤算法做铺垫。协同过滤,Collaborative Filtering,简称CF,广泛应用于如今的推荐系统中。通过协同过滤算法,可以算出两个相似度:user-user相似度矩阵; item-item相似度矩阵。
为什么叫做协同过滤?是因为这两个相似度矩阵是通过对方来计算出来的。举个栗子:100个用户同时购买了两种物品A和B,得出在item-item相似度矩阵中A和B的相似度为0.8; 1000个物品同时被用户C和用户D购买,得出在user-user相似度矩阵中C和D的相似度是0.9. user-user, item-item的相似度都是通过用户行为数据来计算出来的。
计算相似度的具体算法,大概有几种:欧几里得距离,皮尔逊相关系数,Cosine相似度,Tanimoto系数。具体的算法,有兴趣的同学可以google.
用户画像
提到大数据,不能不说用户画像。经常看到有公司这样宣传:“掌握了千万用户的行为数据,描绘出了极其有价值的用户画像,可以为每个app提供精准的用户数据,助力app推广。” 这样的营销广告经不起半点推敲。用户对每个种类的app的行为都不同,得到的行为数据彼此之间差别很大,比如用户在电商网站上的行为数据,对音乐类app基本没有什么价值。推荐系统的难点,其中很大一部分就在于用户画像的积累过程极其艰难。简言之,就是用户画像与业务本身密切相关。
LR逻辑回归
基于用户偏好矩阵,发展出了很多机器学习算法,在这里再介绍一下LR的思想。具体的逻辑回归,又分为线性和非线性的。其他的机器学习算法还有:K均值聚类算法,Canopy聚类算法,等等。有兴趣的同学可以看看July的文章。链接在最后的阅读原文。
LR逻辑回归分为三个步骤:
提取特征值
通过用户偏好矩阵,不断拟合计算,得到每个特征值的权重
预测新用户对物品的喜好程度
举个栗子:
小明相亲了上千次,我们收集了大量的行为数据,以下数据仅仅是冰山一角。
通过大量的拟合计算得出,特征值“个性开朗程度”的权重为30%,“颜值”的权重为70%。哎,对这个看脸的世界已经绝望了,写完这篇文章,就去订前往韩国的机票吧。
然后,通过拟合出的权重,来预测小明对第一千零一次相亲对象的喜爱程度。
这就是LR逻辑回归的原理。具体的数学算法,有兴趣的同学可以google之。
如何利用推荐系统赚钱
还是以亚马逊为例。小明是个篮球迷,每个月都会买好几双篮球鞋。通过几个月的购买记录,亚马逊已经知道小明的偏好,准备给小明推荐篮球鞋。但篮球鞋品牌这么多,推荐哪一个呢?笑着说:哪个品牌给我钱多,就推荐哪个品牌。这就是最简单的流量生意了。这些都叫做:商业规则。
但在加入商业规则之前,需要让用户感知到推荐的准确率。如果一开始就强推某些置顶的VIP资源,会极大地损害用户体验,让用户觉得推荐完全没有准确性。这样的后果对于推荐系统的持续性发展是毁灭性的。
过滤规则
协同过滤只是单纯地依赖用户行为数据,在真正的推荐系统中,还需要考虑到很多业务方面的因素。以音乐类app为例。周杰伦出了一张新专辑A,大部分年轻人都会去点击收听,这样会导致其他每一张专辑相似专辑中都会出现专辑A。这个时候,再给用户推荐这样的热门专辑就没有意义了。所以,过滤掉热门的物品,是推荐系统的常见做法之一。这样的规则还有很多,视不同的业务场景而定。
推荐的多样性
与推荐的准确性有些相悖的,是推荐的多样性。比如说推荐音乐,如果完全按照用户行为数据进行推荐,就会使得推荐结果的候选集永远只在一个比较小的范围内:听小清新音乐的人,永远也不会被推荐摇滚乐。这是一个很复杂的问题。在保证推荐结果准确的前提下,按照一定的策略,去逐渐拓宽推荐结果的范围,给予推荐结果一定的多样性,这样才不会腻嘛。
持续改进
推荐系统具有高度复杂性,需要持续地进行改进。可能在同一时间内,需要上线不同的推荐算法,做A/B test。根据用户对推荐结果的行为数据,不断对算法进行优化,改进。要走的路还很长:路漫漫其修远兮,吾将上下而求索。
原文发布时间为:2015-07-11
本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“BigDataDigest”微信公众号