# 基于 Mahout 的电影推荐系统
## 1 Mahout 介绍
Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。
## 2 环境部署
- Ubuntu
- JDK1.6.0_21
- MySQL
- apache-tomcat-6.0.35
- mahout-0.3
- MyEclipse 8.0
### 2.1 JDK1.6.0_21 的安装
JDK 的下载地址:[http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 我所用的版本是 jdk-6u21-linux-i586.bin。
安装步骤:
1.打开终端,进入放置 JDK 安装文件的目录 cd /home/huhui/develop
![](https://www.writebug.com/myres/static/uploads/2021/12/6/175d7429ee8c854db66e7737e7237977.writebug)
2.更改文件权限为可执行 chmod +x jdk-6u21-linux-i586.bin
![](https://www.writebug.com/myres/static/uploads/2021/12/6/13e650642781b01416a34b96e287e3ac.writebug)
3.执行该文件,执行命令./jdk-6u21-linux-i586.bin
![](https://www.writebug.com/myres/static/uploads/2021/12/6/bdaa113438d53e80f876287327d7b135.writebug)
JDK 自动安装到/home/huhui/develop/jdk1.6.0_21 目录下。这个目录下,在终端输入 Java -version 可以看到 JDK 的版本信息:
![](https://www.writebug.com/myres/static/uploads/2021/12/6/6bad96e093418bbdca33a59dfcf6b3a0.writebug)
4.安装完 JDK 之后,接下来需要配置环境变量,在终端中输入命令 sudo gedit /etc/profile,此时会弹出如下对话框:
![](https://www.writebug.com/myres/static/uploads/2021/12/6/0f4cf29873f6f7b44b74c6c8ccae676b.writebug)
在这个文档的末尾加入如下信息:
\#set Java environment
JAVA_HOME=/home/huhui/develop/jdk1.6.0_21
export JRE_HOME=/home/huhui/develop/jdk1.6.0_21/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
保存并关闭文件,至此,JDK 的安装与配置就完成了。
### 2.2 MySQL 的安装
MySQL 的安装过程比较简单,在终端输入 sudo apt-get install mysql-server my-client 即可:
![](https://www.writebug.com/myres/static/uploads/2021/12/6/febeebdd34d70b1044f9fd3b4378381f.writebug)
到这里,要求用户输入 Y 或者 N,此时选择 Y,会弹出一个界面,要求输入 MySQL 的 root 的密码,这里一定输入,省得安装后再设密码了。
我习惯与使用可视化工具来操作 MySQL 数据库,于是我又安装了“MySQL Administrator”软件,这个是数据库管理软件,运行如下图所示:
![](https://www.writebug.com/myres/static/uploads/2021/12/6/68008d2eb3864add7f34014a95e29ab0.writebug)
### 2.3 Tomcat 的安装
软件下载地址:[http://archive.apache.org/dist/tomcat/tomcat-6/](http://archive.apache.org/dist/tomcat/tomcat-6/) 我下载的版本是 apache-tomcat-6.0.35.tar.gz
**1.解压文件**
复制安装文件到 hom/huhui/develop 目录下,在终端输入 sudo tar -zxvf apache-tomcat-6.0.35.tar.gz,将安装包解压至 apache-tomcat-6.0.35 目录下
**2.配置 startup.sh 文件**
在终端输入 sudo gedit home/huhui/develop/apache-tomcat-6.0.35/bin/startup.sh
在 startup.sh 文件的末尾加入一下内容,加入的内容即为 JDK 的环境变量:
JAVA_HOME=/home/huhui/develop/jdk1.6.0_21
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
TOMCAT_HOME=/home/huhui/develop/apache-tomcat-6.0.35
**3.启动 Tomcat**
进入/usr/local/apache-tomcat-6.0.35/bin/目录,输入 sudo ./startup.sh,若出现下图信息,则说明 Tomcat 安装成功。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/ccef778548e4d828da806c3a5aa115a8.writebug)
此时在浏览器中输入 http://localhost:8080/将出现 Tomcat 的欢迎界面。
### 2.4 Mahout 安装
1.Mahout 可以从 [http://mirror.bit.edu.cn/apache/mahout/](http://mirror.bit.edu.cn/apache/mahout/)下载,我下载的版本是 mahout-0.3.tar.gz
2.将下载下来的压缩文件解压缩,将 lib 文件夹下的 jar 文件全部拷贝出,为以后的工作做准备。doc 目录下的 mahout-core 文件夹下是 mahout 的 API,供开发时查阅。
### 2.5 MyEclipse8.0 安装
MyEclipse 的安装简单,基本和 windows 下安装一样,此处不再赘述。MyEclipse 安装完成之后,将前面安装好的 Tomcat 关联到 MyEclipse 下。
至此,已经完成了对环境的部署,下面进入开发阶段。
## 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,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类 GenericUserBasedRecommender 或者 GenericItemBasedR