【Machine Learning】Mahout基于协同过滤(CF)的用户推荐
来源:互联网 发布:阿里云lnmp一键安装包 编辑:程序博客网 时间:2024/05/16 07:20
一、Mahout推荐算法简介
Mahout算法框架自带的推荐器有下面这些:
l GenericUserBasedRecommender:基于用户的推荐器,用户数量少时速度快;
l GenericItemBasedRecommender:基于商品推荐器,商品数量少时速度快,尤其当外部提供了商品相似度数据后效率更好;
l SlopeOneRecommender:基于slope-one算法的推荐器,在线推荐或更新较快,需要事先大量预处理运算,物品数量少时较好;
l SVDRecommender:奇异值分解,推荐效果较好,但之前需要大量预处理运算;
l KnnRecommender:基于k近邻算法(KNN),适合于物品数量较小时;
l TreeClusteringRecommender:基于聚类的推荐器,在线推荐较快,之前需要大量预处理运算,用户数量较少时效果好;
Mahout最常用的三个推荐器是上述的前三个,本文的实例仅“基于用户的推荐器”做个实验,其实大体原理都差不多。
二、基于协同过滤(CF)模型的用户推荐
Mahout里自带的基本CF模型原理如下:
GenericUserBasedRecommender是基于用户(user-based)的简单推荐器实现类,推荐主要参照传入的DataModel和UserNeighborhood,总体是三个步骤:
(1)从UserNeighborhood获取当前用户Ui最相似的K个用户集合{U1, U2, …Uk};
(2)从这K个用户集合排除Ui的偏好商品,剩下的Item集合为{Item0, Item1, …Itemm};
(3)对Item集合里每个Itemj计算Ui可能偏好程度值pref(Ui, Itemj),并把Item按此数值从高到低排序,前N个item推荐给用户Ui。
偏好程度值pref计算公式:三、数据库结构设计
创建数据库mahoutDB,里面创建表table1,具体表的结构如下所示,里面包含4个特征:userId,itemId, preference, date,分别代表用户ID、商品ID、偏好分数、交易日期。
建好table1之后,表结构如下所示。
往table1里导入事先准备好的数据data.txt,
mysql>LOAD DATA LOCAL INFILE ‘data.txt’ INTO TABLE table1;
导入完成过后数据如下所示。
用户ID为1的记录如下所示。
交易日期为20140825的记录如下所示。
当中有一条记录,比如用户ID=2的选择了商品202,偏好值为3.5。那么之后应根据模型算法,将相似用户找出,并把相似用户的偏好商品(排除userId=2他自己所选商品)推荐给用户2。
四、源码
import java.util.List;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.model.JDBCDataModel;import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;import org.apache.mahout.cf.taste.recommender.RecommendedItem;import org.apache.mahout.cf.taste.similarity.UserSimilarity;import com.mysql.MysqlDataSource;/** * mahout基于协同过滤(CF)的推荐 * */public class Mahout {public static void main(String[] args) throws TasteException {//(1)----连接数据库部分MysqlDataSource dataSource = new MysqlDataSource();dataSource.setServerName("localhost");dataSource.setUser("admin");dataSource.setPassword("admin");dataSource.setDatabaseName("mahoutDB");//(2)----使用MySQLJDBCDataModel数据源读取MySQL里的数据JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "table1", "userId", "itemId", "preference", "date");//(3)----数据模型部分 //把MySQLJDBCDataModel对象赋值给DataModelDataModel model = dataModel;//用户相似度UserSimilarity:包含相似性度量和邻居参数UserSimilarity similarity = new PearsonCorrelationSimilarity(model);//相邻用户UserNeighborhoodUserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);//一旦确定相邻用户,一个普通的user-based推荐器被构建,构建一个GenericUserBasedRecommender推荐器需要数据源DataModel,用户相似性UserSimilarity,相邻用户相似度UserNeighborhoodRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);//向用户1推荐2个商品List<RecommandedItem> recommendations = recommender.recommend(1, 2);for(RecommendedItem recommendation : recommendations){//输出推荐结果System.out.println(recommendation);}}}
- 【Machine Learning】Mahout基于协同过滤(CF)的用户推荐
- 基于用户协同过滤(User-CF)的推荐算法
- mahout基于用户的协同过滤-userCF
- Mahout系列之推荐算法-基于用户协同过滤
- 推荐引擎之Mahout 基于用户协同过滤算法的使用
- R全面解析Mahout的基于用户推荐协同过滤算
- 基于用户的协同过滤推荐算法
- 基于用户的协同过滤推荐算法
- 基于用户的协同过滤推荐
- 基于用户的协同过滤推荐模型
- 基于 Apache Mahout 实现高效的协同过滤推荐
- **基于 Apache Mahout 实现高效的协同过滤推荐电影**
- 基于用户的协同过滤(user-based CF)推荐系统【1】
- 基于用户的协同过滤(user-based CF)推荐系统【2】
- Mahout实现基于用户的协同过滤算法
- Mahout协同过滤推荐
- 基于用户的协同过滤推荐—实现电影推荐
- 协同过滤推荐(CF)
- C语言中exit(0)与exit(1)有什么区别
- wince 编写服务程序
- Mina框架与Spring整合配置文件
- C/C++中判断某一文件或目录是否存在
- documentsUI下载列表点击事件流程
- 【Machine Learning】Mahout基于协同过滤(CF)的用户推荐
- 获取应用和安装手机相关信息:应用版本号,手机型号,手机品牌,Android系统版本号
- IOS中获取各种文件的目录路径的方法
- linux基础命令---ps -ef/ps -aux
- systemctl命令
- Using GRE Tunnels with Open vSwitch
- 不知道属性名称,动态遍历json中的所有键值对
- SQL语句Left join 中On和Where的用法区别 .
- Resizing a Form to Fit an Image