文档章节

协同过滤和推荐引擎简介

大数据之路
 大数据之路
发布于 2013/06/18 00:58
字数 1738
阅读 272
收藏 5
点赞 0
评论 0

推荐系统在个性化领域有着广泛的应用,从技术上讲涉及概率、抽样、最优化、机器学习、数据挖掘、搜索引擎、自然语言处理等多个领域。东西太多,我也不准备写连载,今天仅从基本算法这个很小的切入点来聊聊推荐引擎的原理。

1、推荐系统的策略

推荐引擎(系统)从不同的角度看有不同的划分,比如:

  • 按照数据的分类:协同过滤、内容过滤、社会化过滤
  • 按照模型的分类:基于近邻的模型、矩阵分解模型、图模型

上面的这种说法有点乱,换个说法:一般我们将推荐系统归纳于两项策略,一种是基于内容的过滤(content-based filtering)以及基于用户行为的协同过滤(collaborative filtering)。

基于内容的过滤创建了每个商品、用户的属性(或是组合)用来描述其本质。比如对于电影来说,可能包括演员、票房程度等。 用户属性信息可能包含地理信息、问卷调查的回答等。这些属性信息关联用户用户后即可达到匹配商品的目的。 当然基于内容的策略极有可能因为信息收集的不便而导致无法实施。

一个比较成功的内容过滤是 pandora.com 的音乐基因项目,一个训练有素的音乐分析师会对每首歌里几百个独立的特征进行打分。这些得分帮助pandora推荐歌曲。还有一种基于内容的过滤是基于用户人口统计特征的推荐,先根据人口统计学特征将用户分成若干个先验的类。对后来的任意一个用户,首先找到他的聚类,然后给他推荐这个聚类里的其他用户喜欢的物品。这种方法的虽然推荐的粒度太粗,但可以有效解决注册用户的冷启动(Cold Start)的问题。

与基于内容的过滤算法相对的另一种策略是:依赖于用户过去的行为的协同过滤,行为可以是过往的交易行为和商品评分,这种方式不需要显性的属性信息。协同过滤通过分析用户和商品的内在关系来识别新的 user-item 关系。一般来说基于用户行为的协同过滤方法要优于基于内容的技术,但会有冷启动的问题。对于新系统来说,基于内容的推荐则更优。

协同过滤领域主要的两种方式是最近邻(neighborhood)方法潜在因子(latent factor)模型。最近邻方法主要集中在 item 的关系或者是 user 的关系,是比较基础的过滤引擎。而潜在因子模型并不是选取所有的关系,而是通过矩阵分解的技术将共现矩阵的分解,比如提取20-100个因子,来表示原始矩阵信息(可以对比上面提到的音乐基因,只不过潜在因子模型是通过计算机化的实现)。

2、近邻协同过滤

矩阵分解技术稍稍复杂一点,暂不介绍,下面着重说一下 item_based 最近邻的协同过滤。

对于一般的协同过滤引擎,首先会有一个 item-item 的相似矩阵 S,比如下图所示(来自于 recommenderlab 包的 vignette 文档),它记录了每两个 item 间的相似情况。但由于计算量和内存的考虑,一般在构建推荐引擎时不会这么暴力的存储全部的相似信息,而是使用部分信息。比如(按行来看)和 i1 最相关的三个item是 i4,i5,i6,而另外的两个 item i2,i8则不参与计算。

介绍完相似矩阵,接下来就的最近邻协同过滤就非常简单了,假如用户 uα 对 i1,i5,i8 分别打了 2,4,5 分,根据相似阵 S 中 item 的相似程度,来计算其余未打分的 item 的评分,即

对于每个 item (相似)加权平均后的得分,再过滤已评分的 item

最后的 rα 则是对 item 的预测结果。

既然逻辑都讲清楚了,那不实现一下推荐引擎就有点说不过去了(语言:R)。

首先介绍一下原始的输入数据,共三列:第一列代表用户,第二列表示购买的 item 的名称,第三列表是用户在这个 item 上的评分:

 

x <- read.csv(textConnection("
  1,101,5.0
  1,102,3.0
  1,103,2.5
  2,101,2.0
  2,102,2.5
  2,103,5.0
  2,104,2.0
  3,101,2.5
  3,104,4.0
  3,105,4.5
  3,107,5.0
  4,101,5.0
  4,103,3.0
  4,104,4.5
  4,106,4.0
  5,101,4.0
  5,102,3.0
  5,103,2.0
  5,104,4.0
  5,105,3.5
  5,106,4.0  
"), header = FALSE)

接下来是根据上述用户行为,预测用户没有评分的 item 的得分:

 

rn <- sort(unique(x$V1))
cn <- sort(unique(x$V2))
library(Matrix)
y <- sparseMatrix(i = match(x$V1, rn), j = match(x$V2, cn), x = x$V3)    
h <- as.matrix(dist(t(y), diag = TRUE)^2)
h <- 1/(1 + h)
diag(h) <- 0
## 推荐引擎的四个参数:相似矩阵、购买了什么,得分是多少,推荐几个
recommend <- function(h = h, k = c(3, 5), score = c(4, 5), m = 1){
if(length(k) > 1) v <- colSums(h[k,] * score)/colSums(h[k,]) else v <- h[k,]
v[k] <- 0
od <- order(v, decreasing=T)[1:m]
return(list(colnames(h)[od], v[od]))
}
recommend(h, k = c(1,3), score = c(1, 5),  m = 2)

这也算是上代码量最短的协同过滤引擎之一了吧。

我们在返回来说几句推荐系统,如果仅仅将推荐看作是算法(尤其是协同过滤)确实很简单, 但即便是算法再准,对于一个登录用户,任意时刻都用一个算法推荐,鬼才搭理你;如果有脏数据在建模的时候也要优先搞定;网站页面设计差,用户体验很烂,照样没用。

借用张栋在2011推荐系统论坛曾提出的说法:

一个成功的resys推荐系统的影响权重:UI/UE 40%,data:30%, knowledge: 20, algorithm:10%

这事儿不那么简单。

3、推荐阅读:

基于Map-Reduce的相似度计算

http://blog.csdn.net/xinzhangyanxiang/article/details/9288589

探索推荐引擎内部的秘密,第 1 部分: 推荐引擎初探

http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html?ca=drs-

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤

http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html?ca=drs-

探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类

http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy3/index.html?ca=drs-

推荐系统中常用算法

http://blog.jobbole.com/72373/

推荐系统的那点事

http://www.admin10000.com/document/4995.html

基于Item的时序协同过滤算法

http://blog.sina.com.cn/s/blog_61c463090102uz22.html

协同过滤推荐算法在MapReduce与Spark上实现对比

http://mp.weixin.qq.com/s?__biz=MzA3MDQ4MzQzMg==&mid=217679325&idx=1&sn=d81e4b2380e097bfe70bd73db4846f26#rd

本文转载自:http://www.bjt.name/2013/06/recommendation-system/

共有 人打赏支持
大数据之路
粉丝 1476
博文 501
码字总数 343984
作品 0
武汉
架构师
mahout 之 Taste

Taste 简介 Taste 是 Apache Mahout 提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也...

一枚Sir ⋅ 2014/06/26 ⋅ 0

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(二)

基于 Apache Mahout 实现高效的协同过滤推荐 Apache Mahout 是 Apache Software Foundation (ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方...

东方神剑 ⋅ 2014/11/13 ⋅ 0

探索推荐引擎内部的秘密,第 1 部分: 推荐引擎初探

信息发现 如今已经进入了一个数据爆炸的时代,随着 Web 2.0 的发展, Web 已经变成数据分享的平台,那么,如何让人们在海量的数据中想要找到他们需要的信息将变得越来越难。 在这样的情形下,...

东方神剑 ⋅ 2014/11/13 ⋅ 0

[IBM DW] 购物网站商品推荐引擎初探

随着 Web 技术的发展,使得内容的创建和分享变得越来越容易。每天都有大量的图片、博客、视频发布到网上。信息的极度爆炸使得人们找到他们需要的信息将变得越来越 难。传统的搜索技术是一个相...

红薯 ⋅ 2011/03/20 ⋅ 2

推荐机制 协同过滤和基于内容推荐的区别

参考ibm文章 https://www.ibm.com/developerworks/cn/web/1103zhaoctrecommstudy1/index.html 该系列分为三部分 第 2 部分: 深入推荐引擎相关算法 - 协同过滤 第 3 部分: 深入推荐引擎相关算...

liaomin416100569 ⋅ 04/13 ⋅ 0

推荐算法综述

1. 前言 随着移动互联网技术和社交网络的发展,每天都有大量包括博客,图片,视频,微博等等的信息发布到网上。我们正处于大数据的时代,传统的信息检索技术已经不能满足用户对信息发现的需求...

u013709270 ⋅ 2017/11/24 ⋅ 0

协同过滤

协同过滤简介 协同过滤就是将物品或者人组织成邻居,这些邻居有相同相似的属性,则维护这些邻居的一个关系矩阵,矩阵的值就是他们的关系的值了,再乘以一个个体的列矩阵或者行矩阵,他们的推...

cjun1990 ⋅ 2016/10/14 ⋅ 0

机器学习相关——协同过滤

在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型...

~大器晚成~ ⋅ 2012/02/01 ⋅ 0

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用...

Endeavour ⋅ 2015/08/12 ⋅ 0

系列学习——推荐算法综述

作者:章华燕 编辑:祝鑫泉 随着移动互联网技术和社交网络的发展,每天都有大量包括博客,图片,视频,微博等等的信息发布到网上。我们正处于大数据的时代,传统的信息检索技术已经不能满足用...

u013709270 ⋅ 01/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 57分钟前 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部