zoukankan      html  css  js  c++  java
  • 机器学习之协同过滤算法(推荐系统)

    前言

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

    简介

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

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

    协同过滤算法

      所谓基于内容的推荐,就是说我们的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。没什么价值,还不如给他一个平均值。具体实现见下图:
                                                     
     
      计算出每部电影的评分平均值。然后把所有的评分都减去平均值进行计算。算出来的结果再加上平均值。

      

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

  • 相关阅读:
    JavaScript 金字塔
    最短路径—Dijkstra算法和Floyd算法
    Qt编程的一些技巧
    Qt-Creator 加入qwt库
    关于usr/bin/ld: cannot find -lxxx问题总结(Qt编译错误cannot find -lGL)
    根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统
    tslib1.4与Qt4.8.6的交叉编译与移植
    用树莓派做3G无线路由器
    python学习笔记6:面向对象
    pyhton学习笔记5:常用模块:datatime,random,json,re
  • 原文地址:https://www.cnblogs.com/steed/p/7459304.html
Copyright © 2011-2022 走看看