Mahout实现基于用户的协同过滤算法
Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法。
基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐。
程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中。
package com.mahout.helloworlddemo; import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashSet;
import java.util.List; import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
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.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity; import com.mahout.util.DBUtil;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; /**
*
*@author wxisme
*@time 2015-9-13 下午6:25:26
*/
public class RecommenderIntroFromMySQL { public static void main(String[] args) throws Exception { //连接MySQL
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");
dataSource.setUser("root");
dataSource.setPassword("1234");
dataSource.setDatabaseName("mahoutdemo"); //获取数据模型
JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "taste_preferences", "user_id", "item_id", "preference","time"); DataModel model = dataModel; //计算相似度
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
//计算阈值
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,similarity,model); //推荐
Recommender recommender = new GenericUserBasedRecommender(model,neighborhood,similarity); Connection con = DBUtil.getConnection();
Statement stmt = con.createStatement(); //获取每个用户的推荐数据并存入数据库 for(int i=0; i<5; i++) {
List<RecommendedItem> recommendations = recommender.recommend(i, 3); String tableName = "user_" + i; for (RecommendedItem recommendation : recommendations) { //如果是第一次推荐就创建该用户的数据表
if(!doesTableExist(tableName)) { String createSQL = "create table " + tableName
+ " (item_id bigint primary key,value float);";
stmt.execute(createSQL);
} String insertSQL = "insert into " + tableName + " values ("
+ recommendation.getItemID() + "," + recommendation.getValue() + " );"; //插入用户的推荐数据
stmt.execute(insertSQL); System.out.println(recommendation);
}
} } /**
* 是否存在这个数据表
* @param tablename
* @return
* @throws SQLException
*/
public static Boolean doesTableExist(String tablename) throws SQLException {
HashSet<String> set = new HashSet<String>();
Connection con = DBUtil.getConnection();
DatabaseMetaData meta = con.getMetaData();
ResultSet res = meta.getTables(null, null, null,
new String[]{"TABLE"});
while (res.next()) {
set.add(res.getString("TABLE_NAME"));
}
DBUtil.close(res, con);
return set.contains(tablename);
} }
测试数据:
1,101,5
1,102,3
1,103,2.5
2,101,2
2,102,2.5
2,103,5
2,104,2
3,101,2.5
3,104,4
3,105,4.5
3,107,5
4,101,5
4,103,3
4,104,4.5
4,106,4
5,101,4
5,102,3
5,103,2
5,104,4
5,105,3.5
5,106,4
运行结果:

更多Mahout和协同过滤算法的介绍与分析:
http://www.cnblogs.com/dlts26/archive/2011/08/23/2150225.html
http://www.tuicool.com/articles/FzmQziz
http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/
Mahout实现基于用户的协同过滤算法的更多相关文章
- 案例:Spark基于用户的协同过滤算法
https://mp.weixin.qq.com/s?__biz=MzA3MDY0NTMxOQ==&mid=2247484291&idx=1&sn=4599b4e31c2190 ...
- 基于用户的协同过滤的电影推荐算法(tensorflow)
数据集: https://grouplens.org/datasets/movielens/ ml-latest-small 协同过滤算法理论基础 https://blog.csdn.net/u012 ...
- 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)
好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了.硬生生是拖到了十一假期.自己也是醉了... 找工作不是非常顺利,希望写点东西回想一下知识.然后再攒点人品吧,仅仅 ...
- Spark 基于物品的协同过滤算法实现
J由于 Spark MLlib 中协同过滤算法只提供了基于模型的协同过滤算法,在网上也没有找到有很好的实现,所以尝试自己实现基于物品的协同过滤算法(使用余弦相似度距离) 算法介绍 基于物品的协同过滤算 ...
- 基于物品的协同过滤算法(ItemCF)
最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...
- 推荐召回--基于用户的协同过滤UserCF
目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...
- 基于用户的协同过滤电影推荐user-CF python
协同过滤包括基于物品的协同过滤和基于用户的协同过滤,本文基于电影评分数据做基于用户的推荐 主要做三个部分:1.读取数据:2.构建用户与用户的相似度矩阵:3.进行推荐: 查看数据u.data 主要用到前 ...
- (数据挖掘-入门-3)基于用户的协同过滤之k近邻
主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...
- 基于用户的协同过滤(UserCF)
随机推荐
- invalid conversion from 'void* (*)()' to 'void* (*)(void*)'
void *thread1() ], NULL, thread1, NULL)) != ) 提示:invalid conversion from 'void* (*)()' to 'void* (*) ...
- Missing artifact jdk.tools:jdk.tools:jar:1.8 pom.xml
在maven项目中出现下面错误信息: Description Resource Path Location Type Missing artifact jdk.tools:jdk.tools:jar: ...
- Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序
Part1 环境搭建和工具安装 1.1 设置交叉编译环境 安装相关的编译工具: sudo apt-get install build-essential gcc-arm-linux-gnueabi 这 ...
- Android基础工具类重构系列一Toast
前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...
- Linq中的ToList()和CopyToDataTable()
最近在项目中使用了Linq,想把Linq的查询结果直接转换成DataTable对象,通过查找发现Linq有一个CopyToDataTable<T>的泛型方法,该方法只能在T是DataRow ...
- zend opcache的最佳设置
2016-01-21 在网上无意中看到的一篇文章,这哥们非常简洁地谈论了zend opcache的最佳设置,他说他为此花了大量的时间探索zend opcache的每个设置选项的细节,甚至是阅读它的源代 ...
- 可能是目前最完整的前端框架 Vue.js 全面介绍
Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架. 摘要 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angul ...
- Windoows窗口程序四
子窗口的创建 .创建时要设置父窗口句柄 .创建风格要增加WS_CHILD|WS_VISIBLE HWND CreateChild(LPSTR lpClassName,LPSTR lpWndName,H ...
- openfire User Service 和删除分组的方法
z4PstKlN 服务器-> 系统属性 plugin.userservice.enabled 值为 true 增加用户 9090/plugins/userService/userservice? ...
- Spring 4 官方文档学习(十)数据访问之OXM
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...
