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实现基于用户的协同过滤算法的更多相关文章

  1. 案例:Spark基于用户的协同过滤算法

    https://mp.weixin.qq.com/s?__biz=MzA3MDY0NTMxOQ==&mid=2247484291&idx=1&sn=4599b4e31c2190 ...

  2. 基于用户的协同过滤的电影推荐算法(tensorflow)

    数据集: https://grouplens.org/datasets/movielens/ ml-latest-small 协同过滤算法理论基础 https://blog.csdn.net/u012 ...

  3. 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

    好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了.硬生生是拖到了十一假期.自己也是醉了... 找工作不是非常顺利,希望写点东西回想一下知识.然后再攒点人品吧,仅仅 ...

  4. Spark 基于物品的协同过滤算法实现

    J由于 Spark MLlib 中协同过滤算法只提供了基于模型的协同过滤算法,在网上也没有找到有很好的实现,所以尝试自己实现基于物品的协同过滤算法(使用余弦相似度距离) 算法介绍 基于物品的协同过滤算 ...

  5. 基于物品的协同过滤算法(ItemCF)

    最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...

  6. 推荐召回--基于用户的协同过滤UserCF

    目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...

  7. 基于用户的协同过滤电影推荐user-CF python

    协同过滤包括基于物品的协同过滤和基于用户的协同过滤,本文基于电影评分数据做基于用户的推荐 主要做三个部分:1.读取数据:2.构建用户与用户的相似度矩阵:3.进行推荐: 查看数据u.data 主要用到前 ...

  8. (数据挖掘-入门-3)基于用户的协同过滤之k近邻

    主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...

  9. 基于用户的协同过滤(UserCF)

随机推荐

  1. HTML——图片自动轮换和手动轮换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. java资料——顺序存储结构和链式存储结构(转)

    顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺    点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...

  3. ansible debug模块学习笔记

    - name: Print debug infomation eg hosts: test2 gather_facts: F tasks: - name: Command run line shell ...

  4. umount 强制卸载

    umount -lf /mnt  强制卸载文件 -f     Force unmount (in case of an unreachable NFS system).  (Requires kern ...

  5. java-servlet的url-pattern匹配规则详细描述

    http://www.cnblogs.com/51kata/p/5152400.html http://www.cnblogs.com/canger/p/6084846.html 一.概述 在利用se ...

  6. 关于矢量图片资源向后兼容:CompatVectorFromResourcesEnabled标志的使用

    StackOverflow上摘抄的: some things have changed since I asked this question so I will answer it myself.W ...

  7. Unity中的Transform Gizmo中的Pivot和Center

    选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...

  8. CentOS查看登录用户以及踢出用户

    查看登录用户,使用w命令 [root@lnmp ~]# w 18:51:18 up 35 min,  2 users,  load average: 0.00, 0.00, 0.00 USER     ...

  9. c++ list 合并list

    1.参考 http://www.cplusplus.com/reference/list/list/ 2.合并 主要有两个函数:splice()和merge()splice()有三种调用形式:第一种: ...

  10. Ubuntu:为 Firefox 浏览器 安装 flash 插件

    从adobe上下载浏览器flashplayer插件:推荐 x.tar.gz格式的——通用格式. 解压tar.gz后可以得到:libflashplayer.so 文件 将 libflashplayer. ...