java电影推荐系统_基于Mahout的电影推荐系统

1.Mahout 简介

Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 的最近版本中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。

2.Taste简介

Taste 是 Apache Mahout 提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste 不仅仅只适用于 Java 应用程序,它可以作为内部服务器的一个组件以 HTTP 和 Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。

图 1. Taste 的主要组件图

0f6f5fbec168d53b902d87519f1f36e3.gif

Taste 由以下五个主要的组件组成:

DataModel:DataModel 是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息。Taste 默认提供 JDBCDataModel 和 FileDataModel,分别支持从数据库和文件中读取用户的喜好信息。

UserSimilarity 和 ItemSimilarity:UserSimilarity 用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的“邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。ItemSimilarity 类似的,计算内容之间的相似度。

UserNeighborhood:用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的“邻居用户”的方式产生的。UserNeighborhood 定义了确定邻居用户的方法,具体实现一般是基于 UserSimilarity 计算得到的。

Recommender:Recommender 是推荐引擎的抽象接口,Taste 中的核心组件。程序中,为它提供一个 DataModel,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类 GenericUserBasedRecommender 或者 GenericItemBasedRecommender,分别实现基于用户相似度的推荐引擎或者基于内容的推荐引擎。

3.系统介绍

(2)准备工作:

环境:jdk,mysql,mahout-0.5,eclipse;

数据集:MovieLens 1M - Consists of 1 million ratings from 6000 users on 4000 movies.   数据集链接:http://www.grouplens.org/node/12

数据集说明:

These files contain 1,000,209 anonymous ratings of approximately 3,900 movies

made by 6,040 MovieLens users who joined MovieLens in 2000.

5b5d53cfc6b8516ec166c7100361bea1.png

movies.dat的文件描述是 电影编号::电影名::电影类别

ratings.dat的文件描述是 用户编号::电影编号::电影评分::时间戳

users.dat的文件描述是 用户编号::性别::年龄::职业::Zip-code

(3)实施:

数据库录入:将数据集导入mysql

1 CREATE DATABASEmovie;2 USEmovie;3 CREATE TABLE movies ( //对应movies.dat4 id INTEGER NOT NULLAUTO_INCREMENT,5 name varchar(100) NOT NULL,6 published_year varchar(4) default NULL,7 type varchar(100) default NULL,8 PRIMARY KEY(id)9 );10 CREATE TABLE movie_preferences ( //对应ratings.dat11 userID INTEGER NOT NULL,12 movieID INTEGER NOT NULL,13 preference INTEGER NOT NULL DEFAULT 0,14 timestamp INTEGER not null default 0,15 FOREIGN KEY (movieID) REFERENCES movies(id) ON DELETE CASCADE

16 );

9a6a089c325f4971c6863ca4426fa3b9.png

1384eee144eb230912066b24f874f829.png

推荐算法介绍:

基于用户的协同过滤推荐

基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K-       邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐。下图 4 给出了原理图。

基于用户的协同过滤推荐机制的基本原理

c2046bb558d20a7787b5ba9eeaf4ed4c.png

上图示意出基于用户的协同过滤推荐机制的基本原理,假设用户 A 喜欢物品 A,物品 C,用户 B 喜欢物品 B,用户 C 喜欢物品 A ,物品 C 和物品 D;从             这些用户的历史喜好信息中,我们可以发现用户 A 和用户 C 的口味和偏好是比较类似的,同时用户 C 还喜欢物品 D,那么我们可以推断用户 A 可能也喜欢              物品 D,因此可以将物品 D 推荐给用户 A。

基于项目的协同过滤推荐

基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好               信息,将类似的物品推荐给用户,图 5 很好的诠释了它的基本原理。

假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 A,物品 B 和物品 C,用户 C 喜欢物品 A,从这些用户的历史喜好可以分析出物品 A 和物品 C 时比             较类似的,喜欢物品 A 的人都喜欢物品 C,基于这个数据可以推断用户 C 很有可能也喜欢物品 C,所以系统会将物品 C 推荐给用户 C。

与上面讲的类似,基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好               推断,而后者是基于物品本身的属性特征信息。

基于项目的协同过滤推荐机制的基本原理

d87fb69cb0886584977a62c3f755a480.png

核心算法代码展示:

import org.apache.mahout.cf.taste.impl.model.file.*;//FileDataModel

import org.apache.mahout.cf.taste.model.*;//DAtaModel

import org.apache.mahout.cf.taste.impl.neighborhood.*;import org.apache.mahout.cf.taste.impl.recommender.*;import org.apache.mahout.cf.taste.impl.similarity.*;import org.apache.mahout.cf.taste.neighborhood.*;import org.apache.mahout.cf.taste.similarity.*;import org.apache.mahout.cf.taste.recommender.*;import java.io.*;import java.util.*;public classRecommendDeal{intuserID;intlength;public RecommendDeal(intuserID){this.userID=userID;

}//*******************基于用户的推荐********************

public ListuserBasedRecommender() {//step:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎

List recommendations = null;try{

length=(int)((Math.random()+3)*10);

DataModel model= new FileDataModel(new File("D:\\ratings.txt"));//构造数据模型,Database-based

UserSimilarity similarity = new PearsonCorrelationSimilarity(model);//用PearsonCorrelation 算法计算用户相似度

UserNeighborhood neighborhood = new NearestNUserNeighborhood(length, similarity, model);//计算用户的“邻居”,这里将与该用户最近距离为 3 的用户设置为该用户的“邻居”。

Recommender recommender = new CachingRecommender(new GenericUserBasedRecommender(model, neighborhood, similarity));//构造推荐引擎,采用 CachingRecommender 为 RecommendationItem 进行缓存

recommendations = recommender.recommend(this.userID, 20);//得到推荐的结果,20是推荐的数目

} catch(Exception e) {//TODO: handle exception

e.printStackTrace();

}returnrecommendations;

}//**********************基于项目的推荐*******************

public ListItemBasedRecommender(){

List recommendations = null;

length=(int)((Math.random()+1)*10);try{

DataModel model= new FileDataModel(new File("D:\\ratings.txt"));//构造数据模型,File-based

ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);//计算内容相似度

Recommender recommender = new GenericItemBasedRecommender(model, similarity);//构造推荐引擎

recommendations = recommender.recommend(this.userID, length);//得到推荐接过

} catch(Exception e) {//TODO: handle exception

e.printStackTrace();

}returnrecommendations;

}

}

读入文件说明:由于数据量比较大,100W条,通过数据库读数据太慢,采用从文件中直接读取,(也许是我电脑的问题)我的文件是ratings.txt

8b3911b00d4bb7b895507d2aa8734796.png通过推荐算法得出结果后,从数据库查出对应信息,显示在前台。

项目截图:

1>框架图:只用了链接mysql的包,和mahout的包,无其他包,如图

1fdf32f5da03dc9e3b1a71e8513029ad.png

2>效果图:

login

1b575af9e617ea2b29b0296d9ad0f56d.png

登录后选择,点直接推荐是基于用户的,点随便看看是基于项目的

010e91eedd5e554d71a31bfbef9be325.png

点击系统推荐,直接出结果:

8370297f403cec0573057e699ec25b45.png

e15c102b83004cbbb5d70d8041a47a61.png

点击随便看看,展示部分电影,通过链接,显示电影详情,并实现项目推荐

74277f3d493033a7278d6f5ee67d2581.png

这里只推荐了5个,根据需要推荐的条数可以调整

9dd6ef0d1ea4acc679af63005f445d3a.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目完整可用,配合压缩包内数据库可直接运行使用。 eclipse+mysql5.7+jdk1.8 功能:推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。 根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类: • 基于内容的推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容的推荐引擎就会给你推荐一些热门的历史方面的书籍。 • 基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。 • 基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。 • 混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值