数据分析之协同过滤算法
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。 摘自百度百科
-
推荐算法概述
推荐算法是非常古老的,在机器学习还没有兴起的时候就有需求和应用了。概括来说,可以分为以下5种:-
基于内容的推荐:这一类一般依赖于自然语言处理NLP的一些知识,通过挖掘文本的TF-IDF特征向量,来得到用户的偏好,进而做推荐。这类推荐算法可以找到用户独特的小众喜好,而且还有较好的解释性。这一类由于需要NLP的基础,本文就不多讲,在后面专门讲NLP的时候再讨论。
-
协调过滤推荐:本文后面要专门讲的内容。协调过滤是推荐算法中目前最主流的种类,花样繁多,在工业界已经有了很多广泛的应用。它的优点是不需要太多特定领域的知识,可以通过基于统计的机器学习算法来得到较好的推荐效果。最大的优点是工程上容易实现,可以方便应用到产品中。目前绝大多数实际应用的推荐算法都是协同过滤推荐算法。
-
混合推荐:这个类似我们机器学习中的集成学习,博才众长,通过多个推荐算法的结合,得到一个更好的推荐算法,起到三个臭皮匠顶一个诸葛亮的作用。比如通过建立多个推荐算法的模型,最后用投票法决定最终的推荐结果。混合推荐理论上不会比单一任何一种推荐算法差,但是使用混合推荐,算法复杂度就提高了,在实际应用中有使用,但是并没有单一的协调过滤推荐算法,比如逻辑回归之类的二分类推荐算法广泛。
-
基于规则的推荐:这类算法常见的比如基于最多用户点击,最多用户浏览等,属于大众型的推荐方法,在目前的大数据时代并不主流。
-
基于人口统计信息的推荐:这一类是最简单的推荐算法了,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后进行推荐,目前在大型系统中已经较少使用。
-
-
关于协同过滤算法的理解
- 用一句话概括就是 物理类聚,人以群分
- 更具体一点的话,可以将协同过滤算法分为两种:
- 基于用户的协同过滤算法 ( u s e r − b a s e d c o l l a b o r a t I v e f i l t e r i n g ) (user-based\ collaboratIve\ filtering) (user−based collaboratIve filtering):需要计算的是用户之间的相似度,找出喜好相似的用户,并预测或者有数据显示该用户的对物品的评分,那么就可以将评分最高的一些物品推荐给用户
- 基于物品的协同过滤算法 ( i t e m − b a s e d c o l l a b o r a t i v e f i l t e r i n g ) (item-based\ collaborative\ filtering) (item−based collaborative filtering):和上面一种类似,只不过是改成了找物品的相似度,通过对相似度高的物品进行预测,然后将最高评分的一些物品推荐给用户
- 那么显然协同过滤的算法的关键就是先用历史数据分析出用户的偏好,然后找出相似的用户或者物品。那么相似性度量 ( S i m i l a r i t y M e a s u r e m e n t ) (Similarity\ Measurement) (Similarity Measurement)就成了关键
-
相似性度量
- 度量的方法很多,这里介绍最基本的一种 — 夹角余弦,其余的学完了再来填坑
我们知道在二维空间中向量 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)与向量 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)的夹角余弦公式:
c o s ( θ ) = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 x 2 2 + y 2 2 cos(\theta)=\frac{x_1x_2+y_1 y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}} cos(θ)=x12+y12x22+y22x1x2+y1y2
两个 n n n维向量 A ( x 1 , x 2 , . . . , x n ) A(x_1,x_2,...,x_n) A(x1,x2,...,xn)和 B ( y 1 , y 2 , . . . , y n ) B(y_1,y_2,...,y_n) B(y1,y2,...,yn)的夹角余弦:
c o s ( θ ) = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 cos(\theta)=\frac{\sum_{i=1}^{n}{x_iy_i}}{\sqrt{\sum_{i=1}^n{x_i^2}}\sqrt{\sum_{i=1}^n{y_i^2}}} cos(θ)=∑i=1nxi2∑i=1nyi2∑i=1nxiyi - 其余的方法的话这里丢一个链接:相似性度量博客 还有这个:基于模型的协同过滤算法
- 度量的方法很多,这里介绍最基本的一种 — 夹角余弦,其余的学完了再来填坑
-
利用协同过滤算法做电影推荐
- 这里采用的最简单的夹角余弦做相似性测量的,更精准的做法有待慢慢学习,再回头来改进这篇博客
- 代码以及数据都放在:github