# 基于 Mahout 实现协同过滤推荐算法的电影推荐系统
## 1 Mahout 介绍
Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。
## 2 环境部署
- JDK1.8.0_111
- MySQL
- apache-tomcat-8.5.31
- mahout-0.3
- Eclipse 8.0
## 3 工程开发
### 3.1 推荐引擎简介
推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。
根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类:
基于内容的推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容的推荐引擎就会给你推荐一些热门的历史方面的书籍。
基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。
基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。
混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。
### 3.2 Taste 简介
Taste 是 Apache Mahout 提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste 不仅仅只适用于 Java 应用程序,它可以作为内部服务器的一个组件以 HTTP 和 Web Service 的形式向外界提供推荐的逻辑。
### 3.3 Taste 的工作原理
Taste 由以下五个主要的组件组成:
DataModel:DataModel 是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息。Taste 默认提供 JDBCDataModel 和 FileDataModel,分别支持从数据库和文件中读取用户的喜好信息。
UserSimilarity 和 ItemSimilarity:UserSimilarity 用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的“邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。ItemSimilarity 类似的,计算内容之间的相似度。
UserNeighborhood:用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的“邻居用户”的方式产生的。UserNeighborhood 定义了确定邻居用户的方法,具体实现一般是基于 UserSimilarity 计算得到的。
Recommender:Recommender 是推荐引擎的抽象接口,Taste 中的核心组件。程序中,为它提供一个 DataModel,它可以计算出对不同用户的推荐内容。Recommender 是 Taste 中的核心组件,它可以根据提供的数据模型计算出对不同用户的推荐结果。其中包含的子类可以从内存中缓存其他的推荐结果,因此在低内存情况下可以通过让 Java 虚拟机取回推荐的结果再输出。在 Recommender 组件里包含的推荐方法一般会将结果储存在 List 中,另外 estimatePreference()方法还能预估用户对物品的评分。
![](https://www.writebug.com/myres/static/uploads/2021/11/21/aa1ddb016244d365bd9dd4ad0c6b6f7d.writebug)
### 3.4 基于 Taste 构建电影推荐引擎
#### 3.4.1 数据下载
本工程所用到的数据来源于此处:[http://www.grouplens.org/node/12](http://www.grouplens.org/node/12),下载数据“MovieLens 1M - Consists of 1 million ratings from 6000 users on 4000 movies.”
这个数据文件夹下有三个文件:movies.dat,ratings.dat 和 users.dat,数据形式如下三个图所示
![](https://www.writebug.com/myres/static/uploads/2021/11/21/47b1cb701c1af641c39301224ea8026b.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/21/0a63479062047291b68635bd84293f8d.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/21/e15031e0f8865764f15bdbe4df30cf61.writebug)
movies.dat 的文件描述是 电影编号::电影名::电影类别
ratings.dat 的文件描述是 用户编号::电影编号::电影评分::时间戳
users.dat 的文件描述是 用户编号::性别::年龄::职业::Zip-code
这些文件包含来自 6040 个 MovieLens 用户在 2000 年对约 3900 部电影的 1000209 个匿名评分信息。
#### 3.4.2 构造数据库
构建推荐引擎,可以直接使用 movie.dat 文件作为数据源,也可以使用数据库中的数据作为数据源,本实验中,这两种方式都实现了,所以下面介绍利用 dat 文件建立数据库。
构建数据库的 SQL 语句如下:
```sql
CREATE DATABASE movie;
USE movie;
CREATE TABLE movies ( // 保存电影相关的信息。
id INTEGER NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
published_year varchar(4) default NULL,
type varchar(100) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE movie_preferences ( // 保存用户对电影的评分,即喜好程度
userID INTEGER NOT NULL,
movieID INTEGER NOT NULL,
preference INTEGER NOT NULL DEFAULT 0,
timestamp INTEGER not null default 0,
FOREIGN KEY (movieID) REFERENCES movies(id) ON DELETE CASCADE
);
```
Movie:表示电影,包含电影的基本信息:编号、名称、发布时间、类型等等。
Movie Reference:表示某个用户对某个电影的喜好程度,包含用户编号、电影编号、用户的评分以及评分的时间。
至于如何将 dat 文件中的内容导入到 MySQL 数据库中,分别由本工程目录文件下的 ImportMovies.java 和 ImportRatings.java 文件实现。
MySQL 数据库中的数据如下图:
![](https://www.writebug.com/myres/static/uploads/2021/11/21/c0eaf077319936f62dabbe65c0295e9e.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/21/16ab059321f43d016d3d208e59488987.writebug)
#### 3.4.3 推荐引擎实现
在本推荐系统中,我实现了三种方式的推荐引擎:基于用户相似度的推荐引擎,基于内容相似度的推荐引擎,以及基于 Slope One 的推荐引擎。在这些推荐引擎中,我分别使用了三种 DataModel,即 Database-based DataModel,File-based DataModel 和 In-memory DataModel。
##### 1.基于用户相似度的推荐引擎
```java
public class MyUserBasedRecommender {
public List<RecommendedItem> userBasedRecommender(long userID,int size) {
// step:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎
List<RecommendedItem> recommendations = null;
try {
DataModel model = MyDataModel.myDataModel();//构造数据模型
UserSimilarity similarity=new PearsonCorrelationSimilarity(model,Weighting.WEIGHTED);//用PearsonCorrelation 算法计算用户相似度
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, model);//计算用户的“邻居”,这里将与该用户最近距离为 3 �
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。
资源推荐
资源详情
资源评论
收起资源包目录
100011130-基于 Java(Mahout)+MySQL 实现协同过滤推荐算法的电影推荐系统.zip (63个子文件)
movierecommend
.classpath 13KB
slope1.png 340KB
.settings
com.genuitec.eclipse.migration.prefs 374B
org.eclipse.jdt.core.prefs 357B
org.eclipse.core.resources.prefs 230B
.jsdtscope 555B
org.eclipse.wst.common.component 556B
org.eclipse.wst.common.project.facet.core.xml 346B
data.zip 11.16MB
user1.png 331KB
src
META-INF
MANIFEST.MF 37B
com
rcd
im
info
DBUtil.java 816B
ImportMovies.java 2KB
StringUtil.java 404B
ImportRatings.java 2KB
servlet
RecomendServlet.java 2KB
model
DataBaseUtil.java 2KB
MyDataModel.java 1KB
recommender
RecommenderIntro.java 4KB
MyUserBasedRecommender.java 2KB
MySlopeOneRecommender.java 1KB
MyItemBasedRecommender.java 1KB
GetMovieInfo.java 3KB
javabean
MovieInfo.java 700B
Rating.java 644B
Movie.java 2KB
conn
ConnectToMySQL.java 415B
LICENSE 1KB
item1.png 319KB
WebRoot
WEB-INF
classes
META-INF
MANIFEST.MF 37B
com
rcd
im
info
ImportRatings.class 3KB
StringUtil.class 1KB
ImportMovies.class 4KB
DBUtil.class 1KB
servlet
RecomendServlet.class 3KB
model
GetMovieInfo.class 4KB
DataBaseUtil.class 2KB
MyDataModel.class 1KB
recommender
MySlopeOneRecommender.class 2KB
MyUserBasedRecommender.class 2KB
MyItemBasedRecommender.class 2KB
RecommenderIntro.class 4KB
javabean
Movie.class 3KB
Rating.class 1KB
MovieInfo.class 1KB
conn
ConnectToMySQL.class 929B
web.xml 957B
index.jsp 1KB
image
p2969.jpg 414KB
MANIFEST.MF 36B
js
jquery.backstretch.js 12KB
jquery-1.11.1.js 276KB
jquery.backstretch.min.js 4KB
jquery-1.11.1.min.js 94KB
placeholder.js 120B
scripts.js 709B
movielens
users.dat 131KB
ratings.dat 23.45MB
movies.dat 167KB
recommendResult.jsp 2KB
desktop.ini 42B
.project 2KB
README.md 18KB
共 63 条
- 1
资源评论
神仙别闹
- 粉丝: 2667
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功