一、推荐算法
当你在电商网站购物时,天猫会弹出“和你买了同样物品的人还买了XXX”的信息;当你在SNS社交网站闲逛时,也会看到“你可能认识XXX“的信息;当你在微博添加关注人时,也会看到“你可能对XXX也感兴趣”等等。所有这一切,都是背后的推荐算法运作的结果。
推荐算法,不是某一个也不是某一类算法,凡是能实现推荐功能的算法(比如关联算法、分类算法、聚类算法),都可称之为推荐算法。推荐功能就是为用户(User)推荐商品(Item)。
依据不同的角度,推荐大致分为以下几种:
1)基于内容的推荐:这一类一般依赖于自然语言处理NLP的一些知识,通过挖掘文本的TF-IDF特征向量,来得到用户的偏好,进而做推荐。这类推荐算法可以找到用户独特的小众喜好,而且还有较好的解释性。
2)基于流行度的推荐:常见的比如基于最多用户点击、最多用户浏览等,属于大众型的推荐方法,在目前的大数据时代并不主流。
3)基于人口统计信息的推荐:这一类是最简单的,它只是简单的根据用户的基本信息发现用户的相关程度,然后进行推荐,目前在大型系统中已经较少使用。
4)混合推荐:这个类似机器学习中的集成学习,博采众长,通过多个推荐算法的结合得到一个更好的。
5)协同过滤推荐:目前最主流的,花样繁多,在工业界已经有了很广泛的应用。它的优点是不需要太多特定领域的知识,可以通过基于统计的机器学习算法得到较好的推荐效果。工程上容易实现,方便应用到产品中。
sklearn没有单独的推荐算法模块。如果用到分类、聚类等算法可以用对应模块。也可以自己写个封装起来。
广义的推荐算法里,协同过滤只是其中一类。但由于市场上使用的大多都是协同过滤,就导致很多文章很多人在谈论推荐算法时,其实只是在说协同过滤。可以理解成狭义的推荐算法,即协同过滤。下文着重介绍协同过滤。
二、推荐算法之协同过滤
推荐系统需要同时具备速度快和准确度高两个特点,它必须在用户打开网站的几秒钟内做出反应,同时推荐的东西必须是用户感兴趣的。这两个条件无论哪一个得不到满足,推荐系统都是没有意义的。而协同过滤算法同时满足了这两个条件,这就是为什么协同过滤算法是主流的推荐算法的原因。
协同过滤(Collaborative Filtering,CF)包括在线的协同和离线的过滤两部分:在线协同,就是通过在线数据找到用户可能喜欢的物品;离线过滤,就是过滤掉不值得推荐的数据,比如评分低的数据、用户已经购买的数据。
协同过滤的模型一般为m个物品*n个用户的数据,只有部分用户和部分物品之间是有评分数据的,其它部分评分是空白。要用已有数据来预测那些空白评分,找到最高评分的物品推荐给用户。
一般来说,协同过滤推荐分为三种类型:
1.基于用户(user-based)的协同过滤:用户A与用户B相似,推荐用户A喜欢的物品给用户B。
2.基于物品(item-based)的协同过滤:物品X与物品Y相似,用户喜欢物品X,则推荐物品Y。
3.基于模型(model based)的协同过滤:基于样本信息构造推荐模型,根据实时的用户喜好信息预测推荐。
基于模型会用到像分类、聚类等机器学习以及深度学习的相关算法。不过我更愿意将它看成是基于用户或基于物品的实现策略,比如用关联算法找到相似物品,用分类算法判定用户喜欢还是不喜欢,最终还是回归到基于用户和基于物品的协同过滤上。参考https://www.cnblogs.com/chenliyang/p/6548306.html。
总结,协同过滤的核心思想可以简单概括为如下两道逻辑:
已知用户A喜欢的品牌用户B都喜欢,又知用户A喜欢品牌X,推理可知用户B也喜欢品牌X;
已知喜欢品牌X的用户都喜欢品牌Y,又知用户A喜欢品牌X,推理可知用户A也喜欢品牌Y。
这两种逻辑的核心都是计算相似度:
找用户间的相似度,物品不变,找用户对某些物品的评分;
找物品间的相似度,用户不变,找多个用户对物品的评分。
衡量相似度的常用指标有:皮尔逊相关系数、余弦相似度。
皮尔逊相关系数的计算公式:
i表示商品;Iu表示用户u评价的项集;Iv表示用户v评价的项集;
ru,i表示用户u对商品i的评分;rv,i表示用户v对商品i的评分;横线头表示平均评分。
三、协同过滤之示例
举例1,假设在音乐推荐系统中,一共有4个用户,7个音乐,每个用户对每个音乐的评价矩阵如下:
|
All About That Bass |
Shake It Off |
Black Widow |
Habits |
Bang Bang |
Don't Tell 'Em |
Animals |
Alice |
4 |
|
|
5 |
1 |
|
|
Bob |
5 |
5 |
4 |
4 |
2 |
|
|
John |
2 |
|
|
1 |
5 |
4 |
|
David |
|
3 |
|
|
|
|
3 |
注:总分为5分,空项表示该用户没有听过该音乐因此尚且没有做出过评价。
如何为用户Alice推荐一些她可能喜欢的音乐:表中Alice对All About That Bass和Habits这两首歌有着极高的评价(分别为4分和5分),但是不喜欢Bang Bang;通过观察不难发现Bob对All About That Bass和Habits也表示相当的喜欢(分别为5分和4分),但对Bang Bang评价较低(仅为2分)。因此Alice和Bob的品味是较为接近的,Bob就是Alice的最近邻用户。可以将Bob评分较高而Alice还没听过的音乐推荐给她。
举例2,五个用户对服装品牌的评分,其中用户D对达芙妮的评分是一个缺失值。要预测用户E对森马的评分。
真维斯 | 伊莎贝尔 | 阿迪达斯 | 达芙妮 | 森马 | |
A | 4 | 5 | 4 | 5 | 4 |
B | 3 | 4 | 4 | 2 | 3 |
C | 2 | 3 | 3 | 4 | 3 |
D | 3 | 5 | 4 | - | 3 |
E | 4 | 3 | 3 | 4 | ? |
使用余弦相似度作为用户之间或产品之间的相似度衡量指标。
1.基于用户的协同过滤算法:
用户D对于达芙妮的缺失值,使用平均值来代替,即:
计算得到用户A、B、C、D与用户E的余弦相似度分别是:
加权求用户A、B、C、D对森马评分的平均值,即用户E对森马的评分:
2.基于物品的协同过滤算法:
用户D对于达芙妮的缺失值,使用平均值来代替,即:
计算得到品牌真维斯、伊莎贝尔、阿迪达斯、达芙妮与森马的余弦相似度分别是:
(4*4+3*3+2*3+3*3)/((4^2+3^2+2^2+3^2)^0.5*(4^2+3^2+3^2+3^2)^0.5)=0.99
(5*4+4*3+3*3+5*3)/((5^2+4^2+3^2+5^2)^0.5*(4^2+3^2+3^2+3^2)^0.5)=0.98
(4*4+4*3+3*3+4*3)/((4^2+4^2+3^2+4^2)^0.5*(4^2+3^2+3^2+3^2)^0.5)=0.98
(5*4+2*3+4*3+3.75*3)/((5^2+2^2+4^2+3.75^2)^0.5*(4^2+3^2+3^2+3^2)^0.5)=0.97
加权求用户E对真维斯、伊莎贝尔、阿迪达斯、达芙妮评分的平均值,即用户E对森马的评分:
四、注意协同过滤的缺点
>>相关度计算公式难以选择:对同一元素基于用户计算余弦相关度和基于产品计算余弦相关度所得到的评分可能会有较大的差异。因此需要根据具体情景来选择相关度的计算公式。除了考虑公式是否对于精确度要求较高外,还要考虑系统是否稳健,即对异常值是否不敏感。
>>冷启动问题:它一般不会推荐新产品。这对于具有时效性的产品来说非常要命,比如电影院会希望在新电影上线时赶快推荐给用户,如果等到累积够数据后才开始推荐,那也就没有推荐的意义了。
>>算法模式固有问题:会忽略用户购买行为之间的关联性,从而犯一些很蠢的错误,比如你买了一个锤子后,接下来的两个月它都会坚持不懈的给你推荐锤子。
>>环境识别问题:一个好的推荐系统想要奏效,还必须将用户所处的情景考虑进去。比如一个用户总是在晚上九点到十点之间浏览新闻,那在下午五点时为他推荐新闻显然就很傻了,用户是不会看的。再比如用户浏览上班地点或住所地点附近的餐厅时,做推荐的意义不太大,因为用户可能本来就非常了解这附近的餐厅,而当用户突然浏览起较远地方的餐厅时,此时狂推某餐厅则很有可能奏效。
这些都对数据分析师的分析能力提出了挑战,分析师必须能够根据用户的不同意图为用户推荐不同的产品,这需要在一个系统中集合不同的算法,同时还要求数据分析师具有丰富的业务经验,了解业务中的逻辑性。
评分矩阵有多个空白数据如何处理、皮尔逊相关系数应用示例、其他相似度计算公式、基于用户和基于物品对性能的影响,都有内容说明可以参考。注意不要强记,不一定百分准确。可以结合项目应用进行验证。