Amazon的推荐系统
本文引自http://blog.csdn.net/fwing/article/details/4942886
现在的推荐系统特别火啊。做得最好的应该是Amazon了。
上面是Amazon的图书推荐。
用的就是著名的 协同过滤(Collaborative filtering)算法。
我们用一个简单的例子来说明。
下面是一个用户购买的书籍的表格。
|
计算机网络 |
算法导论 |
人工智能 |
数据库系统实现 |
概率统计 |
GRE 词汇手册 |
|
|
小明 |
1 |
0 |
1 |
0 |
1 |
0 |
|
小张 |
0 |
1 |
1 |
0 |
1 |
0 |
|
小李 |
1 |
1 |
0 |
0 |
0 |
0 |
|
小王 |
0 |
0 |
0 |
0 |
1 |
1 |
上面的1表示购买,0表示没有购买。
那么我们怎么来给小明推荐书籍呢?
先来看看Amazon之前的传统的协同过滤(Collaborative filtering)是怎么做的。
首先呢,根据每个人买的书籍,我们可以将每个用户表示成一个向量。
例如,
V(小明)=<1, 0, 1, 0, 1, 0>
V(小张)=<0, 1, 1, 0, 1, 0>
V(小李)=<1, 1, 0, 0, 0, 0>
V(小王)=<0, 0, 0, 0, 1, 1>
然后呢,我们做这样的假设,买书习惯跟小明类似的人,如果购买了小明没有买的书,那么我们就认为,小明很有可能买这本书。
于是,问题变成了找买书习惯跟小明类似的人。提到向量跟相似度,我们自然就想到了用余弦来衡量相似度。
扔个公式在此给那些忘记了的童鞋们。
接下来,大家动手算一下吧。
cos<V(小明), V(小张) >=0.67
cos<V(小明), V(小李) >=0.41
cos<V(小明), V(小王) >=0.41
呵呵,那么跟小明习惯最像的就是小张了。
然后,我们发现小张买了《算法导论》,但是小明没有买,于是我们就给小明推荐《算法导论》。
这个方法看起来很不错,那么为什么Amazon提出了另外的一种方法呢?
再来看看Amazon的item-to-item协同过滤系统吧。
有一天呢,Amazon的一个工程师脑袋抽筋,不小心把上面的表格拿错方向了。于是变成了下面的样子。
|
小明 |
小张 |
小李 |
小王 |
|
|
计算机网络 |
1 |
0 |
1 |
0 |
|
算法导论 |
0 |
1 |
1 |
0 |
|
人工智能 |
1 |
1 |
0 |
0 |
|
数据库系统实现 |
0 |
0 |
0 |
0 |
|
概率统计 |
0 |
1 |
0 |
1 |
|
GRE 词汇手册 |
0 |
0 |
0 |
1 |
如果把书的那一行看成一个向量,有啥发现没?对了,我们可以找相似的人,我们还可以找相似的书!!!
这也就是Amazon的item-to-item协同过滤系统。
很多时候,创新就是这么简单,写paper就是这么容易啊 ,换个方向思考 (呃,那位童鞋,不是叫你把书拿反了看)。
下面简单描述一下方法。
我们可以先算出任意两个物品之间的相似度(跟上面类似啊,自己算)。
接下开我们看到小明买了《计算机网络》和《人工智能》的书,把跟这两本书类似的书推荐给小明。
跟《计算机网络》最相似的是 《算法导论》和 《人工智能》,跟 《人工智能》最相似的是 《计算机网络》和 《算法导论》。
最后的结果,是《算法导论》^_^。
用这个方法呢,我们就可以给用户推荐说,买了这个商品的用户还购买了***
那这方法是不是有什么优点呢?(废话啊,不然Amazon会拿来用,商人是很聪明的)
Tradition VS Amazon
Amazon的CF算法可以在离线的情况下把item之间的相似度计算好。当一个用户登陆后,我们需要的也只是检查用户的购买历史,然后把跟这些item相似的item按一定的方法(比如受欢迎程度)排序展现给用户。一般来说,用户购买的东西只是一个小的集合,因此不需要花很多的时间来计算。
而且,如果用户没有登陆,我们依然可以根据他的浏览历史来做推荐。例如,上面的图片就是我在没有登陆的情况下查看了一下《Beautiful Architecture》,然后Amazon给我做了推荐。
对于Amazon这样的网站来说,用户量是远远大于商品数量的。因此,Amazon的CF算法(计算商品相似度)比起传统的CF算法(计算用户相似度),大大地节约了资源。
对于一个未登陆的用户来说,传统的CF算法没办法根据他的浏览历史来推荐(在线计算一个用户跟其他所有用户的相似度显然不可能)。
Amazon的推荐系统的更多相关文章
- Mahout构建图书推荐系统【一起学Mahout】
阅读导读: 1.Mahout中推荐过滤算法支持哪两种算法? 2.用java代码怎样计算男性用户打分过的图书? 3.itemEuclidean.userEuclideanNoPref各自是什么算法? 1 ...
- 推荐系统第3周--- 大数据环境下的itemCF实现
代码报错注意事项: 1:最后Ctrl+shift+O 导入包2:导入mahout包3:新建datafile文件包,在其下面新建csv文件
- 项目实战:Mahout构建图书推荐系统
前言 本文是Mahout实现推荐系统的又一案例,用Mahout构建图书推荐系统.与之前的两篇文章,思路上面类似,侧重点在于图书的属性如何利用.本文的数据在自于Amazon网站,由爬虫抓取获得. 目录 ...
- 转】Mahout构建图书推荐系统
原博文出自于: http://blog.fens.me/hadoop-mahout-recommend-book/ 感谢! Mahout构建图书推荐系统 Hadoop家族系列文章,主要介绍Hadoop ...
- data mining,machine learning,AI,data science,data science,business analytics
数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么? 数据科学(data science)和商业分析(business analytics ...
- 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么? 数据科学(data science)和商业分析(business analytics)之间有什么关系?
本来我以为不需要解释这个问题的,到底数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)有什么区别,但是前几天因为有个学弟问我,我想了想发现我竟然也回答 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- 机器学习系列(17)_Yelper推荐系统
1. 我们为什么需要推荐系统?“推荐”可是个当红话题.Netflix愿意用百万美金召求最佳的电影推荐算法,Facebook也为了登陆时的推荐服务开发了上百个项目,遑论现在市场上各式各样的应用都需要个 ...
- Netflix公布个性化和推荐系统架构
Netflix的推荐和个性化功能向来精准,前不久,他们公布了自己在这方面的系统架构. 3月27日,Netflix的工程师Xavier Amatrain和Justin Basilico在官方博客发布文章 ...
随机推荐
- JavaWeb---设置content-disposition响应头,让浏览器下载文件
package com.zyz; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet ...
- Sublime text 3 中Package Control 的安装与使用方法和解决Sublime Text 3不能正确显示中文的问题
Sublime text 3 中Package Control 的安装与使用方法,英文好可以在这个网址看看, 下面简单的说明一下 : https://packagecontrol.io/install ...
- C# 对Access数据库操作的通用类
(转载自博主Jerry很简单) //Access数据库-C# 操作类 代码using System;using System.Collections.Generic;using System.Linq ...
- perl 引用
数组的数组 $a = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 哈希的哈希 my $student_properties_of = { 'zdd' => { 'ag ...
- css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
原文地址: http://blog.csdn.net/jyy_12/article/details/42557241 px:绝对单位,页面按精确像素展示 em:相对单位,基准点为父节点字体的大小,如果 ...
- 使用yield关键字让自定义集合实现foreach遍历
一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...
- 使用opengl 绘制9个点,理解各个参数的含义
// SimpleTest1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<gl/glut.h> #incl ...
- Daily Scrum 12.15
今日完成任务: 完成关于主页右侧资源显示的算法优化:解决了下载资源时的异常. 遇到困难: 编译课设这周要检查,小组成员的大部分时间在完成编译课设,时间很紧. 明日任务: 孙思权 完成第二组提供的数据库 ...
- angular js 自定义js错误处理(Angularjs js error handler)
使用AngularJS的时候,对JS错误如何自定义处理?(比如用Google Analytics记录angularjs使用中出现的js错误) AngularJS自带一个错误处理service:$exc ...
- 一个login
login 1.获取提交表单,保存到变量中.2.判断用户密码是否正确,利用Model类.3.验证用户是否激活.3.判断用户是否记住登录状态,是的话,将其用cookie和session分别保存.没有的话 ...