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/

时间: 2024-08-02 23:12:20

Mahout实现基于用户的协同过滤算法的相关文章

基于用户的协同过滤算法(UserCF)

基于用户的协同过滤算法: 找到和目标用户相似的用户集合 找到这个集合中用户喜欢的但目标用户没有听过的物品 #encoding: utf-8 from Similarity import Person from Sort import select_sort file=open('user_bookmark','r') filew=open('user_bookRecommend','w') #加载训练集 trainSet={} while True: line=file.readline().s

基于用户的协同过滤算法

基于用户的协同过滤算法-参考<推荐系统实践>一书,作者:项亮 1 import random 2 import math 3 class UserBasedCF: 4 def __init__(self,datafile = None): 5 self.datafile = datafile 6 self.readData() 7 self.splitData(3,47) 8 def readData(self,datafile = None): 9 """ 10

推荐算法之基于用户的协同过滤算法

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法. 这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可.所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求

spark基于用户的协同过滤算法与坑点,提交job

承接上文: http://blog.csdn.net/wangqi880/article/details/52875524 对了,每台机子的防火墙要关闭哈,不然spark集群启动不起来 前一次,已经把spark的分布式集群布置好了,今天写一个简单的案例来运行.会写一些关于spark的推荐的东西,这里主要有4点,1基于用户协同过滤,2基于物品协同过滤,3基于模型的协同过滤,4基于关联规则的推荐(fp_growth),只写核心代码啊. 基于spark用户协同过滤算法的实现 1用户协同过滤算法 1.1

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是推荐系统领域最著名的算法. 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人. 基本思想 俗话说"物以类聚.人以群分",拿看电影这个例子来说,如果你喜欢<蝙蝠侠>.<碟中谍>.&l

基于用户的协同过滤推荐算法

什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地. 最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自 己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么肿么办?最典型的例子就是,如果我打开豆瓣找电影,或者我去 买说,我实际上不知道我想要买什么或者看

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用

推荐算法之基于用户的协同过滤

基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF.该算法的诞生一定程度上标志着推荐系统的诞生.本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习. 基本原理 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A.这种方法就称为基于用户的协同过滤算法.该算法主要包括两个步骤: 找到和目标用户兴趣相似的用户集合 找到这个集合中用户喜欢的且目标用户没

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

好早的时候就打算写这篇文章,但是还是参加阿里大数据竞赛的第一季三月份的时候实验就完成了,硬生生是拖到了十一假期,自己也是醉了...找工作不是很顺利,希望写点东西回顾一下知识,然后再攒点人品吧,只能如此了. 一.问题背景 二.基于用户的协同过滤算法介绍 三.数据结构和实验过程设计 四.代码 一.问题背景 首先介绍一下问题的背景,现在我有四个月的用户.品牌数据<user,brand>,即用户在这四个月中的某一天购买了某个品牌(当然为了简化算法模型,将购买时间省去,后面再说).即现在有这四个月的数据