码迷,mamicode.com
首页 > 编程语言 > 详细

机器学习之协同过滤算法(推荐系统)

时间:2017-08-31 18:01:59      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:sso   基于   平均值   nbsp   前言   ==   距离   net   mic   

前言

           以下内容是个人学习之后的感悟,转载请注明出处~

 

 

简介

  很多网站都有推荐系统,向我们推荐我们想要地或者有可能需要的信息,那么它是怎么实现的呢?因为它们

都采用了推荐算法,在现今的推荐算法之中,最被大家广泛认可和采用的是协同过滤算法。

 

协同过滤算法

  所谓基于内容的推荐,就是说我们的item具备某些属性attrs,然后我们可以通过某个user的历史评分记录,
计算出该user对各种 属性 attr的喜好程度,从而可以给user推荐具备他喜欢的attr的item。
  比如说,每一部电影,都由 浪漫和动作 两种属性,如下图
                                  技术分享
  我们以Alice为例,她对前2个romance风格的电影评分很高,对最后2部 action类型的电影评分为0,那么第3
部电影的属性列表表示该电影时romance风格的,是不是可以预测 Alice对该电影的评分可能比较高呢?!当然!
  其实对于 Alice这个用户而言,就是一个我们已经熟知的 linear regression的问题。X是电影的attrs向量,y是用
户的评分。我们要求的theta就是user对各种attrs的偏好。
  详见下图公式:
                                        技术分享
  其算法,就是用 梯度下降法,每一步更新 theta即可,见下图,不用多说。
                                        技术分享
 
思考一个问题:
  item 的内在属性并不是什么时候都可以得到。就算有,按照一般人的思路,可能也得用大量的人力去填,而且还可能不准确。
  回顾一下,基于内容的推荐,是已知y和X,求theta。如果我们已知y和theta,就可以求X。
                                        技术分享
  于是,如果给theta一个初始化很小的值,可以来回利用上面两个式子,对X和theta进行求解。
  我们伟大的前辈发现了一种更好的方法,就是把两个 linear regression合并,如下图
                                       技术分享
  合并后,我们的最优化目标就从 J(theta) 和 J(X)变成了 J(theta,X)。
  算法描述如下:
                                       技术分享
  在这里,我们不需要 k = 0的特殊情况了,因为我们不需要手动添加 x=1这个元素。如果需要x=1,协同过滤算法会自己算出
一个 x=1。算法描述到此为止。
  那么,为什么该算法也叫做 矩阵分解算法呢。见下图,我们把 Y矩阵,转换成了 Theta和X两个矩阵的乘积。
                                        技术分享
  
  那么,怎么找到与 movie i最相似的5个movie呢?
  计算距离:
                             技术分享
  这个距离可能很大。更好的计算距离或者说相似的的方法有 皮尔逊相似度,余弦相似度,欧拉距离相似度等等,这些相似度的
取值范围都在 -1~1之间。
 
  如果一个用户是新来的,没有任何评分记录,怎么给他推荐?
  如果一个用户没有评分记录,那么用 CF方法算出来的评分都是0。没什么价值,还不如给他一个平均值。具体实现见下图:
                                                 技术分享
 
  计算出每部电影的评分平均值。然后把所有的评分都减去平均值进行计算。算出来的结果再加上平均值。

  

 

以上是全部内容,如果有什么地方不对,请在下面留言,谢谢~

机器学习之协同过滤算法(推荐系统)

标签:sso   基于   平均值   nbsp   前言   ==   距离   net   mic   

原文地址:http://www.cnblogs.com/steed/p/7459304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!