推荐算法 学习笔记一

“未来 30 年最大的财富会出现在这一领域;内容扩张得越多,就越需要过滤,以便使得注意力聚焦。注意力流到哪里,金钱就跟到哪里。”——摘自某笔记的博文

大学期间因为课题冲突(只要还是人懒欠思考),没有深入地去学习“机器学习”相关知识。近期看到很多关于推荐的博文,也与牛人同学有相关方面的接触,以前的懈怠令我大有悔意。亡羊补牢,犹未晚矣。

不过讲真,抛开主观因素,学点推荐相关的知识,对从事信息技术这个行业真的大有裨益。

言归正传,这篇文章介绍推荐算法(建议直接看英文原文,链接在最后)。

## 算法分类

推荐算法通常被分为四大类(1-4):

  • 协同过滤推荐算法
  • 基于内容的推荐算法
  • 混合推荐算法
  • 流行度推荐算法

除了这些种类以外,还有一些高级非传统的推荐算法(5)。

## 算法详细属性

1.协同过滤推荐算法

  • 简介:通过在用户的一系列行为中寻找特定模式来产生用户特殊推荐
  • 输入:仅仅依赖于惯用数据(例如评价、购买、下载等用户偏好行为)
  • 类型:
    • 基于邻域的协同过滤(基于用户和基于项)
    • 基于模型的协同过滤(矩阵因子分解、受限玻尔兹曼机、贝叶斯网络等等)
  • 优点:
    • 需要最小域
    • 不需要用户和项
    • 大部分场景中能够产生足够好的结果
  • 缺点:
    • 冷启动问题
    • 需要标准化产品
    • 需要很高的用户和项的比例(1:10)
    • 流行度偏见(有长尾的时候表现不够好)
    • 难于提供解释

2.基于内容的推荐算法

  • 简介:向用户推荐和其过去喜欢项的内容(例如元数据、描述、话题等等)相似的项
  • 输入:仅仅依赖于项和用户的内容/描述(除了惯用数据)
  • 类型:
    • 信息检索(例如 tf-idf 和 Okapi BM25)
    • 机器学习(例如朴素贝叶斯、支持向量机、决策树等等)
  • 优点:
    • 没有冷启动问题
    • 不需要惯用数据
    • 没有流行度偏见,可以推荐有罕见特性的项
    • 可以使用用户内容特性来提供解释
  • 缺点:
    • 项内容必须是机器可读的和有意义的
    • 容易归档用户
    • 很难有意外,缺少多样性
    • 很难联合多个项的特性

3.混合推荐算法

  • 简介:综合利用协同过滤推荐算法和基于内容的推荐算法各自的优点同时抵消各自的缺点
  • 输入:同时使用用户和项的内容特性与惯用数据,同时从两种输入类型中获益
  • 类型:
    • 加权
    • 交换
    • 混合
    • 特性组合
    • 案列
    • 特征增强
    • 元层次
  • 优点:
    • 由于单独使用协同过滤推荐算法和基于内容的推荐算法
    • 没有冷启动问题
    • 没有流行度偏见,可推荐有罕见特性的项
    • 可产生意外,实现多样性
  • 缺点:
    • 需要通过大量的工作才能得到正确的平衡

4.流行度推荐算法

  • 简介:这是一种推荐流行项的方法(例如最多下载、最多看过、最大影响的项)
  • 输入:使用惯用数据和项的内容(例如类目)
  • 优点:
    • 相对容易实现
    • 良好的基准算法
    • 有助于解决新用户冷启动问题
  • 缺点:
    • 需要标准化产品
    • 经常需要一些项的类型进行分类
    • 不会推荐新项(很少有机会被观测到)
    • 推荐列表不会改变太大

5.高级非传统推荐算法

  • 类型:

    • 深度学习
    • 学习等级
    • Multi-armed bandits(探索/开发)
    • 上下文感知推荐
    • 张量分解
    • 分解机
    • 社会推荐
  • 优点:
    • 利于勉强维持最终性能百分点
    • 你可以说你正在使用渐进的方式
  • 缺点:
    • 难于理解
    • 缺乏推荐工具支持
    • 没有为你的首个推荐系统提供推荐的方式

## 参考

参考文章链接:

http://www.infoq.com/cn/articles/recommendation-algorithm-overview-part01

https://buildingrecommenders.wordpress.com/2015/11/16/overview-of-recommender-algorithms-part-1/

## 结束语

“最重要的一点,在信息丰富的世界里,唯一稀缺的资源就是人类的注意力。”

时间: 2024-10-29 05:51:49

推荐算法 学习笔记一的相关文章

推荐算法学习笔记

推荐算法举个简单的例子,比如有个用户进来看了一堆内容,我们把他看的所有的历史行为,嵌入到推荐引擎当中去.这个推荐引擎就会生成个性化的频道,下次这个用户再登录,或者都不用下一次,过几分钟之后,他看到的内容就会根据他最近发生的历史行为发生变化,这就是推荐系统的基本逻辑.这种方法叫基于用户行为的推荐,当然是有一定局限性的.比如你只有一个用户行为的时候,你就不知道他会不会看一个从来没人看过的内容,这其实就是长尾问题.当你可以积累越来越多的用户,用户的历史行为会有助于你对长尾内容的理解. 推荐系统本质是在

带花树算法学习笔记

带花树算法学习笔记 难得yyb写了一个这么正式的标题 Q:为啥要学带花树这种东西啊? A:因为我太菜了,要多学点东西才能不被吊打 Q:为啥要学带花树这种东西啊? A:因为我做自己的专题做不动了,只能先去"预习"ppl的专题了 Q:为啥要学带花树这种东西啊? A:因为可以用来做题啊,比如某WC题目 先推荐一个很皮很皮的带花树讲解: 戳这里嗷 QaQ 言归正传 带花树的算法用来解决一般图的最大匹配问题 说起来,是不是想起来网络流里面的最小路径覆盖? 或者二分图的最大匹配的问题? 的确,带花

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

EM算法学习笔记2:深入理解

文章<EM算法学习笔记1:简介>中介绍了EM算法的主要思路和流程,我们知道EM算法通过迭代的方法,最后得到最大似然问题的一个局部最优解.本文介绍标准EM算法背后的原理. 我们有样本集X,隐变量Z,模型参数θ,注意他们3个都是向量,要求解的log似然函数是lnp(X|θ),而这个log似然函数难以求解,我们假设隐变量Z已知,发现lnp(X,Z|θ) 的最大似然容易求解. 有一天,人们发现引入任意一个关于隐变量的分布q(Z),对于这个log似然函数,存在这样一个分解: lnp(X|θ)=L(q,θ

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

算法学习笔记 最短路

图论中一个经典问题就是求最短路,最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划,这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是很好理解的,理解透自己多默写几次即可记住,机试时主要的工作往往就是快速构造邻接矩阵了. 对于平时的练习,一个很厉害的 ACMer  @BenLin_BLY 说:"刷水题可以加快我们编程的速度,做经典则可以让我们触类旁通,初期如果遇见很多编不出,不妨就写伪代码,理思路,在纸上进行整体分析和一步步的演算

[算法学习笔记]直接插入排序笔记

直接插入排序概念: 带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中 直接插入排序算法步骤: 1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1) 2.将R[K,i-1]中的记录均向后移动 3.移动后腾出K位置,插入R[i] (最坏)时间复杂度:O(n^2) 空间复杂度:O(1) /// <summary>

八大排序算法学习笔记:冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 算法原理: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有

由LCS到编辑距离—动态规划入门—算法学习笔记

一切计算机问题,解决方法可以归结为两类:分治和封装.分治是减层,封装是加层. 动态规划问题同样可以用这种思路,分治. 它可以划分为多个子问题解决,那这样是不是用简单的递归就完成了?也许是的,但是这样会涉及太多的不便的操作.因为子问题有重叠! 针对这种子问题有重叠的情况的解决,就是提高效率的关键. 所以动态规划问题可以总结为:最优子结构和重叠子问题. 解决这个子问题的方式的关键就是:memoization,备忘录. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方